本文发布已超过一年。旧文章可能包含过时的内容。请检查页面信息自发布以来是否已不再正确。

卷健康监测 Alpha 更新

CSI 卷健康监控功能最初在 1.19 版本中引入,在 1.21 版本中进行了大幅更新。

为什么要将卷健康监控添加到 Kubernetes?

没有卷健康监控,Kubernetes 在 PVC 被供应并被 Pod 使用后,无法了解存储系统底层卷的状态。在 Kubernetes 中供应卷后,底层存储系统可能会发生许多事情。例如,卷可能在 Kubernetes 外部被意外删除,卷所在的磁盘可能发生故障,容量可能不足,磁盘可能性能下降,等等。即使卷挂载在 Pod 上并被应用使用,之后也可能出现读/写 I/O 错误、文件系统损坏、卷在 Kubernetes 外部被意外卸载等问题。当发生此类问题时,很难调试和检测根本原因。

卷健康监控对 Kubernetes 用户非常有益。它可以与 CSI 驱动通信,检索底层存储系统检测到的错误。可以将 PVC 事件报告给用户以便采取行动。例如,如果卷容量不足,他们可以请求扩容以获得更多空间。

什么是卷健康监控?

CSI 卷健康监控允许 CSI 驱动程序检测底层存储系统的异常卷状况,并将其作为事件报告到 PVC 或 Pod 上。

监控卷并报告卷健康信息的 Kubernetes 组件包括:

  • Kubelet 除了收集现有的卷统计信息外,还将监控该节点上 PVC 的卷健康状况。如果 PVC 存在异常健康状况,则将在使用该 PVC 的 Pod 对象上报告一个事件。如果多个 Pod 使用同一个 PVC,则将在所有使用该 PVC 的 Pod 上报告事件。
  • 一个 外部卷健康监控控制器 监控 PVC 的卷健康状况,并在 PVC 上报告事件。

请注意,此功能最初在 Kubernetes 1.19 版本中引入时,节点侧卷健康监控逻辑是一个外部代理。在 Kubernetes 1.21 中,节点侧卷健康监控逻辑已从外部代理移至 Kubelet,以避免重复调用 CSI 函数。随着 1.21 中的这一变化,为 Kubelet 中的卷健康监控逻辑引入了一个新的 alpha Feature Gate CSIVolumeHealth

目前,卷健康监控功能仅提供信息,因为它只报告 PVC 或 Pod 上的异常卷健康事件。用户需要检查这些事件并手动解决问题。此功能是 Kubernetes 未来实现卷健康问题的程序化检测和解决的垫脚石。

如何在 Kubernetes 集群中使用卷健康?

要使用卷健康功能,首先确保你使用的 CSI 驱动支持此功能。请参阅此 CSI 驱动文档 以了解哪些 CSI 驱动支持此功能。

要从节点侧启用卷健康监控,需要启用 alpha Feature Gate CSIVolumeHealth

如果 CSI 驱动支持控制器侧的卷健康监控功能,则有关异常卷状况的事件将记录在 PVC 上。

如果 CSI 驱动支持控制器侧的卷健康监控功能,并且在部署外部健康监控控制器时将 enable-node-watcher 标志设置为 true,则用户还可以获取有关节点故障的事件。当检测到节点故障事件时,将在 PVC 上报告一个事件,指示使用此 PVC 的 Pod 位于故障节点上。

如果 CSI 驱动支持节点侧的卷健康监控功能,则有关异常卷状况的事件将记录在使用 PVC 的 Pod 上。

作为存储供应商,如何为我的 CSI 驱动添加卷健康支持?

卷健康监控包括两个部分:

  • 外部卷健康监控控制器从控制器侧监控卷健康状况。
  • Kubelet 从节点侧监控卷健康状况。

详细信息请参阅 CSI 规范Kubernetes-CSI 驱动开发者指南

CSI Host Path 驱动 中有一个卷健康示例实现。

控制器侧卷健康监控

要了解如何部署外部卷健康监控控制器,请参阅 CSI 文档中的 CSI external-health-monitor-controller

外部健康监控控制器调用 ListVolumesControllerGetVolume CSI RPC,并在检测到异常卷状况时在 PVC 上报告带有消息的 VolumeConditionAbnormal 事件。只有具有 LIST_VOLUMESVOLUME_CONDITION 控制器功能或 GET_VOLUMEVOLUME_CONDITION 控制器功能的 CSI 驱动才支持外部控制器中的卷健康监控。

要从控制器侧实现卷健康功能,CSI 驱动必须添加对新控制器功能的支持。

如果 CSI 驱动支持 LIST_VOLUMESVOLUME_CONDITION 控制器功能,它必须实现控制器 RPC ListVolumes 并在响应中报告卷状况。

如果 CSI 驱动支持 GET_VOLUMEVOLUME_CONDITION 控制器功能,它必须实现控制器 RPC ControllerGetVolume 并在响应中报告卷状况。

如果 CSI 驱动支持 LIST_VOLUMESGET_VOLUMEVOLUME_CONDITION 控制器功能,外部健康监控控制器将仅调用 ListVolumes CSI RPC。

节点侧卷健康监控

Kubelet 调用 NodeGetVolumeStats CSI RPC,并在检测到异常卷状况时在 Pod 上报告带有消息的 VolumeConditionAbnormal 事件。只有具有 VOLUME_CONDITION 节点功能的 CSI 驱动才支持 Kubelet 中的卷健康监控。

要从节点侧实现卷健康功能,CSI 驱动必须添加对新节点功能的支持。

如果 CSI 驱动支持 VOLUME_CONDITION 节点功能,它必须在节点 RPC NodeGetVoumeStats 中报告卷状况。

下一步是什么?

根据反馈和采纳情况,Kubernetes 团队计划在 1.22 或 1.23 版本中将 CSI 卷健康实现推向 Beta 版。

我们还在探索如何在 Kubernetes 中使用卷健康信息进行程序化检测和自动协调。

如何了解更多信息?

要了解卷健康监控的设计详情,请阅读 卷健康监控 增强提案。

卷健康监测器控制器源代码位于 https://github.com/kubernetes-csi/external-health-monitor

卷健康检查的更多详细信息也可在 容器存储接口文档 中找到。

如何参与?

Kubernetes Slack 频道 #csi 和任何 SIG Storage 标准交流渠道 都是联系 SIG Storage 和 CSI 团队的绝佳途径。

我们要向帮助在 1.21 版本中发布此功能的贡献者们致以最诚挚的感谢。感谢 Yuquan Ren (NickrenREN) 在 external health monitor 代码仓库中实现了最初的卷健康监测器控制器和代理,感谢 Ran Xu (fengzixu) 在 1.21 版本中将卷健康监测逻辑从外部代理迁移到了 Kubelet,我们还要特别感谢以下人员富有见地的评审意见:David Ashpole (dashpole)、Michelle Au (msau42)、David Eads (deads2k)、Elana Hashman (ehashman)、Seth Jennings (sjenning) 和 Jiawei Wang (Jiawei0227)。

对参与 CSI 或 Kubernetes 存储系统任何部分的设计和开发感兴趣的人,请加入 Kubernetes 存储特别兴趣小组 (SIG)。我们正在快速发展,始终欢迎新的贡献者。