本文发布时间已超过一年。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。
卷运行状况监控 Alpha 更新
最初在 1.19 版本中引入的 CSI 卷健康监控功能,在 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 中这一更改,引入了一个新的 alpha 功能门 CSIVolumeHealth
用于 Kubelet 中的卷健康监控逻辑。
目前,卷健康监控功能仅提供信息,因为它只报告 PVC 或 Pod 上异常的卷健康事件。用户将需要检查这些事件并手动修复问题。此功能是 Kubernetes 未来对卷健康问题进行编程检测和解决的垫脚石。
如何在我的 Kubernetes 集群上使用卷健康状况?
要使用卷健康功能,首先请确保您使用的 CSI 驱动程序支持此功能。请参阅此 CSI 驱动程序文档 以了解哪些 CSI 驱动程序支持此功能。
要从节点端启用卷健康监控,需要启用 alpha 功能门 CSIVolumeHealth
。
如果 CSI 驱动程序支持来自控制器端的卷健康监控功能,则有关异常卷状况的事件将记录在 PVC 上。
如果 CSI 驱动程序支持来自控制器端的卷健康监控功能,如果部署外部健康监控控制器时将 enable-node-watcher
标志设置为 true,用户还可以获得有关节点故障的事件。当检测到节点故障事件时,将在 PVC 上报告一个事件,以指示使用此 PVC 的 Pod 位于失败的节点上。
如果 CSI 驱动程序支持来自节点端的卷健康监控功能,则有关异常卷状况的事件将记录在使用 PVC 的 Pod 上。
作为存储供应商,我如何为我的 CSI 驱动程序添加卷健康支持?
卷健康监控包括两个部分
- 外部卷健康监控控制器从控制器端监控卷健康状况。
- Kubelet 从节点端监控卷健康状况。
有关详细信息,请参阅 CSI 规范 和 Kubernetes-CSI 驱动程序开发人员指南。
在 CSI 主机路径驱动程序 中有一个卷健康状况的示例实现。
控制器端卷健康监控
要了解如何部署外部卷健康监控控制器,请参阅 CSI 文档中的 CSI external-health-monitor-controller。
如果检测到异常的卷状况,外部健康监控控制器会调用 ListVolumes
或 ControllerGetVolume
CSI RPC,并在 PVC 上报告带有消息的 VolumeConditionAbnormal 事件。只有具有 LIST_VOLUMES
和 VOLUME_CONDITION
控制器功能或 GET_VOLUME
和 VOLUME_CONDITION
控制器功能的 CSI 驱动程序才支持外部控制器中的卷健康监控。
要从控制器端实现卷健康功能,CSI 驱动程序必须添加对新控制器功能的支持。
如果 CSI 驱动程序支持 LIST_VOLUMES
和 VOLUME_CONDITION
控制器功能,则它必须实现控制器 RPC ListVolumes
并在响应中报告卷状况。
如果 CSI 驱动程序支持 GET_VOLUME
和 VOLUME_CONDITION
控制器功能,则它必须实现控制器 PRC ControllerGetVolume
并在响应中报告卷状况。
如果 CSI 驱动程序支持 LIST_VOLUMES
、GET_VOLUME
和 VOLUME_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 存储通信渠道 都是联系 SIG 存储和 CSI 团队的好方法。
我们非常感谢在 1.21 中帮助发布此功能的贡献者。我们要感谢 Yuquan Ren (NickrenREN),他在外部健康监控存储库中实现了初始的卷健康监控控制器和代理,感谢 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)。我们正在快速发展,并且始终欢迎新的贡献者。