×

使用故障域实现高可用性和容错性

如果可能,控制平面机器集会在多个故障域中分布控制平面机器。此配置在控制平面内提供高可用性和容错性。当基础架构提供商出现问题时,此策略可以帮助保护控制平面。

故障域平台支持和配置

控制平面机器集的故障域概念类似于云提供商上的现有概念。并非所有平台都支持使用故障域。

表 1. 故障域支持矩阵
云提供商 故障域支持 提供商命名法

Amazon Web Services (AWS)

X

可用区 (AZ)

Google Cloud Platform (GCP)

X

区域

Microsoft Azure

X

Azure 可用区

Nutanix

X

故障域

Red Hat OpenStack Platform (RHOSP)

X

OpenStack Nova 可用区OpenStack Cinder 可用区

VMware vSphere

X

映射到 vSphere 区域的故障域[1]

  1. 有关更多信息,请参阅“VMware vCenter 的区域和区域”。

控制平面机器集自定义资源 (CR) 中的故障域配置是特定于平台的。有关 CR 中故障域参数的更多信息,请参阅您提供商的示例故障域配置。

平衡控制平面机器

控制平面机器集会在自定义资源 (CR) 中指定的故障域之间平衡控制平面机器。

如果可能,控制平面机器集将平等地使用每个故障域,以确保适当的容错性。如果故障域少于控制平面机器,则将按名称字母顺序选择故障域以重复使用。对于未指定故障域的集群,所有控制平面机器都将放置在一个故障域中。

对故障域配置的一些更改会导致控制平面机器集重新平衡控制平面机器。例如,如果您向故障域少于控制平面机器的集群中添加故障域,则控制平面机器集会重新平衡所有可用故障域中的机器。

恢复故障的控制平面机器

控制平面机器集运算符会自动恢复控制平面机器。当删除控制平面机器时,运算符会使用 `ControlPlaneMachineSet` 自定义资源 (CR) 中指定的配置创建一个替换。

对于使用控制平面机器集的集群,您可以配置机器运行状况检查。机器运行状况检查会删除不正常的控制平面机器,以便对其进行替换。

如果您为控制平面配置 `MachineHealthCheck` 资源,请将 `maxUnhealthy` 的值设置为 `1`。

此配置可确保当多个控制平面机器似乎不正常时,机器运行状况检查不会采取任何措施。多个不正常的控制平面机器可能表示 etcd 集群已降级,或者正在进行替换故障机器的缩放操作。

如果 etcd 集群降级,可能需要手动干预。如果正在进行扩展操作,则机器健康检查应允许其完成。

使用机器生命周期钩子进行仲裁保护

对于使用机器 API 运算符的 OpenShift Container Platform 集群,etcd 运算符使用机器删除阶段的生命周期钩子来实现仲裁保护机制。

通过使用preDrain生命周期钩子,etcd 运算符可以控制何时清空和移除控制平面机器上的 Pod。为了保护 etcd 仲裁,etcd 运算符会阻止移除 etcd 成员,直到它将该成员迁移到集群中的新节点。

此机制允许 etcd 运算符精确控制 etcd 仲裁的成员,并允许机器 API 运算符在无需特定操作 etcd 集群知识的情况下安全地创建和移除控制平面机器。

具有仲裁保护处理顺序的控制平面删除

当在使用控制平面机器集的集群上替换控制平面机器时,集群暂时会有四个控制平面机器。当第四个控制平面节点加入集群时,etcd 运算符会在替换节点上启动一个新的 etcd 成员。当 etcd 运算符观察到旧的控制平面机器被标记为要删除时,它会停止旧节点上的 etcd 成员,并提升替换的 etcd 成员以加入集群的仲裁。

控制平面机器Deleting阶段按以下顺序进行:

  1. 一个控制平面机器被计划删除。

  2. 控制平面机器进入Deleting阶段。

  3. 为了满足preDrain生命周期钩子,etcd 运算符会执行以下操作:

    1. etcd 运算符等待将第四个控制平面机器作为 etcd 成员添加到集群。这个新的 etcd 成员的状态为Running,但在从 etcd leader 接收完整的数据库更新之前,它不会处于ready状态。

    2. 当新的 etcd 成员接收到完整的数据库更新后,etcd 运算符会将新的 etcd 成员提升为投票成员,并从集群中移除旧的 etcd 成员。

    此转换完成后,旧的 etcd pod 及其数据可以安全地移除,因此preDrain生命周期钩子将被移除。

  4. 控制平面机器状态条件Drainable设置为True

  5. 机器控制器尝试清空由控制平面机器支持的节点。

    • 如果清空失败,则Drained设置为False,并且机器控制器会再次尝试清空节点。

    • 如果清空成功,则Drained设置为True

  6. 控制平面机器状态条件Drained设置为True

  7. 如果没有其他运算符添加preTerminate生命周期钩子,则控制平面机器状态条件Terminable设置为True

  8. 机器控制器从基础架构提供程序中移除实例。

  9. 机器控制器删除Node对象。

演示 etcd 仲裁保护preDrain生命周期钩子的 YAML 代码片段
apiVersion: machine.openshift.io/v1beta1
kind: Machine
metadata:
  ...
spec:
  lifecycleHooks:
    preDrain:
    - name: EtcdQuorumOperator (1)
      owner: clusteroperator/etcd (2)
  ...
1 preDrain生命周期钩子的名称。
2 管理preDrain生命周期钩子的钩子实现控制器。