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共享数据。
apiVersion: v1kind: Podmetadata:labels:run: emptydemoname: emptydemospec:containers:- image: centos # 创建容器往存储卷写入数据name: emptydemocommand: ["bash", "-c", "for i in {1..100};do echo $i >> /data/hello.txt;sleep 1;done"]volumeMounts:- name: datamountPath: /data- image: centos # 创建reader容器读取存储卷数据name: readercommand: ["bash","-c","tail -f /data/hello.txt"]volumeMounts:- name: datamountPath: /dataresources: {}volumes:- name: dataemptyDir: {}dnsPolicy: ClusterFirstrestartPolicy: 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 之间共享。
