配置 MachineHealthCheck

概述

MachineHealthCheck 是 Cluster API 中的一个资源,允许用户定义 Cluster 中的 Machines 在什么条件下应被视为不健康。MachineHealthCheck 在 management cluster 上定义,并作用于特定的 workload cluster。

在定义 MachineHealthCheck 时,用户需要为其定义的每个条件指定一个超时时间,用于检查 Machine 的 Node。如果这些条件中的任意一项在超时时间内持续满足,Machine 将被修复。默认情况下,修复 Machine 的操作应触发创建一个新的 Machine 来替换失败的那个,但 provider 也可以接入更复杂的外部修复方案。

WARNING

MachineHealthCheck 依赖 Cluster API 的滚动更新机制。在滚动更新期间,任何之前附加的磁盘都会被移除,并在新创建的 machines 上替换为新的磁盘。请确保没有集群功能或 workload 依赖存储在原始磁盘上的数据。

前提条件

在尝试配置 MachineHealthCheck 之前,你应该已经有一个可正常工作的 management cluster,并且至少已部署一个 MachineDeployment 或 KubeadmControlPlane。

为 MachineDeployment 配置 MachineHealthCheck

要为 MachineDeployment 配置 MachineHealthCheck,你需要在 management cluster 中创建一个 MachineHealthCheck 资源。

---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineHealthCheck
metadata:
  name: <machinehealthcheck-name>
  namespace: cpaas-system
spec:
  clusterName: <cluster-name>
  nodeStartupTimeout: 30m
  selector:
    matchExpressions:
    - key: cluster.x-k8s.io/deployment-name
      operator: Exists
  unhealthyConditions:
  - type: Ready
    status: Unknown
    timeout: 600s
  - type: Ready
    status: "False"
    timeout: 600s

为 control plane 节点配置 MachineHealthCheck

---
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineHealthCheck
metadata:
  name: <control-plane-machinehealthcheck-name>
  namespace: cpaas-system
spec:
  clusterName: <cluster-name>
  maxUnhealthy: 1
  selector:
    matchLabels:
      cluster.x-k8s.io/control-plane: ""
  unhealthyConditions:
    - type: Ready
      status: Unknown
      timeout: 600s
    - type: Ready
      status: "False"
      timeout: 600s
WARNING

control plane 节点的限制与风险

  • 在 Kubelet 停机时发生 Etcd Leader 失败: 如果不健康的节点当前是 etcd leader,并且其 kubelet 服务已停止,自动修复可能会失败。Cluster API 会尝试在删除节点之前迁移 etcd leadership,但它依赖 kubelet 将请求代理到本地 etcd 实例。如果 kubelet 无响应,则无法进行 leadership 转移,从而阻止轮转。
  • Quorum 丢失风险: 在为 control plane 节点配置 MachineHealthCheck 时请谨慎。过于激进的超时时间或配置错误可能导致移除多个 control plane 节点,从而可能破坏 etcd quorum,并使集群的 control plane 无法使用。

参考

Configure a MachineHealthCheck