本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
卷健康监控 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功能门`CSIVolumeHealth`。
目前,卷健康监控功能仅提供信息,因为它只报告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外部健康监控控制器。
如果检测到异常卷状况,外部健康监控控制器会调用`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 Storage通信渠道都是联系SIG Storage和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)。我们正在快速发展,并始终欢迎新的贡献者。