K8S之CSI插件开发

简介

进入 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 of a dynamically provisioned volume, fromcreation to destruction, when the Node Plugin advertises theSTAGE_UNSTAGE_VOLUME capability.

从 Volume 生命周期可以看到,一块持久卷要达到 Pod 可使用状态,需要经历以下阶段:

CreateVolume -> ControllerPublishVolume -> NodeStageVolume -> NodePublishVolume

而当删除 Volume 的时候,会经过如下反向阶段:

NodeUnpublishVolume -> NodeUnstageVolume -> ControllerUnpublishVolume -> DeleteVolume

上面流程的每个步骤,其实就对应了 CSI 提供的标准接口,云存储厂商只需要按标准接口实现自己的云存储插件,即可与 K8s 底层编排系统无缝衔接起来,提供多样化的云存储、备份、快照(snapshot)等能力。

CSI体系

CSI是由来自Kubernetes、Mesos、 Cloud Foundry等社区的member联合制定的一个行业标准接口规范,旨在将任意存储系统暴露给容器化应用程序。CSI规范定义了存储提供商(SP)实现CSI兼容插件的最小操作集和部署建议。CSI规范的主要焦点是


比丘资源网 » K8S之CSI插件开发

发表回复

提供最优质的资源集合

立即查看 了解详情