为Kubernetes引入Windows CSI支持Alpha

作者: 作者:Deep Debroy [Docker],Jing Xu [Google],Krishnakumar R(KK)[Microsoft]

的Alpha版本 CSI代理 用于Windows的Kubernetes 1.18已发布。 CSI代理通过允许Windows中的容器执行特权存储操作来启用Windows上的CSI驱动程序。

背景

Kubernetes的容器存储接口(CSI)在Kubernetes 1.13版本中成为了GA。 CSI已成为将块和文件存储暴露给诸如Kubernetes之类的容器编排系统(CO)上的容器化工作负载的标准。它使第三方存储提供商可以编写和部署插件,而无需更改核心的Kubernetes代码库。所有新的存储功能都将使用CSI,因此使CSI驱动程序在Windows上运行非常重要。

Kubernetes中的CSI驱动程序具有两个主要组件:控制器插件和节点插件。控制器插件通常不需要直接访问主机,并且可以通过Kubernetes API和外部控制平面服务(例如云存储服务)执行其所有操作。但是,节点插件需要直接访问主机,以使块设备和/或文件系统可用于Kubernetes kubelet。 Windows上的容器以前无法做到这一点。随着发布 CSI代理,CSI驱动程序现在可以在节点上执行存储操作。这反过来又使容器化CSI驱动程序可以在Windows上运行。

Windows群集的CSI支持

建议将CSI驱动程序(例如AzureDisk,GCE PD等)部署为容器。 CSI驱动程序的节点插件通常在群集中的每个工作节点上运行(作为DaemonSet)。节点插件容器需要以提升的特权运行才能执行与存储相关的操作。但是,Windows当前不支持特权容器。为了解决这个问题, CSI代理 这样,节点插件现在可以作为非特权Pod部署,然后使用代理在节点上执行特权存储操作。

节点插件与CSIProxy的交互

CSI代理的设计在此捕获。 韩国环保局 。下图描述了与CSI节点插件和CSI代理的交互。

CSI代理作为进程直接在每个Windows节点上的主机上运行-非常类似于kubelet。 kubelet中的CSI代码与 节点驱动程序注册器 组件和CSI节点插件。节点驱动程序注册器是社区维护的CSI项目,用于处理供应商特定的节点插件的注册。如图所示,kubelet在节点插件上启动CSI gRPC调用,例如NodeStageVolume / NodePublishVolume。节点插件与CSIProxy进程接口,以执行与本地主机OS存储相关的操作,例如卷的创建/枚举,安装/卸载等。

CSI代理架构和实现

在Alpha版本中,CSIProxy支持以下API组:

  1. 文件系统
  2. 磁碟
  3. 中小型企业

CSI proxy exposes each API group via a Windows named pipe. The communication is performed using gRPC over these pipes. The client library from the CSI proxy project uses these pipes to interact with the CSI proxy APIs. For example, the filesystem APIs are exposed via a pipe like \.\pipe\csi-proxy-filesystem-v1alpha1 and volume APIs under the \.\pipe\csi-proxy-volume-v1alpha1, and so on.

调用从每个API组服务路由到主机API层。主机API通过Powershell或Go标准库调用调用到主机Windows OS中。例如,当文件系统API Rmdir 称为API组服务将解码grpc结构 RmdirRequest 并找到要删除的目录,然后调用Host APIs层。这将导致呼叫 os.RemoveGo标准库调用,以执行删除操作。

控制流细节

下图以CSI调用NodeStageVolume为例,解释了kubelet,CSI插件和CSI代理之间的交互,以提供新的卷。节点插件收到CSI RPC调用后,它将相应地对CSIproxy进行一些调用。作为NodeStageVolume调用的结果,首先使用以下两个磁盘API调用来标识所需的磁盘:ListDiskLocations(在AzureDisk驱动程序中)或GetDiskNumberByName(在GCE PD驱动程序中)。如果磁盘未分区,则将调用PartitionDisk(磁盘API组)。随后,将调用Volume API调用,例如ListVolumesOnDisk,FormatVolume和MountVolume,以执行其余所需的操作。在NodeUnstageVolume,NodePublishVolume,NodeUnpublishedVolume等情况下执行类似的操作。

当前支持

CSI代理现在可作为Alpha版本使用。您可以在 CSI代理 GitHub存储库。当前有两个云提供程序为Windows上的CSI驱动程序提供alpha支持:Azure和GCE。

未来的计划

Beta中重点关注的一个关键领域是基于Windows的构建和CI / CD设置,以提高代码库的稳定性和质量。另一个领域是直接使用基于Go的调用而不是Powershell Commandlet来提高性能。团队还将研究其他领域,即提高可调试性和添加更多测试。

如何参与?

与所有Kubernetes一样,该项目是来自不同背景的许多贡献者共同努力的结果。那些有兴趣参与CSI Proxy或Kubernetes Storage System的任何部分的设计和开发的人,可以加入 Kubernetes存储特别兴趣小组 (SIG)。我们正在迅速发展,并随时欢迎新的贡献者。

对于那些对更多细节感兴趣的人, CSI代理 GitHub存储库是一个不错的起点。除此之外 #csi-windows kubernetes松弛上的通道可用于特定于Windows上CSI的讨论。

致谢

我们要感谢Michelle Au在整个alpha测试过程中为我们提供的指导。我们要感谢JeanRougé在最初的CSI代理工作中所做的贡献。我们要感谢Saad Ali提供有关该项目的所有指导,并感谢本博客草稿的审阅/反馈。我们要感谢Patrick Lang和Mark Rossetti帮助我们解决Windows特定的问题和细节。特别感谢Andy Zhang对Azuredisk和Azurefile工作的评论和指导。非常感谢Paul Burt和Karen Chu对本文的改进和建议。

最后但并非最不重要的一点,我们要感谢更广泛的Kubernetes社区,他们在项目的每个步骤中都做出了贡献。