Kubernetes存储

Kubernetes中Volume提供了在容器中挂载外部存储的能力。

1、使用场景

  • 启动时需要的初始化数据,如配置文件。
  • 运行过程中产生的临时数据,临时数据需要多个容器共享
  • 运行过程中产生的持久化数据,例如有状态服务mysql的数据。

2、存储卷类型

  • 本地存储(hostPath,emptyDir)
  • 网络存储(NFS、Ceph、GlusterFS)
  • 公有云存储(AWS、EBS)
  • K8S资源(configmap、secret)

3、emptyDir卷

emptyDir时一个临时存储卷,与Pod生命周期绑定,当Pod分配到某个Node时,emptyDir也会创建在这个Node上,删除Pod也会删除emptyDir卷。主要用于Pod中容器之间数据共享。

3.1、emptyDir配置示例

在一个Pod中创建两个容器,通过emptyDir共享数据。

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. labels:
  5. run: emptydemo
  6. name: emptydemo
  7. spec:
  8. containers:
  9. - image: centos # 创建容器往存储卷写入数据
  10. name: emptydemo
  11. command: ["bash", "-c", "for i in {1..100};do echo $i >> /data/hello.txt;sleep 1;done"]
  12. volumeMounts:
  13. - name: data
  14. mountPath: /data
  15. - image: centos # 创建reader容器读取存储卷数据
  16. name: reader
  17. command: ["bash","-c","tail -f /data/hello.txt"]
  18. volumeMounts:
  19. - name: data
  20. mountPath: /data
  21. resources: {}
  22. volumes:
  23. - name: data
  24. emptyDir: {}
  25. dnsPolicy: ClusterFirst
  26. restartPolicy: Always

进入reader容器,查看存储卷挂载路径内是否有hello.txt文件。

$ kubectl exec -it emptydemo bash -c reader
[root@emptydemo data]# tail -f hello.txt
80
81
82

4、hostPath

将Pod所在Node节点上文件或者目录挂载到Pod中容器,如Pod中容器需要访问宿主机文件。Pod删除,hostPath依旧会存在。

4.1、hostPath配置示例

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # 宿主上目录位置
      path: /data
      # 此字段为可选
      type: Directory

type为指定挂载文件的类型。

4.2、type支持的值

  • 空:空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。

  • DirectoryOrCreate:如果在给定路径不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。

  • Directory:在给定路径上必须存在的目录。

  • FileOrCreate:如果路径不存在,则创建文件,权限为0644.

  • File:在给定路径上必须存在的文件。

  • Socket:在给定路径上必须存在的 UNIX 套接字。

  • CharDevice:在给定路径上必须存在的字符设备。

  • BlockDevice:在给定路径上必须存在的块设备

5、共享存储NFS

nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。

6、持久卷

6.1、PV

6.2、PVC

6.3、PV动态供给(StorageClass)