CSI简介
CSI的诞生背景
K8s 原生支持一些存储类型的 PV,如 iSCSI、NFS、CephFS 等等,这些 in-tree 类型的存储代码放在 Kubernetes 代码仓库中。这里带来的问题是 K8s 代码与三方存储厂商的代码强耦合:
-
更改 in-tree 类型的存储代码,用户必须更新 K8s 组件,成本较高
-
in-tree 存储代码中的 bug 会引发 K8s 组件不稳定
-
K8s 社区需要负责维护及测试 in-tree 类型的存储功能
-
in-tree 存储插件享有与 K8s 核心组件同等的特权,存在安全隐患
-
三方存储开发者必须遵循 K8s 社区的规则开发 in-tree 类型存储代码
CSI 容器存储接口标准的出现解决了上述问题,将三方存储代码与 K8s 代码解耦,使得三方存储厂商研发人员只需实现 CSI 接口即可(无需关注容器平台是 K8s 还是 Swarm 等)。
Pod挂载volume的过程
-
用户创建一个包含PVC的Pod(使用动态存储卷);
-
PV Controller发现这个PVC处于待绑定状态,调用Volume Plugin(in-tree或者out-of-tree)创建存储卷,并创建PV对象,然后将创建的PV与PVC绑定;
-
Scheduler根据Pod的配置、节点状态、PV配置等信息,把Pod调度刀worker节点Node上;
-
AD Controller发现Pod和PVC处于待挂载状态,调用Volume Plugin(in-tree或者out-of-tree)实现设备挂载到目标节点(/dev/vdb);
-
在worker节点上,kubelet(Volume Manager)等待设备挂载完成,通过Volume Plugin将设备挂载到指定目录:/var/lib/kubelet/pods/646154cf-dc72-11e9-b200-00163e007d53/volumes/alicloud~disk/pv-disk;
-
kubelet在被告知挂载目录准备好后,启动Pod中的containers,用Docker -v方式(bind)将已经挂载到本地的卷映射到容器中;
CSI工作原理
CSI的部署模式
CSI 主要包含两个部分:CSI Controller Server 与 CSI Node Server,分别对应Controller Server Pod和Node Server Pod
Controller Server
只需要部署一个 Controller Server,如果是多备份的,可以部署两个。
Controller Server 主要是通过多个外部插件来实现的,一个 Pod 中可以定义多个 sideCar形式的External Container 和一个包含 CSI Controller Server 的 Container,这时候不同的 External 组件会和 Controller Server 组成不同的功能。
交互 | 过程 |
---|---|
External Provisioner + Controller Server | 创建、删除数据卷 |
External Attacher + Controller Server | 执行数据卷的挂载、卸载操作 |
Volume Manager + Volume Plugin + Node Server | 执行数据卷的Mount、Umount操作 |
AD Controller + VolumePlugin | 创建、删除VolumeAttachment对象 |
External Resizer + Controller Server | 执行数据卷的扩容操作 |
ExternalSnapshotter+ControllerServer | 执行数据卷的备份操作 |
Driver Registrar + VolumeManager + Node Server | 注册CSI插件,创建CSINode对象 |
Node Server
Node Server Pod 是个 DaemonSet,它会在每个节点上进行注册。
Kubelet 会直接通过 Socket 的方式直接和 CSI Node Server 进行通信、调用 Attach/Detach/Mount/Unmount 等。
Driver Registrar
Driver Registrar 只是做一个注册的功能,会在每个节点上进行部署。
CSI的工作原理
CSI Controller
CSI Controller,它是以 deployment 的形式运行在集群里面,主要负责 provision 和 attach 工作。
attach并不是不是每一个存储都会用到的,而 provision 就是在使用 StorageClass 的时候会动态创建 PV 的过程,