1. Kubernetes Volume
Volume用于Pod容器间共享存储。
它与Pod绑定,和Pod生命周期相同。
Volume支持多种类型:
-
资源对象:ConfigMap、Secret、DownwardAPI等
-
宿主机存储:EmptyDir、HostPath、Local等
-
网络存储:CephFS、NFS等
-
存储厂商存储:StorageOS、VsphereVolume等
-
公有云:AzureDisk、GCEPersistentDisk等
2. PV、PVC、StorageClass
PV:存储资源的抽象,由管理员配置,供Pod使用,但独立于Pod生命周期。
PVC:用户对PV的申请,会消耗PV资源
-
若已有PV能满足,可以使用已有PV
-
若已有PV不能满足,则需指定StorageClass,以此动态创建PV
StorageClass:用于定义存储资源的特性,以此为依据,动态创建PV
2.1. PV与PVC工作流程
可将PV为资源,PVC当成需求,工作分为:
-
资源供应:PV资源供应
-
资源绑定:通过PVC,将PV与Pod绑定
-
资源使用:Pod使用PV资源
-
资源回收:删除PVC,回收处理PV资源
a. 资源供应
分为2种模式供应:
-
静态模式:管理员预先创建PV
-
动态模式:PVC后,基于指定的StorageClass创建PV
-
StorageClass需要预先定义
-
StorageClass可为
""
,此时禁用动态模式
-
b. 资源绑定
静态模式下:
-
根据PVC,寻找已有满足要求的PV
-
将PV和PVC绑定
- PV被该PVC独占,不能与其它PVC绑定
-
若没有满足的PV,则PVC将处于Pending状态
动态模式:
-
根据PVC,找到合适的StorageClass
-
自动创建PV与该PVC绑定
c. 资源使用
Pod定义,可设置persistentVolumeClaim
设置PVC。
多个Pod可使用同一个PVC,此时多Pod共享同一个PV,需要处理好多进程访问同一个存储多问题。
PV与PVC保护:
-
PVC删除在使用它的Pod删除后执行
-
PV删除在绑定它的PVC删除后执行
d. 资源回收
PV与PVC绑定结束后(PVC被删除),PV有3种回收策略:
-
Retaine:保留数据
-
Delete:自动删除数据
-
Recycle:回收,仅HostPath和NFS等支持,简单执行
rm -rf /thevolume/*
- 被弃用,以动态供应机制代替
e. PVC扩容
PVC可在使用中更新,通过修改PVC定义,以实现扩容。
一些机制,如CSI类型存储、文件系统、在线扩容、扩容失败后恢复机制,需要后端等其它的支持。
2.2. PV配置
配置参考:[PersistentVolume | Kubernets](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-v1/) |
关键配置如下:
-
存储容量
-
存储卷模式:例如文件存储、块存储
-
访问模式:RWOP读写(单Pod挂载)、RWO读写(单Node挂载)、ROX只读(多Node挂载)、RWX读写(多Node挂载)
-
存储类:即StorageClass的名字
-
与具有该类别的PVC绑定
-
若不设置,则不和任何PVC绑定
-
-
回收策略:Retain、Delete、Recycle
-
挂载选项
-
节点亲和性:限制某些Node访问Volume,可将使用该Volume的Pod调度到指定Node上
- 对Local等PV比较适用
PV的4个状态:Available(未绑定)、Bound(已经绑定)、Release(刚删除绑定的PVC,未回收)、Failed(回收失败)
2.3. PVC配置
配置参考:[PersistentVolumeClaim | Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/persistent-volume-claim-v1/) |
关键配置如下:
-
存储资源的请求量
-
访问模式
-
存储卷模式:同PV,优先的可以绑定文件存储
-
PV选择Selector:利用Label Selector筛选PV
-
存储类:即要申请的StorageClass名字
-
若为
""
则不使用动态模式 -
若未设置,则默认为
DefaultStorageClass
,若默认未允许,同""
-
2.4. Pod使用PVC
在volumes.persistentVolumeClaim
中设置,在claimName
中指定PVC的名字,同时需要设置volumes.name
然后,在Pod中容器的挂载设置中(containers.volumeDevices
),指定上面设置的Volume设备(volumes.name
)。
2.5. StorageClass配置
配置参考:[StorageClass | Kubernetes](https://kubernetes.io/docs/reference/kubernetes-api/config-and-storage-resources/storage-class-v1/) |
关键配置如下:
-
存储提供者:即Provisioner,后端存储驱动
- 可以用内置、第三方,也可自行实现,需要符合规范
-
回收策略:Delete(默认)与Retain
-
是否允许扩容:允许PVC与PV绑定后,通过修改PVC完成PV扩容
-
挂载选项
-
存储绑定模式:包括
-
Immediate(默认):PVC创建时,立刻创建PV并绑定
-
WaitForFirstConsumer:第一个使用PVC的Pod创建后,在Pod所在Node上创建PV并绑定
- Azure、GCE、AWS存储后端都支持
-
-
存储后端的参数
StorageClass可被指定为默认的,需要:
-
api-server
开启DefaultStorageClass选项 -
StorageClass中指定一个annotation
storageclass.beta.kubernetes.io/is-default-class="true"
3. CSI存储机制
即Container Storage Interface,通过该接口标准,实现存储插件,为容器提供存储服务。
避免以“in-tree”(将代码并入k8s主库)方式实现存储插件,降低耦合性。
具体参考:Introduction - Kubernetes CSI Developer Documentation
3.1. 核心组件与架构
组件:CSI Controller、CSI Node
a. CSI Controller
提供存储服务视图,对存储资源和存储卷进行管理操作。
一般部署为单实例Pod,该Pod运行2个容器:
-
与
kube-controller-manager
通信的sidecar容器,包含:-
external-attacher
:监控VolumeAttachment资源对象变更 -
external-provisioner
:监控PVC的变更 -
external-snapshotter
:管理快照 -
external-resizer
:管理扩容
-
-
CSI Driver存储驱动容器,由第三方提供,实现CSI规定的接口
两个容器通过Unix Socket并使用gRPC协议通信,sidecar容器调用CSI Driver容器接口,CSI Driver容器负责具体存储卷操作。
b. CSI Node
对主机Node上的Volume进行管理和操作。
一般部署为DaemonSet,每个Pod运行2个容器:
-
与
kubelet
通信的sidecar容器node-driver-registrar
,主要将驱动注册到kubelet
中 -
CSI Driver存储驱动容器,由第三方提供,主要接收
kubelet
的调用,需实现一系列与Node相关的CSI接口
通信也同样基于Unix Socket和gRPC。
3.2. 存储快照管理
引入3个资源对象:
-
VolumeSnapshotContent:某个PV的快照(类比PV)
-
VolumeSnapshot:需要使用某个快照的申请(类比PVC)
-
VolumeSnapshotClass:设置快照的特性,屏蔽VolumeSnapshotContent的细节(类比StorageClass)
此外还需要部署Snapshot Controller,并为CSI驱动部署csi-snapshotter
辅助sidecar:
-
Snapshot Controller:监控VS的创建,自动创建VSC对象
-
辅助sidecar:监控VSC创建和删除,调用CSI的CreateSnapshot或DeleteSnapshot接口,创建或删除快照
a. VolumeSnapshot与VolumeSnapshotContent生命周期
与PV、PVC类似,生命周期包括:
-
资源供应:包括静态(预先创建)和动态(基于VolumeSnapshotClass,在申请时创建)供应
-
资源绑定:Snapshot Controller将VolumeSnapshot绑定到VolumeSnapshotContent上,一对一绑定
-
对PVC的保护:PVC的删除会在VolumeSnapshot创建完成/终止后执行
-
资源删除:VolumeSnapshot删除后,对VolumeSnapshotContent执行Delete或Retain操作
b. 基于快照创建新的PVC存储卷
在PVC中设置dataSouce
,指定kind
为VolumeSnapshot
。
c. PVC存储卷克隆
CSI类型存储可支持克隆功能,可基于某个已有PVC克隆一个新PVC,通过dataSource
字段设置源PVC实现(kind
设置为PersistentVolumeClaim
)。
克隆需要注意:
-
仅支持CSI类型的存储卷
-
仅适用动态供应模式
-
具体功能实现,取决于CSI驱动
-
目标PVC和源PVC处于一个namespace
-
目标PVC和源PVC属于同一个StorageClass
-
目标PVC和源PVC的存储模式相同(必须同为文件或块存储)