配置虚拟机的高可用性

概述

硬件存在缺陷,软件包含漏洞。当发生节点级故障,如内核挂起或网络接口控制器(NIC)故障时,集群的工作量不会减少,受影响节点上的工作负载需要在其他地方重新启动。然而,某些工作负载,如 ReadWriteOnce (RWO) 卷和 StatefulSets,可能要求最多只能有一个实例运行。

影响这些工作负载的故障可能导致数据丢失、损坏或两者兼有。确保节点达到一个安全状态(称为 fencing)后再启动工作负载的恢复(称为 remediation),理想情况下还包括节点本身的恢复,这一点非常重要。

依赖管理员干预来确认节点和工作负载的真实状态并不总是实际可行的。为便于此类干预,Alauda Container Platform 提供了多个组件,用于自动化故障检测、fencing 和 remediation。

术语表

缩写术语
SNRSelf Node Remediation
NHCNode Health Check

组件概述

  • Self Node Remediation Operator

    Self Node Remediation Operator 是 Alauda Container Platform 的一个附加 Operator,实现了一个外部的 fencing 和 remediation 系统,该系统会重启不健康的节点并删除资源,如 Pod 和 VolumeAttachment。重启确保工作负载被 fencing,资源删除加快了受影响工作负载的重新调度。与其他外部系统不同,Self Node Remediation 不需要任何管理接口,例如智能平台管理接口(IPMI)或节点配置的 API。

    Self Node Remediation 可被故障检测系统使用,如 Machine Health Check 或 Node Health Check。

  • Node Health Check Operator

    Node Health Check Operator 是 Alauda Container Platform 的一个附加 Operator,实现了一个监控节点状态的故障检测系统。它没有内置的 fencing 或 remediation 系统,因此必须配置一个提供这些功能的外部系统。默认情况下,它配置为使用 Self Node Remediation 系统。

fencing 和 remediation 过程中的事件流程

操作步骤

Operator 列表

  • 下载 与您的平台架构对应的 Alauda Build of SelfNodeRemediation 安装包。
  • 使用上传软件包机制 上传 Alauda Build of SelfNodeRemediation 安装包。
  • 下载 与您的平台架构对应的 Alauda Build of NodeHealthCheck 安装包。
  • 使用上传软件包机制 上传 Alauda Build of NodeHealthCheck 安装包。

部署 Self Node Remediation Operator

  1. 登录,进入 管理员 页面。

  2. 点击 Marketplace > OperatorHub,进入 OperatorHub 页面。

  3. 找到 Alauda Build of SelfNodeRemediation,点击 Install,进入 Install Alauda Build of SelfNodeRemediation 页面。

    配置参数:

    参数推荐配置
    Channel默认通道为 stable
    Installation ModeCluster:集群中所有命名空间共享单个 Operator 实例进行创建和管理,资源使用更低。
    Installation Place选择 Recommended,命名空间仅支持 workload-availability
    Upgrade StrategyManual:当 Operator Hub 有新版本时,需要手动确认升级 Operator 到最新版本。

配置 Self Node Remediation Operator(可选)

Self Node Remediation Operator 会创建名为 self-node-remediation-configSelfNodeRemediationConfig CR。该 CR 在 Self Node Remediation Operator 所在的命名空间中创建。

注意

修改 SelfNodeRemediationConfig CR 会重新创建 Self Node Remediation 守护进程集。

SelfNodeRemediationConfig CR 示例 YAML 文件如下:

apiVersion: self-node-remediation.medik8s.io/v1alpha1
kind: SelfNodeRemediationConfig
metadata:
  name: self-node-remediation-config
  namespace: workload-availability
spec:
  safeTimeToAssumeNodeRebootedSeconds: 180 
  watchdogFilePath: /dev/watchdog 
  isSoftwareRebootEnabled: true 
  apiServerTimeout: 15s 
  apiCheckInterval: 5s 
  maxApiErrorThreshold: 3 
  peerApiServerTimeout: 5s 
  peerDialTimeout: 5s 
  peerRequestTimeout: 5s 
  peerUpdateInterval: 15m 
  hostPort: 30001 
  customDsTolerations: 
  - effect: NoSchedule
    key: node-role.kubernetes.io.infra
    operator: Equal
    value: "value1"
    tolerationSeconds: 3600

参数说明

参数说明
safeTimeToAssumeNodeRebootedSeconds指定 Operator 在恢复运行于不健康节点上的受影响工作负载之前等待的可选时间。若在故障节点上工作负载仍在运行时启动替换 Pod,可能导致数据损坏并违反最多运行一次的语义。Operator 会根据 ApiServerTimeout、ApiCheckInterval、MaxApiErrorThreshold、PeerDialTimeout、PeerRequestTimeout 字段值,以及 watchdog 超时和恢复时的集群规模计算最小等待时间。
watchdogFilePath指定节点中 watchdog 设备的文件路径。如果输入了错误的 watchdog 设备路径,Self Node Remediation Operator 会自动检测 softdog 设备路径。
如果没有可用的 watchdog 设备,SelfNodeRemediationConfig CR 会使用软件重启。
isSoftwareRebootEnabled指定是否启用不健康节点的软件重启。默认值为 true。若要禁用软件重启,将该参数设置为 false
apiServerTimeout指定检查与每个 API 服务器连接的超时时间。超时后,Operator 开始 remediation。超时时间必须大于等于 10 毫秒。
apiCheckInterval指定检查与每个 API 服务器连接的频率。超时时间必须大于等于 1 秒。
maxApiErrorThreshold指定阈值。达到该阈值后,节点开始联系其对等节点。阈值必须大于等于 1 秒。
peerApiServerTimeout指定对等节点连接 API 服务器的超时时间。超时时间必须大于等于 10 毫秒。
peerDialTimeout指定与对等节点建立连接的超时时间。超时时间必须大于等于 10 毫秒。
peerRequestTimeout指定从对等节点获取响应的超时时间。超时时间必须大于等于 10 毫秒。
peerUpdateInterval指定更新对等节点信息(如 IP 地址)的频率。超时时间必须大于等于 10 秒。
hostPort指定 Self Node Remediation 代理用于内部通信的端口,可选。值必须大于 0,默认端口为 30001。
customDsTolerations指定运行在守护进程集上的 Self Node Remediation 代理的自定义容忍度,以支持不同类型节点的 remediation。
注意
  • Self Node Remediation Operator 默认在部署命名空间创建该 CR。
  • CR 名称必须为 self-node-remediation-config
  • 只能存在一个 SelfNodeRemediationConfig CR。
  • 删除 SelfNodeRemediationConfig CR 会禁用 Self Node Remediation。

配置 Self Node Remediation 模板(可选)

Self Node Remediation Operator 还会创建 SelfNodeRemediationTemplate 自定义资源定义(CRD)。该 CRD 定义了节点的 remediation 策略,旨在更快恢复工作负载。可用的 remediation 策略如下:

  • Automatic

    该策略简化 remediation 过程,由 Self Node Remediation Operator 决定集群最合适的 remediation 策略。该策略会检查集群中是否存在 OutOfServiceTaint 策略。如果存在,Operator 选择 OutOfServiceTaint 策略;如果不存在,Operator 选择 ResourceDeletion 策略。Automatic 是默认的 remediation 策略。

  • ResourceDeletion

    该策略通过删除节点上的 Pod,而非删除节点对象来进行 remediation。

  • OutOfServiceTaint

    该策略通过在节点上设置 OutOfServiceTaint,隐式导致节点上的 Pod 和相关卷附件被移除,而非删除节点对象。

Self Node Remediation Operator 会为策略 self-node-remediation-automatic-strategy-template 创建 SelfNodeRemediationTemplate CR,该策略使用 Automatic remediation 策略。

SelfNodeRemediationTemplate CR 示例 YAML 文件如下:

apiVersion: self-node-remediation.medik8s.io/v1alpha1
kind: SelfNodeRemediationTemplate
metadata:
  creationTimestamp: "2022-03-02T08:02:40Z"
  name: self-node-remediation-<remediation_object>-deletion-template 
  namespace: workload-availability
spec:
  template:
    spec:
      remediationStrategy: <remediation_strategy>  

参数说明

参数说明
remediation_strategy可选值:Automatic、ResourceDeletion、OutOfServiceTaint

部署 Node Health Check Operator

  1. 登录,进入 管理员 页面。

  2. 点击 Marketplace > OperatorHub,进入 OperatorHub 页面。

  3. 找到 Alauda Build of NodeHealthCheck,点击 Install,进入 Install Alauda Build of NodeHealthCheck 页面。

    配置参数:

    参数推荐配置
    Channel默认通道为 stable
    Installation ModeCluster:集群中所有命名空间共享单个 Operator 实例进行创建和管理,资源使用更低。
    Installation Place选择 Recommended,命名空间仅支持 workload-availability
    Upgrade StrategyManual:当 Operator Hub 有新版本时,需要手动确认升级 Operator 到最新版本。

创建 NodeHealthCheck 实例

在集群控制节点执行以下命令:

命令
示例
cat << EOF | kubectl apply -f -
apiVersion: remediation.medik8s.io/v1alpha1
kind: NodeHealthCheck
metadata:
  name: nodehealthcheck-<name>
spec:
  minHealthy: <minHealthy>
  remediationTemplate:
    apiVersion: self-node-remediation.medik8s.io/v1alpha1
    kind: SelfNodeRemediationTemplate
    name: self-node-remediation-automatic-strategy-template
    namespace: workload-availability
  selector: <selector>
  unhealthyConditions:
    - duration: 300s
      status: 'False'
      type: Ready
    - duration: 300s
      status: Unknown
      type: Ready
EOF

参数说明:

参数说明
name资源名称
minHealthy指定健康节点的最小比例。只有当健康节点比例大于或等于该值时,才会修复故障节点。默认值为 51%
selector指定 LabelSelector 以匹配需要检测和自我修复的节点。请避免在同一个实例中同时指定 control-plane 和 worker 节点。

验证(可选)

模拟虚拟机运行节点的故障,确认虚拟机是否会自动调度到其他节点上运行。