容器中的文件在磁盘上是临时存放的,这给容器中运行的特殊应用程序带来一些问题。首先,当容器崩溃时,kubelet 将重新启动容器,容器中的文件将会丢失,因为容器会以干净的状态重建。其次,当在一个 Pod 中同时运行多个容器时,常常需要在这些容器之间共享文件。 Kubernetes 抽象出 Volume 对象来解决这两个问题。
Kubernetes 卷具有明确的生命周期,与包裹它的 Pod 相同。 因此,卷比 Pod 中运行的任何容器的存活期都长,在容器重新启动时数据也会得到保留。 当然,当一个 Pod 不再存在时,卷也将不再存在。也许更重要的是,Kubernetes 可以支持许多类型的卷,Pod 也能同时使用任意数量的卷。
卷不能挂载到其他卷,也不能与其他卷有硬链接。 Pod 中的每个容器必须独立地指定每个卷的挂载位置。
awsElasticBlockStore 、azureDisk、azureFile、cephfs、cinder、configMap、csi
downwardAPI、emptyDir、fc (fibre channel)、flexVolume、flocker
gcePersistentDisk、gitRepo (deprecated)、glusterfs、hostPath、iscsi、local、
nfs、persistentVolumeClaim、projected、portworxVolume、quobyte、rbd
scaleIO、secret、storageos、vsphereVolume
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷
,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管 Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除。
emptyDir 的使用场景:
默认情况下, emptyDir 卷存储在支持该节点所使用的介质上;这里的介质可以是磁盘或 SSD 或网络存储,这取决于您的环境。 但是,您可以将 emptyDir.medium
字段设置为 “Memory
”,以告诉 Kubernetes 为您安装 tmpfs(基于内存的文件系统)。 虽然 tmpfs 速度非常快,但是要注意它与磁盘不同。 tmpfs 在节点重启时会被清除,并且您所写入的所有文件都会计入容器的内存消耗,受容器内存限制约束。
文件共享,pod消亡后,生成的共享文件也会消亡
apiVersion: v1
kind: Pod
metadata:
name: vol1
spec:
containers:
- name: vm1
image: reg.westos.org/k8s/busyboxplus
command: ["sleep","300"]
volumeMounts:
- mountPath: /cache //vm1容器内卷挂载点
name: cache-volume
- name: vm2
image: reg.westos.org/k8s/nginx
volumeMounts:
- mountPath: /usr/share/nginx/html //vm2容器内卷挂载点
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
medium: Memory //告诉 Kubernetes 安装 tmpfs(基于内存的文件系统)
sizeLimit: 100Mi
hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。
hostPath 的一些用法有:
除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type。
当使用这种类型的卷时要小心,因为:
apiVersion: v1
kind: Pod
metadata:
name: hostpath-pod
spec:
containers:
- name: test-container
image: reg.westos.org/k8s/nginx
volumeMounts:
- mountPath: /test-pd
name: myhostpath
volumes:
- name: myhostpath
hostPath:
path: /data //主机节点文件系统目录
type: DirectoryOrCreate //hostpath类型
查看pod调度节点是否创建目录
Pod内挂载点创建文件,成功同步之调度节点端本地目录中
(1)配置安装NFS服务
[root@server4]#yum install -y nfs-utils
[root@server4]#mkdir /nfsdata
[root@server4]#cd /nfsdata
[root@server4 /nfsdata]#cat /etc/exports
/nfs *(rw,no_root_squash)
[root@server4 /nfsdata]#systemctl enable --now rpcbind
[root@server4 /nfsdata]#systemctl enable --now nfs
[root@server4 /nfsdata]#systemctl start nfs
[root@server4 /nfsdata]#showmount -e
Export list for server1:
/nfs *
(2)将镜像nginx中的默认发布目录挂载到了/nfsdata目录中
实现了两个目录中数据的同步
apiVersion: v1
kind: Pod
metadata:
name: nfs-pd
spec:
containers:
- name: test-container
image: reg.westos.org/k8s/nginx
volumeMounts:
- mountPath: /usr/share/nginx/html
name: test-volume
volumes:
- name: test-volume
nfs:
server: 172.25.254.4
path: /nfsdata