注意事项 佩雷夫 :在我们对K8s 1.9发行版的评论中,我们首先谈到了所谓的Kubernetes(树外CSI卷插件)存储插件,该功能以alpha版本状态出现。 新材料的作者Anoop Vijayan Maniankara(芬兰Tuxera公司的DevOps首席工程师)收集了有关这些构想和CSI设备的关键信息,这有助于快速熟悉新概念,据我们的一些员工称,“新概念将是下一件大事”。 为了对CSI进行更详细的技术研究,本文结尾给出了有用的链接,其中我特别强调了本规范的一位作者(Jie Yu)的介绍。 但是无论如何,还是值得从“大局”开始的...
容器存储接口(CSI)是一项旨在统一容器编排系统(例如Kubernetes,Mesos,Docker Swarm,Cloud Foundry等)中的Ceph,Portworx,NetApp等存储接口的计划。 这个想法是确保存储制造商实施一个CSI可以与所有这些系统一起使用。
图片来源: 于钰(Jie Yu)在CloudNativeCon EU 2018上的CSI报告请注意 :本文仅讨论动态配置。 预先配置的卷和弹性卷超出其范围。 如果您想更好地理解将要讨论的内容,则应首先阅读Kubernetes文档 。 此外,本文不会深入介绍CSI实施的细节。 我将提供有关CSI的高级概述,并为创建CSI卷奠定基础。 最后,Kubernetes信息用于示例和详细信息的链接。在深入探讨该主题之前,了解Kubernetes中的小车容器也很重要。 它们扩展了位于同一炉膛中的主容器(
main )的功能,共享存储和网络。
在撰写本文时
(2018年8月13日), CSI组件具有以下版本:

CSI之前
CSI的第一版-v0.1-于2017年12月发布。 当然,甚至可以在编排系统出现之前为外部存储进行调配。 就Kubernetes而言,卷插件-卷插件负责存储需求:

从上图可以看到,此类插件是业务流程系统核心的一部分。 因此,发生了
CSI体系结构文档中提到的以下问题:
- 批量插件的开发与Kubernetes版本密切相关并依赖于它。
- Kubernetes开发人员/社区负责测试和支持所有插件,而不仅仅是测试和维护稳定的插件API。
- 批量插件中的错误不仅会丢弃插件本身,还会丢弃关键的Kubernetes组件。
- 插件获得Kubernetes组件的全部特权(kubelet和kube-controller-manager);
- 插件开发人员被迫发布插件的源代码,并且无法选择二进制文件的路径。
了解CSI
在CSI的引入下,Kubernetes团队发布了不属于内核的外部组件,这些组件旨在与制造商提供的其他外部组件进行交互。 它们使用
gRPC通过域套接字
(UNIX域套接字-大约翻译) 相互通信 。

Kubernetes的外部组件
它们由Kubernetes团队完全实施和支持,并将Kubernetes的活动扩展到Kubernetes之外。 制造商完全不必担心其实现的功能。 由三部分组成:
- Driver registrar是一个sidecar容器,用于在kubelet中注册CSI驱动程序,并将
NodeId
驱动程序添加到Kubernetes API中的节点对象标签。 为此,它与Identity CSI驱动程序服务交互(有关更多详细信息,请参见下文-大约翻译),并在CSI上调用GetNodeId
。 - 外部供应商 -监视Carbernetes API中的PersistentVolumeClaim对象并为端点驱动程序调用
CreateVolume
和DeleteVolume
的边车容器; - 外部附加程序是一个sidecar容器,用于监视Kubernetes API中的VolumeAttachment对象,并为端点驱动程序调用
ControllerPublish
和ControllerUnpublish
命令。
存储制造商/第三方的外部组件
供应商特定的实现。 每个制造商都将必要的API实施为gRPC服务功能的一部分。 例如,
GCE PD或
Ceph的实现等。 它们还包含三个组件:
- CSI身份 -主要用于识别插件:确保其有效,返回有关插件的基本信息;
service Identity { // rpc GetPluginInfo(GetPluginInfoRequest) returns (GetPluginInfoResponse) {} // , Controller rpc GetPluginCapabilities(GetPluginCapabilitiesRequest) returns (GetPluginCapabilitiesResponse) {} // , , rpc Probe (ProbeRequest) returns (ProbeResponse) {} }
( kubernetes-csi-identity.proto ) - CSI Controller负责控制和管理卷:创建,删除,附加/分离,快照等。
service Controller { // provisioning rpc CreateVolume (CreateVolumeRequest) returns (CreateVolumeResponse) {} // rpc DeleteVolume (DeleteVolumeRequest) returns (DeleteVolumeResponse) {} // rpc ControllerPublishVolume (ControllerPublishVolumeRequest) returns (ControllerPublishVolumeResponse) {} // rpc ControllerUnpublishVolume (ControllerUnpublishVolumeRequest) returns (ControllerUnpublishVolumeResponse) {} // , / rpc ValidateVolumeCapabilities (ValidateVolumeCapabilitiesRequest) returns (ValidateVolumeCapabilitiesResponse) {} // rpc ListVolumes (ListVolumesRequest) returns (ListVolumesResponse) {} // rpc GetCapacity (GetCapacityRequest) returns (GetCapacityResponse) {} // , GetCapacity Snapshotting rpc ControllerGetCapabilities (ControllerGetCapabilitiesRequest) returns (ControllerGetCapabilitiesResponse) {} // rpc CreateSnapshot (CreateSnapshotRequest) returns (CreateSnapshotResponse) {} // rpc DeleteSnapshot (DeleteSnapshotRequest) returns (DeleteSnapshotResponse) {} // rpc ListSnapshots (ListSnapshotsRequest) returns (ListSnapshotsResponse) {} }
( kubernetes-csi-controller.proto ) - CSI节点负责监视Kubernetes主机上的卷活动。
service Node { // staging- rpc NodeStageVolume (NodeStageVolumeRequest) returns (NodeStageVolumeResponse) {} // staging- rpc NodeUnstageVolume (NodeUnstageVolumeRequest) returns (NodeUnstageVolumeResponse) {} // staging rpc NodePublishVolume (NodePublishVolumeRequest) returns (NodePublishVolumeResponse) {} // rpc NodeUnpublishVolume (NodeUnpublishVolumeRequest) returns (NodeUnpublishVolumeResponse) {} // rpc NodeGetVolumeStats (NodeGetVolumeStatsRequest) returns (NodeGetVolumeStatsResponse) {} // ID rpc NodeGetId (NodeGetIdRequest) returns (NodeGetIdResponse) { option deprecated = true; } // (capabilities) rpc NodeGetCapabilities (NodeGetCapabilitiesRequest) returns (NodeGetCapabilitiesResponse) {} // NodeGetId rpc NodeGetInfo (NodeGetInfoRequest) returns (NodeGetInfoResponse) {} }
( kubernetes-csi-node.proto )
结论
CSI的出现为业务流程系统和存储制造商带来了明显的好处。 此外,定义明确的接口有助于开发人员和未来的编排系统的CSI的简单实现和测试。 如果您在阅读完本文后决定开始实施CSI,那么Fatih Arslan的方法
如何编写容器存储接口(CSI)插件是一个不错的起点。
参考文献
- CSI规范 ;
- Kubernetes的边柜 ;
- 于洁(Jie Yu)关于KubeCon EU的CSI报告 :CloudNativeCon EU 2018 ( 这是此演示文稿的视频-大约翻译) ;
- CSI体系结构文档
- Kubernetes关于CSI的最新文档 ;
- 不推荐使用的Kubernetes CSI文档 。
译者的PS
另请参阅我们的博客: