Kubernetes实战:构建生产级应用平台
上QQ阅读APP看书,第一时间看更新

4.3 容器存储接口

容器存储接口(CSI)是针对如何向工作负载提供块和文件存储的解决方案。CSI的实现被称为驱动程序,它具有与存储服务商交互的操作知识。这些服务商包括一些云系统,如Google Persistent Disks(https://cloud.google.com/persistent-disk),以及由你部署和管理的存储系统(如Ceph(https://ceph.io))。驱动程序是由存储服务商自己的单独项目实现的。它们可以完全自己进行管理。

在更高层次上,CSI的实现有一个控制器插件和一个节点插件。CSI驱动程序开发者在如何实现这些组件方面有很大的灵活性。驱动程序的实现通常将控制器和节点插件捆绑在同一个二进制文件中,并通过一个环境变量(如X_CSI_MODE)启用其中一个模式。唯一的要求是驱动程序需要与kubelet注册,并实现CSI规范中的端点。

控制器服务负责管理存储提供者中卷的创建和删除。这个功能可延伸到(可选)拍摄卷的快照和扩展卷。节点服务负责准备被节点上的Pod所消耗的卷。通常这意味着设置挂载和报告节点上卷的信息。节点和控制器服务也都实现了身份服务,报告插件信息、能力以及插件是否健康。考虑到这一点,图4-1表示一个部署了这些组件的集群架构。

图4-1:运行CSI插件的集群。驱动程序以节点和控制器模式运行。节点服务被部署为DaemonSet,在每个主机上放置一个Pod

让我们深入了解一下这两个组件——控制器和节点。

4.3.1 CSI控制器

CSI控制器服务是为管理持久化存储系统中的卷所提供的API。由于Kubernetes控制平面不与CSI控制器服务直接互动,而是由Kubernetes存储社区维护的一些控制器对Kubernetes事件进行处理并将其转化为CSI指令,比如创建新PersistentVolumeClaim时的CreateVolumeRequest。CSI控制器服务通过UNIX套接字暴露其API,所以这些由社区维护的控制器通常作为附加组件与CSI控制器服务一起部署。有多个具有不同行为的外部控制器。

外部供应器(external-provisioner)

当PersistentVolumeClaims被创建时,它会请求从CSI驱动创建一个卷。一旦卷在存储服务商中被创建,这个供应器就会在Kubernetes中创建一个PersistentVolume对象。

外部附加器(external-attacher)

观察VolumeAttachment对象,它会声明一个卷应该从一个节点上被附加或分离,并向CSI驱动程序发送附加或分离请求。

外部调整器(external-resizer)

检测PersistentVolumeClaim中存储大小的变化,并向CSI驱动程序发送扩展的请求。

外部快照器(external-snapshotter)

当VolumeSnapshotContent对象被创建时,快照将被发送到CSI驱动程序。

在实现CSI插件时,开发人员不需要使用上述的控制器。但是我们鼓励使用这些控制器,以防止每个CSI插件中的逻辑重复。

4.3.2 CSI节点

节点插件通常运行与控制器插件相同的驱动程序代码。然而,在“节点模式”下运行意味着它专注于一些任务,如挂载附加卷、建立它们的文件系统以及挂载卷到Pod。这些行为的请求是通过kubelet完成的。除了驱动程序之外,下面的附加组件也经常被包含在Pod中。

节点驱动注册器(node-drive-registrar)

向kubelet发送一个注册请求(https://oreil.ly/kmkJh),使其能够发现CSI驱动程序。

存活探测器(liveness-probe)

报告CSI驱动程序的健康状况。