- PVC(Persistent Volume Claim,持久卷声明):是用户对存储资源的请求,用于向 Kubernetes 申请存储,抽象化存储的使用细节,方便应用获取和使用持久化存储。
- PV(Persistent Volume,持久卷):是 Kubernetes 中底层存储的抽象,代表具体的存储资源(如 NFS、云硬盘等),通过定义存储的类型、容量、访问模式等参数,供 PVC 动态绑定调用。
- StorageClass:用于定义存储资源的配置模板,可动态创建 PV,支持按需提供存储服务,通过参数配置存储的类型(如 SSD、HDD)、备份策略等,实现存储资源的自动化管理和动态供给。
静态绑定
以使用NAS静态存储卷为例:
PV
静态绑定的方式需要手动配置
PV
,并设定labels
:apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必须与PV Name保持一致。 volumeAttributes: server: "0c47****-mpk25.cn-shenzhen.nas.aliyuncs.com" # NAS挂载点,与集群VPC一致。 path: "/csi" # 挂载子目录。 mountOptions: - nolock,tcp,noresvport - vers=3
PVC
PVC
通过label selector
绑定上面手动配置的PV
。
动态绑定
- 用户创建 PVC:用户通过 PVC 声明存储需求(如容量、访问模式、存储类型等),但此时无对应的 PV 绑定。
- StorageClass 匹配与创建:PVC 会根据指定的 StorageClass (或默认类),触发存储插件(如云厂商存储插件、NFS 插件等)动态创建符合要求的 PV,并将两者绑定。
- 应用使用存储:绑定完成后,Pod 可通过 PVC 挂载自动创建的 PV,实现按需获取存储资源,无需手动预先创建 PV。
PVC
和 PV
以 storageClassName
为桥梁,以 StorageClass
为中介动态绑定。若 storageClassName
为空,则 PVC
将会和默认的 PV
绑定。
StorageClass
的 allowVolumeExpansion
属性用于表明该存储是否允许扩容卷,以阿里云 NAS为例,若该属性为 true,则可以通过 patch PVC
,修改其声明的卷大小来动态扩缩容。
CSI Driver
Understanding CSI architecture and communication
- Daemonset Pod 应用可在所有节点上运行。
- StatefulSet / Deployment Pod 应用作为 Kubernetes controller 运行。
- 在 Daemonset Pod中,CSI Driver 通过 gRPC 和 socket 与 Kubelet 通信。
node-driver-registrar
将 CSI Driver 作为插件注册到 Kubelet。
https://speakerdeck.com/bells17/kubernetes-and-csi?slide=44- 在 StatefulSet / Deployment Pod 中,CSI Driver 通过 gRPC 和 socket 与 CSI sidecar 应用通信。
- CSI sidecar 应用作为 Kubernetes controller 运行。
- 例如,创建 PVC 资源时,
external-provisioner
会监听该事件,并调用 CSI Driver 的CreateVolume
rpc。
https://speakerdeck.com/bells17/kubernetes-and-csi?slide=47