.. _k8s_csi_arch: ======================= Kubernetes CSI架构 ======================= CSI概念 ========= - CSI是容器存储接口(Container Storage Interface),以建立一个行业标准接口规范,以便将任意存储系统暴露给容器 :ref:`k8s_workloads` 。 - ``csi`` 卷类型是一种 ``out-tree`` (in-tree是指跟其它存储插件在同一个代码路径下,随 Kubernetes 的代码同时编译,out-tree则刚好相反) 的CSI卷插件,用于Pod与同一个节点上运行的外部CSI卷驱动程序交互。部署了CSI兼容卷驱动后,用户就开业使用 ``csi`` 作为卷类型来关在驱动提供的存储。 - CSI持久化卷支持在Kubernetes v1.9引入,必须由集群管理员明确启用。也就是需要在 ``apiserver`` / ``controller-manager`` 和 ``kubelet`` 组件的 ``--feature-gates =`` 标志中加上 ``CSIPersistentVolume = true`` - CSI持久化卷具备以下字段可以让用户指定: - ``driver`` : 指定卷驱动程序名称 - ``volumeHandle`` : 唯一标识从CSI卷插件的 ``CreateVolume`` 调用返回的卷名 - ``readOnly`` : 指示卷是否发布为只读 CSI插件机制 ============= CSI插件包括: - ``Controller Plugin`` : 以 ``Deployment`` 或 ``StatefulSet`` 形式部署,实现CSI Controller service。Controller负责与Kubernetes API, 外部存储服务的控制面交互,但并不实际处理存储卷在宿主机上的挂载等工作 - ``Node Plugin`` : Node插件需要在所有node节点上运行,所以通常以 ``Daemonset`` 形式部署。Node插件实现CSI Node service,会暴露出一个 ``uds`` 文件出来,从而让 ``kubelet`` 在进行存储卷操作时,通过这个 ``uds`` 文件调用它的 ``gRPC`` 接口 CSI插件需要实现 **3个** ``gRPC`` 接口服务: - ``Identity Service`` : Node插件和Controller插件都需要实现Identity Service RPC - ``Controller Service`` : 控制插件实现 - ``Node Service`` : Node插件实现 CSI插件部署通常采用官方提供的一系列sidecar来完成: - ``external-provisioner`` - ``external-attacher`` - ``external-snapshotter`` - ``external-resizer`` - ``node-driver-registrar`` - ``livenessprobe`` .. note:: 我先实践 :ref:`ceph-csi` ,然后再回来补充理论知识 参考 ======= - `Kubernetes CSI Specification `_ 这篇文章较为全面清晰,提供了不少索引信息,可以作为学习起点 - `基于 CSI Kubernetes 存储插件的开发实践 `_ QingCloud公司开发分享的有关CSI原理和开发方法介绍 - `Kubernetes Container Storage Interface (CSI) Documentation `_ 详细全面的开发、部署、测试文档,作为主要参考资料 - `CSI Volume Plugins in Kubernetes Design Doc `_ CSI插件设计文档,非常详细,值得深入学习