十四、k8s数据卷与持久卷
数据卷与持久卷在k8s中的使用
一、为什么需要数据卷
容器部署过程中一般有一下三种数据:
a、启动时需要的初始数据,如配置文件
b、启动过程中产生的临时数据,改临时数据需要多个容器间共享
c、启动过程中产生的业务数据,如mysql的data目录
二、数据卷概述
1、概述
k8s中volume提供了在容器中挂载外部存储的能力
Pod需要设置卷来源(spec.volume)和挂载点(spec.containers.volumeMounts)两个信息后才可以使用相应的Volume
2、数据卷类型大致分类
a、本地(hostpath,emptyDir等):数据存储在Pod所在节点
b、网络(NFS,Ceph,GlusterFS等):数据存储在远程存储服务器
c、公有云(AWS EBS等):数据存储在云存储产品上
d、k8s资源(configmap,secret等):数据存储在k8s
支持的数据卷类型参考:https://kubernetes.io/docs/concepts/storage/volumes/
三、数据卷:emptyDir、hostpath、 NFS
1、emptyDir
是一个临时存储卷,与pod生命周期绑定在一起,如pod删除了卷也会删除
应用场景:Pod中容器之间数据共享
2、hostPath
挂载Node文件系统(pod所在节点)上文件或目录到Pod中的容器
应用场景:Pod中容器需要访问宿主机文件
3、NFS
NFS数据卷:提供对NFS挂载支持,可以自动将nfs共享路径挂载到pod中
NFS:是一个主流的文件共享服务器
# yum install nfs-utils
# vi /etc/exports
/ifs/kubernetes *(rw,no_root_squash)
# mkdir -p /ifs/kubernetes
# systemctl start nfs
# systemctl enable nfs
注:每个Node上都要安装nfs-utils包
4、nfs示例
将网站程序通过NFS数据卷共享,让所有Pod使用
四、持久卷概述
persistentVolume(PV): 对存储资源创建和使用的抽象,使得存储作为集群中的资源管理
PersistentVolumeClaim(PVC): 让用户不需关心具体的Volume实现细节
五、PV与pvc使用流程
支持持久卷的存储插件:https://kubernetes.io/docs/concepts/storage/persistent-volumes/
# 查看pvc
# kubectl get pvc
# 查看 pv
# kubectl get pv
多pv创建:
多pv创建:pv.ysqml
在nfs目录创建相应的pv0001,pv0002,pv0003
# cd /ifs/k8s
# mkdir pv0001 pv0002 pv0003
# kubectl apply -f pv.ysqml
回收(删除)pv0003,删除前先备份pv0003:
# mv /ifs/k8s/pv0003 /ifs/k8s/pv0003.back
# kubectl delete pv pv0003
如果需要重新使用,只需要进行pv备份即可。
注:
1、 pv与pvc之间是一对一的关系
2、pv与pvc默认使用访问模式和容量匹配
3、pv的容量限制实际的存储容量取决于后端存储
4、容量匹配策略,如果申请的容量,pv没有刚好合适的,会分配接近于最大的那个PV,如果都不满足,pod处于pending状态。
pvc在申请pv时,向上取空间打小。如果有三个pv,5Gi,15Gi,40Gi。pvc现在申请19Gi空间,他只会取40Gi;若再申请一个16Gi空间,由于40Gi已经使用,这时就会报错,提示无法申请到相应的空间。
六、pv生命周期
ACCESS MODES(访问模式):
AccessModes是用来对pv进行访问模式的设置,用于描述用户应用对存储资源的访问权限,访问权限包括下面几种方式:
1、ReadWriteOne(RWO):读写权限,但是只能被单个节点挂载
2、ReadOnlyMany(ROX):只读权限,可以被多个节点挂载
3、ReadWriteMany(RWX):读写权限,可以被多个节点挂载
RECLAIM POLICY(回收策略):
目前PV支持的策略有三种:
1、Retain(保留):保留数据,需要管理员手工清理数据。默认设置。
2、Recycle(回收):清除PV中的数据,效果相当于执行rm -rf /ifs/kuberneres/*
3、Delete(删除):与PV相连的后端存储同时删除
修改回收策略:persistentVolumeReclaimPolicy: Retain
STATUS(状态):
一个PV的生命周期中,可能会处于4中不同的阶段:
1、Available(可用):表示可用状态,还未被任何pvc绑定
2、Bound(已绑定):表示PV已经被pvc绑定
3、Released(已释放):PVC被删除,但是资源还未被集群重新声明
4、Failed(失败): 表示该PV的自动回收失败
现在PV使用方式成为静态供给,需要k8s运维工程师提前创建一堆pv,供开发者使用。
七、pv动态供给(StorageClass),不用创建pv
pv静态供给明显的缺点是维护成本太高!因此,k8s开始支持pv动态供给,使用StorageClass对象实现。
k8s默认不支持nfs动态供给,需要单独部署社区开发的插件。
项目地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
部署:
# cd deploy
#授权访问APIserver
# kubectl apply -f rbc.yaml
#部署插件,需修改里面nfs服务器地址与共享目录, 需要修改镜像地址《默认地址是国外的》。nfs地址和目录
# kubectl apply -f deployment.yaml
#创建存储类 再生产中需要把archiveOnDelete: "false" 改成archiveOnDelete: "true",保留备份
# kubectl apply -f class.yaml
# 查看存储类
# kubectl get sc
# 测试:在创建pvc时同事创建pv,指定存储类名称
支持动态供给的存储插件:
https://kubernetes.io/docs/concepts/storage/storage-classes/
支持动态供给的存储插件github地址:
https://github.com/kubernetes-sigs/sig-storage-lib-external-provisioner 1.20以后使用地址
nfs动态供给github地址:
https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/tree/master/deploy 1.20以后使用地址
用到的文件有:
八、nfs实战:
nfs服务器配置:
# yum install nfs-utils nfs
# systemctl start nfs-server
# systemctl enable nfs-server
# showmount -e 92.168.6.1
# firewall-cmd --permanent --zone=public --add-service=nfs-server
# firewall-cmd --permanent --zone=public --add-service=nfs
# firewall-cmd --permanent --zone=public --add-service=rpc-bind
# firewall-cmd --permanent --zone=public --add-service=mountd
# firewall-cmd --reload
deployment使用:
# yum install nfs-utils 《所有k8s服务器安装》
更多推荐
所有评论(0)