八、Pod数据持久化Volume
Volume
Kubernetes中的Volume提供了在容器中挂载外部存储的能力
Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可 以使用相应的Volume
k8s支持的卷类型
大致可以分类为以下四种,其中比较常用的如下 本地卷(只用于当前node节点):hostPath、emptyDir
网络卷(可以在任意节点访问):nfs,rbd,cephfs,glusterfs
公有云:nfs,rbd,cephfs,glusterfs
k8s资源:secret,configMap
k8s创建的空卷的位置
在对应的node节点,因为pod是由kubelet管理的,所有空卷也是有kubelet创建的,查看kubelet的目录,默认在/var/lib/kubelet,然后进入pods/,里面可能有很多名称为pod id的目录,使用docker ps查看一下pod对应的id,然后进入那个pod id的目录,里面有volemes目录,进入后有对应的数据卷目录,再次进入就可以看到
例如目录:/var/lib/kubelet/pods/{pod id}/volumes/kubernetes.io~empty-dir/data
yaml文件示例
# 创建一个空卷,挂载到Pod中的容器。Pod删除该卷也会被删除 apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: # 容器一 ,负责写 - name: write image: centos command: ["bash","-c","for i in {1..100};do echo $i>> /data/hello;sleep 1;done"] volumeMounts: # 与下面的卷来源名称关联 - name: data # 挂载到容器中的目录 mountPath: /data # 容器二,负责读 - name: read image: centos command: ["bash","-c","tail -f /data/hello"] volumeMounts: - name: data mountPath: /data # 定义卷的来源与类型,定义多个卷可以在下面继续写- name volumes: - name: data emptyDir: {}
hostPath.yaml文件
将宿主机(node)上的/tmp路径,挂载到容器的/data目录中,容器/data目录和宿主机/tmp目录会同时更新
应用场景:当Pod中的容器需要访问宿主机文件时
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: busybox image: busybox # 防止busybox退出,休眠36000秒 args: - /bin/sh - -c - sleep 36000 volumeMounts: - name: data mountPath: /data volumes: - name: data hostPath: # 指定宿主机上的路径 path: /tmp # 指定挂载的类型,目录或者文件 type: Directory
NFS
一款主流的文件共享服务器软件,能让使用者访问网络上的文件像在使用自己的计算机一样
如果想要使用nfs.yaml部署,所有节点所需要装nfs的包:yum install nfs-utils -y
然后最好先测试一下是否可以挂载成功,然后再用k8s进行nfs挂载,
测试方式如下:
使用systemctl start nfs启动,systemctl enable nfs设置开机启动
然后vi /etc/exports(可以写多行)
写入 /ifs/kubernetes *(rw,no_root_squash)
表示将宿主机上/ifs/kubernetes这个目录暴露到互联网上,*表示所有ip都能访问,括号里表示访问权限和以root权限运行,然后systemctl restart nfs重启服务
然后可以在其他机器运行mount -t nfs {上面的机器IP}:/ifs/kuberneres {本机挂载的目录},表示将本机目录挂载到/ifs/kuberneres,如果不需要挂载,可以使用umount {本机挂载的目录} 进行卸载
nfs.yaml文件
将node挂载到nfs远程存储
一般比较少用到nfs远程存储,一般都会把应用程序都打到镜像里,不依赖于外部存储
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: # 与下面的卷来源名称关联 - name: wwwroot # 挂载到容器中的哪个目录,就是容器需要把哪个目录共享出来 mountPath: /usr/share/nginx/html ports: - containerPort: 80 # 定义卷的来源与类型 volumes: - name: wwwroot nfs: # 写nfs的服务器 server: 192.168.22.135 # 挂载的路径 path: /data/nfs
PersistentVolume的作用
为了让应用者(测试、开发)不需要关心使用什么存储,使用哪台服务器,应用者只需要关心需要多少存储等
PersistentVolumeClaim(PVC):让用户不需要关心具体的Volume实现细节
PersistentVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
一般会有开发编写pod和pvc的yaml,运维任务则定义pv,根据开发需求提供对应的pv进行存储
pv.yaml文件
创建三个不同容量的pv,可通过kubectl get pv查看创建的pv,一般由运维人员来完成
pv访问模式:
ReadWriteOnce(RWO) 单个pod读写 ,应用场景:数据独立,一般块设备
ReadOnlyMany(ROX) 所有pod只读
ReadWriteMany(RWX) 所有pod读写,应用场景:数据共享,文件系统
pv使用过之后就不会再次使用了,如果数据还有需要就备份后删除
pv回收策略:
Delete:直接删除PV+数据 【不推荐】
Recycle:清除数据,保留PV 【被废弃】
Retain:保留PV&数据 [推荐]
PV可能会处于4中不同的阶段:
Available(可用):表示可用状态,还未被任何 PVC 绑定
Bound(已绑定):表示 PVC 已经被 PVC 绑定
Released(已释放):PVC 被删除,但是资源还未被集群重新声明
Failed(失败): 表示该 PV 的自动回收失败
piVersion: v1 kind: PersistentVolume metadata: name: pv01 spec: # 定义pv容量 capacity: storage: 5Gi # pv访问模式,所有节点都能读写,有三个模式:所有节点只读/单节点读写 accessModes: - ReadWriteMany # nfs后端存储 nfs: path: /k8s/nfs/pv01 server: 192.168.0.200 apiVersion: v1 --- apiVersion: v1 kind: PersistentVolume metadata: name: my-pv02 spec: capacity: storage: 10Gi accessModes: - ReadWriteMany nfs: path: /ifs/k8s/pv02 server: 192.168.22.134 --- apiVersion: v1 kind: PersistentVolume metadata: name: my-pv03 spec: capacity: storage: 20Gi accessModes: - ReadWriteMany nfs: path: /ifs/k8s/pv03 server: 192.168.22.134
pod.yaml文件
创建应用yaml文件,一般由开发人员来完成
可通过kubectl get pvc查看绑定了哪块pv,一个pvc只能绑定一个pv
PVC与PV匹配条件:
1、容量
2、访问模式
3、标签
如果pvc用不到pv后,原本产生在pv提供的数据存储还是保留着数据,需要手动删除
apiVersion: apps/v1 kind: Deployment metadata: labels: app: web name: web spec: replicas: 1 selector: matchLabels: app: web strategy: {} template: metadata: labels: app: web spec: containers: - name: nginx image: nginx resources: {} volumeMounts: - name: data mountPath: /usr/share/nginx/html # 数据卷持久化至pvc valumes: - name: data persistentVolumeClaim: # 名称,要与下面的name一致 claimName: my-pvc --- # 定义pvc apiVersion: v1 kind: PersistentVolumeClaim metadata: # 与上面的claimName名称一致 name: my-pvc spec: accessModes: # 指定访问模式 - ReadWriteMany resources: requests: # 指定绑定的pv容量大小 storage: 5Gi
PersistentVolume 静态供给和PersistentVolume 动态供给
上面的时PersistentVolume 静态供给,需要提前准备好pvc,比如10G、20G、30G,然后pv去进行匹配,而PersistentVolume 动态供给在PVC和PV中间增加了StrageClass,意思是PVC需要多少容量的存储,通过StrageClass动态去生成,而不需要提前生成好
Kubernetes支持动态供给的存储插件: 里面打勾的代表官方支持动态供给
对于官方不支持的动态供给类型,可以在社区找一下有没有提供支持的插件
浙公网安备 33010602011771号