k8s:Pod容器共享Volume

容器共享

在同个Pod中的多个容器能够共享Pod的存储卷Volume。Volume可以被定义为各种类型,多个容器各自进行挂载操作,将一个Volume挂载为容器内部需要的目录。

定义Pod的配置文件 pod-volume.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: Pod
metadata:
name: pod-volume
spec:
containers:
- name: tomcat
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: app-logs
mountPath: /usr/local/tomcat/logs
- name: busybox
image: busybox
command: ["sh", "-c" ,"tail -f /logs/catalina*.log"]
volumeMounts:
- name: app-logs
mountPath: /logs
volumes:
- name: app-logs
emptyDir: {}

创建Pod

1
kubectl create -f pod-volume.yaml

查看
这里设置的volume的名称为 app-logs, 类型为emptyDir,挂载到tomcat容器内的 /usr/local/tomcat/logs 目录, 同时挂载到 busybox 容器内的logs 目录。 tomcat容器在启动后会想 /usr/local/tomcat/logs 写文件, busybox 就可以读取目录中的文件了。

1
kubectl logs pod-volume -c busybox

Volume类型

emptyDir

一个emptyDir是在Pod分到Node时创建的。它的初始内容为空,并且无须指定宿主机上对应的目录文件,是K8s自动分配的一个目录。当Pod从Node上移除时,emptyDir的数据也会被永久删除。它的主要用途如下:

  • 临时空间。
  • 长时间任务的中间过程CheckPoint的临时保存目录
  • 一个容器需要从另一个容器获取数据的目录(多容器的共享目录)

hostPath

hostPath为在Pod上挂载宿主机上的文件或目录,它通常可以用于以下几个方面:

  • 容器应用程序生成的日志文件需要永久保存,可以使用宿主机的高速文件系统进行存储
  • 需要访问宿主机上Docker引擎内部数据结构的容器应用,可以通过定义hostPath为宿主机/var/lib/docker目录,使容器内部应用可以直接访问Docker的文件系统。需要注意的时,不同Node上的相同配置的Pod可能会因为宿主机上的目录和文件不同而导致对Volume上目录和文件的访问结果不一致。如果使用了资源配额管理,k8s无法将hostPath在宿主机上使用的资源纳入管理
1
2
3
4
volumes:
- name: persist-storage
hostPath:
path: "/data"

NFS

使用NFS网络类型文件系统提供的共享目录存储数据是,需要在系统中部署NFS server。

1
2
3
4
5
volumes:
- name: nfs
nfs:
server: nfs-server.localhost
path: /