配置 MachineHealthCheck

概述

MachineHealthCheck 是 Cluster API 中的一种资源,允许用户定义用于判断 Cluster 中 Machine 是否不健康的条件。MachineHealthCheck 定义在管理集群上,并限定作用于特定的业务集群。

定义 MachineHealthCheck 时,用户需要为所定义的每个条件指定超时时间,这些条件用于检查 Machine 的节点。如果任一条件在超时时间内持续满足,系统将对该 Machine 执行修复。默认情况下,修复 Machine 的操作应触发创建新的 Machine 来替换故障 Machine,但 provider 可以接入更复杂的外部修复方案。

WARNING

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

前提条件

在尝试配置 MachineHealthCheck 之前,您应拥有一个正常运行的管理集群,并且其中至少已部署一个 MachineDeployment 或 KubeadmControlPlane。若要在 global 集群本身上使用 MachineHealthCheck,必须先在 global 上安装基础设施 provider 和 Cluster Bootstrap Provider;请参阅在 Alauda OS 集群上管理节点。

为 MachineDeployment 配置 MachineHealthCheck

要为 MachineDeployment 配置 MachineHealthCheck,您需要在管理集群中创建 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

为控制平面节点配置 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

控制平面节点的限制和风险

  • Etcd leader 故障与 Kubelet 停机:如果不健康的节点当前是 etcd leader,且其 kubelet 服务已停止,自动修复可能会失败。Cluster API 会在删除节点前尝试迁移 etcd leader,但依赖 kubelet 将请求代理到本地 etcd 实例。如果 kubelet 无响应,则无法继续执行 leader 转移,从而阻止轮换。
  • 丢失法定人数的风险:为控制平面节点配置 MachineHealthCheck 时请谨慎。过于激进的超时时间或错误配置可能导致移除多个控制平面节点,从而破坏 etcd 法定人数,使集群的控制平面无法使用。
    WARNING

参考

配置 MachineHealthCheck