简介
进入 K8s 的世界,会发现有很多方便扩展的 Interface,包括 CSI, CNI, CRI 等,将这些接口抽象出来,是为了更好的提供开放、扩展、规范等能力。
K8s 持久化存储经历了从 in-tree Volume 到 CSI Plugin(out-of-tree) 的迁移,一方面是为了将 K8s 核心主干代码与 Volume 相关代码解耦,便于更好的维护;另一方面则是为了方便各大云厂商实现统一的接口,提供个性化的云存储能力,以期达到云存储生态圈的开放共赢。
PV流程
PV 创建核心流程:
apiserver
创建 Pod,根据PodSpec.Volumes
创建 Volume;PVController
监听到 PV informer,添加相关 Annotation(如 pv.kubernetes.io/provisioned-by),调谐实现 PVC/PV 的绑定(Bound);判断
StorageClass.volumeBindingMode
:WaitForFirstConsumer
则等待 Pod 调度到 Node 成功后再进行 PV 创建,Immediate
则立即调用 PV 创建逻辑,无需等待 Pod 调度;external-provisioner
监听到 PV informer, 调用 RPC-CreateVolume 创建 Volume;AttachDetachController
将已经绑定(Bound) 成功的 PVC/PV,经过 InTreeToCSITranslator 转换器,由 CSIPlugin 内部逻辑实现VolumeAttachment
资源类型的创建;external-attacher
监听到 VolumeAttachment informer,调用 RPC-ControllerPublishVolume 实现 AttachVolume;kubelet
reconcile 持续调谐:通过判断controllerAttachDetachEnabled || PluginIsAttachable
及当前 Volume 状态进行 AttachVolume/MountVolume,最终实现将 Volume 挂载到 Pod 指定目录中,供 Container 使用;
PV生命周期
Volume 的生命周期:
CreateVolume +------------+ DeleteVolume
+------------->| CREATED +--------------+
| +---+----^---+ |
| Controller | | Controller v
+++ Publish | | Unpublish +++
|X| Volume | | Volume | |
+-+ +---v----+---+ +-+
| NODE_READY |
+---+----^---+
Node | | Node
Stage | | Unstage
Volume | | Volume
+---v----+---+
| VOL_READY |
+---+----^---+
Node | | Node
Publish | | Unpublish
Volume | | Volume
+---v----+---+
| PUBLISHED |
+------------+
The lifecycle o