Volume是Pod中能够被多个容器共享的磁盘目录。我们知道,默认情况下Docker容器中的数据都是非持久化的,在容器消亡后数据也会消失。因此Docker提供了Volume机制以便实现数据的持久化。Kubernetes中Volume的概念与Docker中的Volume类似,但不完全相同。具体区别如下:
Kubernetes提供了非常丰富的Volume类型,下面是一些常用的Volume类型:
emptyDir、hostPath、gcePersistentDisk、awsElasticBlockStore、gitRepo、secret、nfs、iscsi、
glusterfs、persistentVolumeClaim、rbd、flexVolume、cinder、cephfs、flocker、downwardAPI、fc、azureFile、configMap、vsphereVolume
注意,这些 volume 并非全部都是持久化的,比如 emptyDir、secret、gitRepo 等,这些 volume 会随着 Pod 的消亡而消失。
emptyDir类型的volume是在Pod分配到Node时创建的,kubernetes会在Node上自动分配一个目录,因此无需指定宿主机Node上对应的目录文件。这个目录的初始内容为空,当 Pod 从 Node 上被删除(Pod 被删除,或者 Pod 发生迁移),emptyDir 也会被删除,并且数据永久丢失。
创建包含两个容器的busybox pod,每个容器都有映像busybox并运行“sleep 3600”命令。使两个容器都在‘/etc/foo‘处安装一个空的dir。 连接到第二个busybox,将‘/etc/passwd‘文件的第一列写入‘/etc/foo/passwd‘。连接到第一个busybox并将“/etc/foo/passwd”文件写入标准输出
kubectl run busybox --image=busybox --restart=Never --dry-run -o yaml -- /bin/sh -c "sleep 3600" > pod.yaml
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: busybox name: busybox spec: dnsPolicy: ClusterFirst restartPolicy: Never containers: - args: - /bin/sh - -c - sleep 3600 image: busybox name: busybox resources: {} volumeMounts: - name: myvolume mountPath: /etc/foo - args: - /bin/sh - -c - sleep 3600 image: busybox name: busybox2 ### 注意修改成其他名称,不要和上面的名称重复 volumeMounts: - name: myvolume mountPath: /etc/foo volumes: - name: myvolume emptyDir: {} status: {}
创建pod
[root@han-test ckad-test]# kubectl apply -f pod.yaml -n ckad-test pod/busybox created [root@han-test ckad-test]# kubectl get pod -n ckad-test NAME READY STATUS RESTARTS AGE busybox 2/2 Running 0 35s [root@han-test ckad-test]#
连接到第二个容器:
[root@han-test ckad-test]# kubectl -n ckad-test exec busybox -c busybox2 -it -- /bin/sh / # ls bin dev etc home proc root sys tmp usr var / # cat /etc/passwd |cut -f 1 -d ":" > /etc/foo/passwd / # cat /etc/foo/passwd root daemon bin sys sync mail www-data operator nobody / # exit
连接到第一个容器:
[root@han-test ckad-test]# kubectl -n ckad-test exec busybox -c busybox -it -- /bin/sh / # mount |grep foo /dev/vda1 on /etc/foo type xfs (rw,seclabel,relatime,attr2,inode64,noquota) / # cat /etc/foo/passwd root daemon bin sys sync mail www-data operator nobody / # exit [root@han-test ckad-test]#
挂载Node文件系统上的文件或者目录到pod中的容器
hostPath类型的volume允许用户挂在Node上的文件系统到Pod中,如果 Pod 需要使用 Node 上的文件,可以使用 hostPath。
scp pod.yaml hostPath.yaml
vim hostPath.yaml ... volumes: - name: myvolume hostPath: path: /etc/foo ...
创建hostPath pod
[root@han-test ckad-test]# kubectl -n ckad-test delete pod busybox pod "busybox" deleted [root@han-test ckad-test]# kubectl apply -f hostPath.yaml -n ckad-test pod/busybox created [root@han-test ckad-test]# kubectl get pod -n ckad-test NAME READY STATUS RESTARTS AGE busybox 2/2 Running 0 35s [root@han-test ckad-test]#
重复上面操作
[root@han-test ckad-test]# kubectl -n ckad-test exec busybox -c busybox2 -it -- /bin/sh / # cat /etc/passwd | cut -f 1 -d ‘:‘ > /etc/foo/passwd / # cat /etc/foo/passwd root daemon bin sys sync mail www-data operator nobody / # exit [root@han-test ckad-test]# kubectl -n ckad-test exec busybox -c busybox -it -- /bin/sh / # cat /etc/foo/passwd root daemon bin sys sync mail www-data operator nobody / # exit [root@han-test ckad-test]#
访问宿主机上的目录文件
[root@han-test ckad-test]# cat /etc/foo/passwd root daemon bin sys sync mail www-data operator nobody
即使pod删除,文件还是会存在
volumes: - name: nfs nfs: # FIXME: use the right hostname server: 10.254.234.223 path: "/"
原文:https://www.cnblogs.com/supery007/p/12980797.html