这篇文章已超过一年。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已失效。

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

Kubernetes in-tree 存储插件到 容器存储接口 (CSI) 的迁移基础设施自 v1.17 起已达到 Beta 阶段。CSI 迁移作为 Alpha 功能在 Kubernetes v1.14 中引入。

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

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

容器存储接口 (CSI) 旨在帮助 Kubernetes 替换其现有的 in-tree 存储驱动机制,特别是特定于供应商的插件。Kubernetes 对 容器存储接口 的支持自 Kubernetes v1.13 起已正式发布 (GA)。引入对使用 CSI 驱动的支持是为了更容易地在 Kubernetes 和存储后端技术之间添加和维护新的集成。使用 CSI 驱动可以提高可维护性(驱动作者可以定义自己的发布周期和支持生命周期),并减少漏洞的可能性(in-tree 代码更少,出错的风险降低,集群操作员可以只选择其集群所需的存储驱动)。

随着越来越多的 CSI 驱动被创建并达到生产就绪状态,SIG Storage 小组希望所有 Kubernetes 用户都能从 CSI 模型中受益。然而,我们不能破坏与现有存储 API 类型的 API 兼容性。我们提出的解决方案是 CSI 迁移:这是一个将 in-tree API 转换为等效 CSI API 并将操作委托给替代 CSI 驱动的功能。

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

例如,假设你是 kubernetes.io/gce-pd 用户,在 CSI 迁移后,你仍然可以使用 kubernetes.io/gce-pd 来供应新卷、挂载现有 GCE-PD 卷或删除现有卷。所有现有的 API/接口仍然会正常工作。然而,底层函数调用都将通过 GCE PD CSI 驱动 来完成,而不是 in-tree 的 Kubernetes 函数。

这为最终用户实现了平滑过渡。此外,作为存储插件开发者,我们可以减轻维护 in-tree 存储插件的负担,并最终将它们从核心 Kubernetes 二进制文件中移除。

有哪些变化,又有哪些新特性?

基于 Kubernetes v1.17 及早期版本所做的工作,后续版本进行了一系列更改

新的特性门控

Kubernetes v1.21 版本弃用了 CSIMigration{provider}Complete 特性标志,并停止遵循它们。取而代之的是名为 InTreePlugin{vendor}Unregister 的新特性标志,这些新标志取代了旧的特性标志并保留了 CSIMigration{provider}Complete 提供的所有功能。

CSIMigration{provider}Complete 之前作为辅助特性门控引入,一旦在所有节点上启用了 CSI 迁移,就可以使用它。该标志会注销你在标志名称的 {provider} 部分指定的 in-tree 存储插件。

当你启用该特性门控时,你的集群将直接选择并使用相关的 CSI 驱动,而不是使用 in-tree 驱动代码。这样做不会检查节点上是否启用了 CSI 迁移,也不会检查你是否实际上部署了该 CSI 驱动。

尽管这个特性门控非常有用,但 SIG Storage(我相信还有许多集群操作员)也想要一个特性门控,即使不启用 CSI 迁移,也能禁用 in-tree 存储插件。例如,你可能想在 GCE 集群上禁用 EBS 存储插件,因为 EBS 卷是特定于其他供应商的云(AWS)。

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

InTreePlugin{vendor}Unregister 是一个独立的特性门控,可以独立于 CSI 迁移启用或禁用。启用后,组件不会将特定的 in-tree 存储插件注册到支持列表中。如果集群操作员只启用此标志,则当使用该插件时,终端用户会从 PVC 收到一个错误,指示找不到该插件。如果集群操作员不想支持遗留的 in-tree API 并只支持 CSI,则无论 CSI 迁移是否启用,都可能想要启用此功能。

可观测性

Kubernetes v1.21 引入了用于跟踪 CSI 迁移的 指标。你可以使用这些指标来观察你的集群如何使用存储服务,以及对该存储的访问是使用遗留的 in-tree 驱动还是基于 CSI 的替代方案。

组件指标说明
Kube-Controller-Managerstorage_operation_duration_seconds指标中添加了一个新的标签 migrated,用于指示此存储操作是否是 CSI 迁移操作(启用时字符串值为 true,未启用时为 false)。
Kubeletcsi_operations_seconds新指标暴露的标签包括 driver_namemethod_namegrpc_status_codemigrated。这些标签的含义与 csi_sidecar_operations_seconds 相同。
CSI Sidecar(provisioner, attacher, resizer)csi_sidecar_operations_seconds指标中添加了一个新的标签 migrated,用于指示此存储操作是否是 CSI 迁移操作(启用时字符串值为 true,未启用时为 false)。

Bug 修复和功能改进

在 Beta 测试人员的帮助下,我们修复了许多 Bug,例如悬空挂载、垃圾回收、不正确的拓扑标签等。

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

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

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

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

时间线 / 状态如何?

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

驱动AlphaBeta(in-tree 弃用)Beta(默认开启)GA目标“in-tree 插件”移除版本
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。我们预计云提供商 in-tree 存储插件的代码将在 Kubernetes v1.26 和 v1.27 版本中移除。

作为用户,我该怎么做?

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

但是,如果你选择升级集群或继续使用遗留卷 API 的规范,CSI 迁移将确保我们继续使用新的 CSI 驱动支持这些部署。然而,如果你想利用快照等新功能,则需要手动迁移以将现有的 in-tree 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 Storage 特别兴趣小组 (SIG)。我们正在快速发展,并始终欢迎新的贡献者。