了解容器存储接口(在Kubernetes等中)

注意事项 佩雷夫 :在我们对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对象并为端点驱动程序调用CreateVolumeDeleteVolume的边车容器;
  • 外部附加程序是一个sidecar容器,用于监视Kubernetes API中的VolumeAttachment对象,并为端点驱动程序调用ControllerPublishControllerUnpublish命令。

存储制造商/第三方的外部组件


供应商特定的实现。 每个制造商都将必要的API实施为gRPC服务功能的一部分。 例如, GCE PDCeph的实现等。 它们还包含三个组件:

  • 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)插件是一个不错的起点。

参考文献


  1. CSI规范 ;
  2. Kubernetes的边柜 ;
  3. 于洁(Jie Yu)关于KubeCon EU的CSI报告 :CloudNativeCon EU 2018 是此演示文稿的视频-大约翻译)
  4. CSI体系结构文档
  5. Kubernetes关于CSI的最新文档 ;
  6. 不推荐使用的Kubernetes CSI文档

译者的PS


另请参阅我们的博客:

Source: https://habr.com/ru/post/zh-CN424211/


All Articles