本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
为 Kubernetes 引入 Windows CSI 支持 Alpha
用于 Windows 的 CSI 代理的 Alpha 版本将随 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 部署,然后使用代理在节点上执行特权存储操作。
节点插件与 CSI 代理的交互
CSI 代理的设计已在此 KEP 中捕获。下图描述了与 CSI 节点插件和 CSI 代理的交互。
CSI 代理作为进程直接在每个 Windows 节点上的主机上运行——与 kubelet 非常相似。kubelet 中的 CSI 代码与节点驱动注册器组件和 CSI 节点插件进行交互。节点驱动注册器是一个社区维护的 CSI 项目,负责注册特定于供应商的节点插件。kubelet 启动 CSI gRPC 调用,例如图中描述的节点插件上的 NodeStageVolume/NodePublishVolume。节点插件与 CSI 代理进程接口以执行本地主机操作系统存储相关操作,例如卷的创建/枚举、挂载/卸载等。
CSI 代理架构和实现
在 Alpha 版本中,CSI 代理支持以下 API 组:
- 文件系统
- 磁盘
- 卷
- SMB
CSI 代理通过 Windows 命名管道公开每个 API 组。通信通过这些管道使用 gRPC 执行。CSI 代理项目的客户端库使用这些管道与 CSI 代理 API 进行交互。例如,文件系统 API 通过诸如 \.\pipe\csi-proxy-filesystem-v1alpha1
的管道公开,卷 API 在 \.\pipe\csi-proxy-volume-v1alpha1
下公开,依此类推。
从每个 API 组服务中,调用被路由到主机 API 层。主机 API 通过 PowerShell 或 Go 标准库调用来调用主机 Windows 操作系统。例如,当调用文件系统 API Rmdir 时,API 组服务将解码 grpc 结构 RmdirRequest 并找到要删除的目录,然后调用主机 API 层。这将导致调用 os.Remove(一个 Go 标准库调用)来执行删除操作。
控制流详情
下图以 CSI 调用 NodeStageVolume 为例,解释了 kubelet、CSI 插件和 CSI 代理之间为新卷提供存储的交互。在节点插件收到 CSI RPC 调用后,它会相应地向 CSI 代理发出一些调用。NodeStageVolume 调用后,首先使用磁盘 API 调用之一(AzureDisk 驱动程序中的 ListDiskLocations 或 GCE PD 驱动程序中的 GetDiskNumberByName)识别所需磁盘。如果磁盘未分区,则调用 PartitionDisk(磁盘 API 组)。随后,调用 ListVolumesOnDisk、FormatVolume 和 MountVolume 等卷 API 调用来执行其余所需操作。在 NodeUnstageVolume、NodePublishVolume、NodeUnpublishedVolume 等情况下执行类似操作。
当前支持
CSI 代理现已推出 Alpha 版本。您可以在 CSI 代理 GitHub 存储库中找到更多详细信息。目前有两个云提供商为 Windows 上的 CSI 驱动程序提供 Alpha 支持:Azure 和 GCE。
未来计划
Beta 版的一个主要重点领域将是基于 Windows 的构建和 CI/CD 设置,以提高代码库的稳定性和质量。另一个领域是直接使用基于 Go 的调用而不是 PowerShell cmdlet 来提高性能。增强可调试性并添加更多测试是团队将关注的其他领域。
如何参与?
和所有 Kubernetes 项目一样,这个项目也是来自不同背景的众多贡献者共同努力的成果。那些有兴趣参与 CSI 代理设计和开发或 Kubernetes 存储系统任何部分的人,可以加入 Kubernetes 存储特别兴趣小组 (SIG)。我们正在快速发展,并始终欢迎新的贡献者。
对于那些对更多细节感兴趣的人,CSIProxy GitHub 存储库是一个很好的起点。此外,kubernetes slack 上的 #csi-windows 频道可用于讨论 Windows 上的 CSI 特定问题。
致谢
我们要感谢 Michelle Au 在整个 Alpha 之旅中给予我们的指导。我们要感谢 Jean Rougé 在 CSI 代理初期工作中的贡献。我们要感谢 Saad Ali 在项目方面提供的所有指导以及对本博客草稿的评论/反馈。我们要感谢 Patrick Lang 和 Mark Rossetti 在 Windows 特定问题和细节方面的帮助。特别感谢 Andy Zhang 在 Azuredisk 和 Azurefile 工作方面的评论和指导。非常感谢 Paul Burt 和 Karen Chu 对本博客文章的评论和改进建议。
最后但并非最不重要,我们要感谢在项目每个阶段都做出贡献的广大 Kubernetes 社区。