一、什么是Volume

默认情况下容器的数据都是非持久化的,在容器消亡以后数据也跟着丢失,所以 Docker 提供了 Volume 机制以便将数据持久化存储。类似的,Kubernetes 提供了更强大的 Volume 机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。

与 Docker 不同,Kubernetes Volume 的生命周期与 Pod 绑定。容器挂掉后 Kubelet 再次重启容器时,Volume 的数据依然还在,而 Pod 删除时,Volume 才会清理。数据是否丢失取决于具体的 Volume 类型,比如 emptyDir 的数据会丢失,而 PV 的数据则不会丢.

要使用卷,Pod指定要为Pod提供的卷( .spec.volumes 字段)以及将这些卷安装到容器( .spec.containers.volumeMounts 字段)的位置。

volume是k8s数据卷,常见的数据卷有4种类型,即EmptyDir,HostDir,NFS,Secret

  1. EmptyDir是一个空目录,他的生命周期和所属的 Pod 是完全一致的,
  2. 可能读者会奇怪,那还要他做什么?EmptyDir的用处是,可以在同一 Pod 内的不同容器之间共享工作过程中产生的文件。
  3. 一旦这个pod离开了这个宿主机,EmptyDirr中的数据就会被永久删除
  4. [root@k8s-master ]# cat test-emptypath.yaml
  5. apiVersion: v1
  6. kind: Pod
  7. metadata:
  8. labels:
  9. name: test-emptypath
  10. role: master
  11. name: test-emptypath
  12. spec:
  13. containers:
  14. - name: test-emptypath
  15. image: registry:5000/back_demon:1.0
  16. volumeMounts:
  17. - name: log-storage
  18. mountPath: /home/laizy/test/
  19. command:
  20. - /run.sh
  21. volumes:
  22. - name: log-storage
  23. emptyDir: {}
HostDir属性的volume使得对应的容器能够访问当前宿主机上的指定目录。
[root@k8s-master ]# cat test-hostpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: test-hostpath
    role: master
  name: test-hostpath
spec:
  containers:
    - name: test-hostpath
      image: registry:5000/back_demon:1.0
      volumeMounts:
       - name: ssl-certs
         mountPath: /home/laizy/test/cert
         readOnly: true
      command:
      - /run.sh
  volumes:
  - name: ssl-certs
    hostPath:
     path: /etc/ssl/certs
#nfs网络存储
[root@k8s-master ]# cat test-nfspath.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: test-nfspath
    role: master
  name: test-nfspath
spec:
  containers:
    - name: test-nfspath
      image: registry:5000/back_demon:1.0
      volumeMounts:
       - name: nfs-storage
         mountPath: /home/laizy/test/
      command:
      - /run.sh
  volumes:
  - name: nfs-storage
    nfs:
     server: 192.168.20.47
     path: "/data/disk1"
Secret:Kubemetes提供了Secret来处理敏感数据


[root@k8s-master demon2]# cat secret.yaml 
apiVersion: v1
kind: Secret
metadata:
 name: mysecret
type: Opaque
data:
 username: emhlbnl1
 password: eWFvZGlkaWFv
[root@k8s-master demon2]# cat test-secret.yaml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    name: test-secret
    role: master
  name: test-secret
spec:
  containers:
    - name: test-secret
      image: registry:5000/back_demon:1.0
      volumeMounts:
       - name: secret
         mountPath: /home/laizy/secret
         readOnly: true
      command:
      - /run.sh
  volumes:
  - name: secret
    secret:
     secretName: mysecret