本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.23:Kubernetes 树内到 CSI 卷迁移状态更新

Kubernetes 树内存储插件到容器存储接口 (CSI) 迁移基础设施自 v1.17 版本以来已进入Beta 阶段。CSI 迁移功能在 Kubernetes v1.14 中作为 Alpha 版本引入。

自那时起,SIG Storage 和其他 Kubernetes 专项小组一直在努力确保功能稳定性和兼容性,为 GA 做准备。本文旨在提供该功能的最新状态以及 Kubernetes 1.17 到 1.23 之间的变化。此外,我还将介绍每个存储插件 CSI 迁移功能 GA 的未来路线图。

快速回顾:什么是 CSI 迁移,为什么要迁移?

容器存储接口 (CSI) 旨在帮助 Kubernetes 替换其现有的树内存储驱动机制——特别是特定于供应商的插件。Kubernetes 对容器存储接口的支持自 Kubernetes v1.13 以来已经普遍可用。引入 CSI 驱动程序支持是为了更容易地在 Kubernetes 和存储后端技术之间添加和维护新的集成。使用 CSI 驱动程序可以带来更好的可维护性(驱动程序作者可以定义自己的发布周期和支持生命周期)并减少漏洞发生的机会(树内代码越少,出错的风险就越小,并且集群操作员可以选择集群所需的存储驱动程序)。

随着更多 CSI 驱动程序的创建并投入生产使用,SIG Storage 组希望所有 Kubernetes 用户都能从 CSI 模型中受益。然而,我们不能破坏与现有存储 API 类型的 API 兼容性。我们提出的解决方案是 CSI 迁移:一个将树内 API 转换为等效 CSI API 并将操作委托给替代 CSI 驱动程序的功能。

CSI 迁移工作支持将现有的树内存储插件(如 kubernetes.io/gce-pdkubernetes.io/aws-ebs)替换为存储后端的相应 CSI 驱动程序。如果 CSI 迁移正常工作,Kubernetes 最终用户应该不会注意到任何差异。现有的 StorageClassPersistentVolumePersistentVolumeClaim 对象应继续工作。当 Kubernetes 集群管理员更新集群以启用 CSI 迁移时,利用由树内存储插件支持的 PVC 的现有工作负载将继续像以前一样运行。然而,在幕后,Kubernetes 将所有存储管理操作(以前针对树内驱动程序)的控制权交给 CSI 驱动程序。

例如,假设您是 kubernetes.io/gce-pd 用户,在 CSI 迁移之后,您仍然可以使用 kubernetes.io/gce-pd 来配置新卷、挂载现有 GCE-PD 卷或删除现有卷。所有现有 API/接口仍将正常运行。然而,底层函数调用都通过 GCE PD CSI 驱动程序,而不是树内 Kubernetes 函数。

这使得最终用户能够顺利过渡。此外,作为存储插件开发人员,我们可以减轻维护树内存储插件的负担,并最终将它们从核心 Kubernetes 二进制文件中移除。

有什么变化,有什么新功能?

在 Kubernetes v1.17 及更早版本的工作基础上,自那以后发布的版本进行了一系列更改

新功能门

Kubernetes v1.21 版本废弃了 CSIMigration{provider}Complete 功能标志,并停止对其进行处理。取而代之的是新的功能标志 InTreePlugin{vendor}Unregister,它取代了旧的功能标志并保留了 CSIMigration{provider}Complete 提供的所有功能。

CSIMigration{provider}Complete 之前作为 CSI 迁移在所有节点上启用后的补充功能门引入。此标志注销您使用标志名称的 {provider} 部分指定的树内存储插件。

当您启用该功能门时,您的集群将直接选择并使用相关的 CSI 驱动程序,而不是使用树内驱动程序代码。这发生在不检查 CSI 迁移是否在节点上启用或您是否实际部署了该 CSI 驱动程序的情况下。

虽然这个功能门是一个很好的帮手,但 SIG Storage(我敢肯定,还有许多集群操作员)也希望有一个功能门,让您可以在不启用 CSI 迁移的情况下禁用树内存储插件。例如,您可能希望在 GCE 集群上禁用 EBS 存储插件,因为 EBS 卷是特定于不同供应商的云(AWS)。

为了实现这一点,Kubernetes v1.21 引入了一组新的功能标志:InTreePlugin{vendor}Unregister

InTreePlugin{vendor}Unregister 是一个独立的功能门,可以独立于 CSI 迁移启用和禁用。启用后,组件不会将特定的树内存储插件注册到支持列表中。如果集群操作员只启用此标志,当使用该插件时,最终用户将收到 PVC 错误,指出无法找到该插件。如果集群操作员不希望支持旧的树内 API,而只希望在未来支持 CSI,则无论 CSI 迁移是否启用,都可能希望启用此功能。

可观测性

Kubernetes v1.21 引入了用于跟踪 CSI 迁移的指标。您可以使用这些指标来观察您的集群如何使用存储服务,以及对该存储的访问是使用旧的树内驱动程序还是其基于 CSI 的替代方案。

组件指标备注
Kube-Controller-Managerstorage_operation_duration_seconds指标中添加了一个新标签 migrated,用于指示此存储操作是否为 CSI 迁移操作(true 表示已启用,false 表示未启用)。
Kubeletcsi_operations_seconds新指标公开了包括 driver_namemethod_namegrpc_status_codemigrated 在内的标签。这些标签的含义与 csi_sidecar_operations_seconds 相同。
CSI 边车(provisioner、attacher、resizer)csi_sidecar_operations_seconds指标中添加了一个新标签 migrated,用于指示此存储操作是否为 CSI 迁移操作(true 表示已启用,false 表示未启用)。

错误修复和功能改进

在 Beta 测试人员的帮助下,我们修复了许多错误,例如悬空附件、垃圾回收和不正确的拓扑标签。

云提供商和集群生命周期协作

SIG Storage 一直与 SIG Cloud Provider 和 SIG Cluster Lifecycle 密切合作,以推出 CSI 迁移。

如果您是托管 Kubernetes 服务的用户,请咨询您的提供商是否需要采取任何措施。在许多情况下,提供商将管理迁移,不需要额外的工作。

如果您使用 Kubernetes 发行版,请查阅其官方文档,了解有关此功能支持的信息。对于 CSI 迁移功能毕业到 GA,SIG Storage 和 SIG Cluster Lifecycle 正在合作,以便在 Kubernetes 本身可用时,尽快在工具(例如 kubeadm)中提供迁移机制。

时间表/状态如何?

下表显示了每个驱动程序的当前和目标发布版本

驱动程序AlphaBeta(树内已弃用)测试版 (默认启用)GA目标“树内插件”移除版本
AWS EBS1.141.171.231.24 (目标)1.26 (目标)
GCE PD1.141.171.231.24 (目标)1.26 (目标)
OpenStack Cinder1.141.181.211.24 (目标)1.26 (目标)
Azure Disk1.151.191.231.24 (目标)1.26 (目标)
Azure File1.151.211.24 (目标)1.25 (目标)1.27 (目标)
vSphere1.181.191.24 (目标)1.25 (目标)1.27 (目标)
Ceph RBD1.23
Portworx1.23

以下存储驱动程序将不支持 CSI 迁移。ScaleIO 驱动程序已被移除;其他驱动程序已被弃用并将从核心 Kubernetes 中移除。

驱动程序已弃用代码移除
ScaleIO1.161.22
Flocker1.221.25 (目标)
Quobyte1.221.25 (目标)
StorageOS1.221.25 (目标)

接下来是什么?

随着更多 CSI 驱动程序毕业到 GA,我们希望很快将整个 CSI 迁移功能标记为 GA。我们预计云提供商的树内存储插件代码将在 Kubernetes v1.26 和 v1.27 之前移除。

作为用户,我应该怎么做?

请注意,Kubernetes 存储系统的所有新功能(例如卷快照)将仅添加到 CSI 接口。因此,如果您正在启动一个新集群、首次创建有状态应用程序或需要这些新功能,我们建议原生使用 CSI 驱动程序(而不是树内卷插件 API)。请遵循 更新的 CSI 驱动程序用户指南 并使用新的 CSI API。

然而,如果您选择升级集群或继续使用带有传统卷 API 的规范,CSI 迁移将确保我们继续使用新的 CSI 驱动程序支持这些部署。但是,如果您想利用快照等新功能,则需要手动迁移才能将现有树内 PV 重新导入为 CSI PV。

我如何参与?

Kubernetes Slack 频道 #csi-migration 以及任何标准 SIG Storage 通信渠道 都是联系 SIG Storage 和迁移工作组团队的绝佳方式。

这个项目,和所有 Kubernetes 项目一样,是来自不同背景的许多贡献者共同努力的成果。我们非常感谢这些季度以来帮助推动项目前进的贡献者

  • Michelle Au (msau42)
  • Jan Šafránek (jsafrane)
  • Hemant Kumar (gnufied)

特别感谢以下人员对 CSI 迁移功能的富有见地的审查、周密的考虑和宝贵的贡献

  • Andy Zhang (andyzhangz)
  • Divyen Patel (divyenpatel)
  • Deep Debroy (ddebroy)
  • Humble Devassy Chirammal (humblec)
  • Jing Xu (jingxu97)
  • Jordan Liggitt (liggitt)
  • Matthew Cary (mattcary)
  • Matthew Wong (wongma7)
  • Neha Arora (nearora-msft)
  • Oksana Naumov (trierra)
  • Saad Ali (saad-ali)
  • Tim Bannister (sftim)
  • Xing Yang (xing-yang)

那些有兴趣参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发的人,请加入 Kubernetes 存储特别兴趣小组 (SIG)。我们正在快速成长,并随时欢迎新的贡献者。