K8s卷存储详解(二)
持久卷
容器销毁时,容器数据持久化的问题解决了。但新的问题出现了,如果某个Node节点故障了,Pod如果转移到了别的节点,本地临时存储的数据就不能访问了,此时需要网络存储系统来解决这个问题。
网络存储方案有很多,比较常用的如NFS、CIFS。为了屏蔽网络存储底层实现的细节,方便用户使用, kubernetes引入PV(持久卷:Persistent Volume)和 PVC(持久卷申领:Persistent Volume Claim)两种资源对象。
持久卷(PV)
PV是通过PVC来实现和Pod动态绑定, 在Pod定义里指定创建好的PVC, 然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。
因此PVC是用户对存储的请求,期望。
PV访问模式(accessModes)
每个 PV 卷的访问模式都会设置为对应卷所支持的模式值
访问模式有:
- RWO(ReadWriteOnce): PV以读写方式挂载到一个节点,允许运行在同一节点上的多个 Pod 访问卷。
- RWX(ReadWriteMany):PV以读写方式挂载到多个节点。
- ROX(ReadOnlyMany):PV以只读方式挂载到多个节点。
- RWO(PReadWriteOncePod):(特性状态:
Kubernetes v1.27 [beta]
)卷可以被单个 Pod 以读写方式挂载。如你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC(只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本。)更详细内容见: Introducing Single Pod Access Mode for PersistentVolumes
持久卷申领(PVC)
概念上与 Pod 类似, Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 。
存储类(StorageClass)
PV的制备有两种方式:
-
静态制备
-
动态制备
静态制备:
集群管理员手动创建若干PV卷(这些卷对象带有真实存储的细节信息, 并且对集群用户可用(可见)),供容器消费使用。静态制备的缺点是维护成本很高。
动态制备:
集群管理员也可以使用StorageClass
实现PV资源的动态制备。每个StorageClass都包含provisioner、parameters和reclaimPolicy字段。
默认存储类
基于存储类完成动态的存储制备,集群管理员需要在 API 服务器上启用默认存储类 DefaultStorageClass
准入控制器。
如果持久卷申领PersistentVolumeClaim创建的请求,没有指定存储类,则会添加默认存储类。
只能设定一种存储类为默认的存储类,不能将多种存储类设置为默认;如果不小心设置了多个DefaultStorageClass
, 当 PVC 动态配置时,将使用最新设置的DefaultStorageClass。如果默认存储类没有设置时,此准入控制器不执行任何操作
注意,某些云服务提供商可能已经定义了一个默认的 StorageClass
如何改变默认存储类?
1.列出你的集群中的 StorageClasses
$ kubectl get storageclass
NAME PROVISIONER AGE
standard (default) kubernetes.io/gce-pd 1d
gold kubernetes.io/gce-pd 1d
默认 StorageClass 以 (default)
标记
2.标记默认 StorageClass 非默认:
要标记一个 StorageClass 为非默认的,你需要改变它的值为 false
:
kubectl patch storageclass standard -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
默认 StorageClass 的注解 storageclass.kubernetes.io/is-default-class
设置为 true
。 注解的其它任意值或者缺省值将被解释为 false
。
这里的 standard
是你选择的 StorageClass 的名字。
3.标记一个 StorageClass 为默认的:
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
4.验证你选用的 StorageClass 为默认的:
$ kubectl get storageclass
NAME PROVISIONER AGE
standard kubernetes.io/gce-pd 1d
gold (default) kubernetes.io/gce-pd 1d
存储制备器(Provisioner)
每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定。
卷插件 |
---|