一、为什么需要数据卷

容器部署过程中一般有一下三种数据:

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服务器安装》

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐