全部产品
Search
文档中心

容器计算服务 ACS:配置硬件异常实例自动轮转

更新时间:Feb 11, 2026

当底层硬件出现异常时,ACS会通过Kubernetes事件(Event)、状态(Condition)等方式上报,详见GPU故障诊断与恢复。为避免业务中断,可通过配置 acs-instance-helper 开启故障处理功能,实现对工作负载的自动扩容和驱逐,提升运维效率的同时,保障业务稳定性。

工作原理

当ACS 实例底层发生节点计划运维或硬件故障(如GPU损坏)时,可能影响业务稳定性、性能或存在宕机风险,配置acs-instance-helper 组件可实现全自动的故障处理:

  1. 自动监听故障:组件持续监听 Pod 的故障Condition。该信号由底层基础设施自动上报(如 GPU 掉卡、整机故障、计划内节点重启运维事件等)。

  2. 对齐窗口处理:组件根据底层节点上报的故障处理期限结合运维窗口配置(可选)判定处理时机。在期限允许时,组件会静默等待直到进入预设的运维窗口进行处理。

  3. 触发轮转更新:组件会自动结合无状态应用(如 Deployment、CloneSet)的在线扩容策略(先扩容,后销毁),实现故障节点 Pod 的平滑轮转。

    重要

    对于非在线应用,acs-instance-helper在感知异常状态后,会直接驱逐该实例。

适用范围

  • ACS集群版本为1.28及以上。

  • 已安装虚拟节点组件(ACK Virtual Node),且版本为v2.16.0及以上。更多信息,请参见ACK Virtual Node

安装组件

  1. ACS控制台页面,单击目标集群名称,在集群详情页左侧导航栏,选择应用 > Helm

  2. Helm页面,单击创建

    1. 基本信息:在Chart中搜索acs-instance-helper,勾选搜索结果。

    2. 参数配置:Chart版本选择最新版。

为acs-instance-helper组件进行全局配置(可选)

为组件配置额外支持的工作负载类型及运维窗口。

控制台

  1. 在目标集群详情页左侧导航栏,选择配置管理 > 配置项

  2. 配置项页面,单击使用YAML创建资源,然后将以下内容复制到模板区域,单击创建

kubectl

  1. 获取集群kubeconfig并通过kubectl工具连接集群

  2. 将以下YAML内容保存为acs-instance-helper-global-configmap.yaml文件,然后执行kubectl apply -f acs-instance-helper-global-configmap.yaml命令。

apiVersion: v1
kind: ConfigMap
metadata:
  name: acs-instance-helper-global-config
  namespace: kube-system
data:
  customOnlineWorkloads: foo.io/SomeWorkload,bar.io/AnotherWorkload
  hardwareFaultEvictionSeconds: "60"
  maintenanceTime: "2025-10-09T10:00:00+08:00"
  maintenanceDuration: "4h"
  maintenanceWeeklyPeriod: "Saturday,Sunday"
  # maintenanceRecurrence: "FREQ=WEEKLY;BYDAY=SA,SU"  # 运维窗口:每周六、周日

可展开查看以下配置项说明,了解具体参数说明。

配置项说明

配置 Key

说明

示例值

customOnlineWorkloads

标记应用为“在线服务”类型,采用在线扩容策略(先扩容,后销毁),实现故障节点 Pod 的平滑轮转。

组件默认支持Deployment类型工作负载,可配置此项为组件添加额外支持的自定义工作负载类型。

重要
  • 请确保自定义的工作负载控制器能够通过伸缩维持 Pod 的副本数(当副本数不足时,可以自动补充)。

  • 无法保证所有自定义工作负载都能实现发生故障时的无损轮转,为自定义工作负载启用该功能时,请务必进行充分测试。

foo.io/SomeWorkload,bar.io/AnotherWorkload

hardwareFaultEvictionSeconds

对于采用“扩容并驱逐”策略的服务,从扩容完成到开始驱逐故障实例的等待时间,单位为秒。

  • 默认值为 "300"(5分钟)。值必须是字符串格式,例如 "60"

"60"

maintenanceTime

定义运维窗口的起始时间点,采用 RFC3339 标准格式。一旦配置此项,即为集群启用了运维窗口。

建议使用 +08:00UTC 等明确的时区标识。

2025-10-09T10:00:00+08:00

声明运维窗口从北京时间2025年10月9日上午10点开始。

maintenanceDuration

自定义每次运维窗口的持续时长。

  • 仅在配置了 maintenanceTime 后生效。

  • 值必须是字符串格式。支持 "3""3h""3H" 等格式。

  • 默认值为 "3",即3小时。

"4h"

maintenanceWeeklyPeriod

以简化的方式指定每周的哪几天为运维日。

  • 仅在配置了 maintenanceTime 后生效。

  • 取值为 MondayTuesdayWednesdayThursdayFridaySaturdaySunday,多个值用逗号分隔。

  • 配置此项后,将覆盖 maintenanceRecurrence 的值。

Saturday,Sunday

maintenanceRecurrence

使用 RFC5545 循环规则语法自定义运维周期,提供更强的灵活性。

  • 仅在配置了 maintenanceTime 后生效。

  • 目前仅支持 FREQ=WEEKLY,且不支持 COUNTUNTIL 参数。

  • 如果同时配置了 maintenanceWeeklyPeriod,此项将被忽略。

FREQ=WEEKLY;BYDAY=SA,SU

故障的处理时间由故障处理期限与配置的运维窗口共同决定。若处理期限前存在可用的运维窗口,acs-instance-helper 组件将优先安排在运维窗口内执行故障修复;若单次运维窗口内未完成全部处理逻辑,剩余操作将在下一个运维窗口中继续执行。

image

创建并配置工作负载

为工作负载配置注解(annotations)开启故障处理功能。

故障处理功能通过反复尝试驱逐(Eviction API)而非直接删除(Delete)故障实例来实现轮转。可配置PodDisruptionBudget(PDB)策略,控制并发驱逐的速率,防止服务中断,请参考使用 PDB 资源控制 Pod 驱逐并发度

控制台

  1. 在目标集群左侧导航栏,选择工作负载 > 无状态

  2. 无状态页面,单击使用YAML创建资源,然后将以下内容复制到模板区域,单击创建

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hardware-fault-helper-example
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: hardware-fault-helper-example
      template:
        metadata:
          labels:
            app: hardware-fault-helper-example
          annotations:
            # 关键注解:为工作负载开启故障处理功能
            "ops.alibabacloud.com/enable-hardware-fault-helper": "true"
        spec:
          containers:
            - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1
              name: main-container
              resources:
                limits:
                  cpu: 100m
                  memory: 100Mi
          restartPolicy: Always
  3. 在弹窗中找到目标无状态应用,单击查看,确认Pod状态为Running。 

kubectl

  1. 将以下YAML内容保存为app.yaml文件,然后执行kubectl apply -f app.yaml命令。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hardware-fault-helper-example
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: hardware-fault-helper-example
      template:
        metadata:
          labels:
            app: hardware-fault-helper-example
          annotations:
            # 关键注解:为工作负载开启故障处理功能
            "ops.alibabacloud.com/enable-hardware-fault-helper": "true"
        spec:
          containers:
            - image: registry-cn-hangzhou.ack.aliyuncs.com/dev/hello-world:v1
              name: main-container
              resources:
                limits:
                  cpu: 100m
                  memory: 100Mi
          restartPolicy: Always
  2. 确认目标应用Pod状态为Running

    kubectl get pods -l app=hardware-fault-helper-example

模拟故障场景并观察现象

在真实场景中,Condition 由底层管控系统自动添加。此处通过手动为其中一个 Pod 注入 Condition 来模拟故障场景。

  1. 模拟故障:替换POD_NAME为实际的Pod名,为目标 Pod 注入一个硬件故障 Condition

    故障处理期限为message字段中的时间。
    kubectl patch pod POD_NAME --type='merge' --subresource=status -p='{
      "status": {
        "conditions": [
          {
            "type": "Interruption.HardwareFault",
            "status": "True",
            "reason": "MockForTest",
            "message": "Underlying infrastructure issue [Reboot] scheduled at 2099-03-12T09:00:00.000+08:00",
            "lastProbeTime": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'",
            "lastTransitionTime": "'$(date -u +"%Y-%m-%dT%H:%M:%SZ")'"
          }
        ]
      }
    }'
  2. 观察扩容:故障注入后,acs-instance-helper 会根据运维窗口配置触发扩容(未配置则立即触发),新的Pod已被创建,且原工作负载状态未受影响。

    kubectl get pods -l app=hardware-fault-helper-example

    预期输出:

    NAME                                             READY   STATUS    RESTARTS   AGE
    hardware-fault-helper-example-7cf4cf96c5-xxxxx   1/1     Running   0          2m21s
    hardware-fault-helper-example-7cf4cf96c5-yyyyy   1/1     Running   0          36s # 新扩容的 Pod
  3. 查看扩容事件:检查故障 Pod 的事件,可以看到 NewInstanceCreationTriggered 事件,确认扩容操作已由 hardware-fault-helper 触发。

    kubectl describe po POD_NAME

    预期输出:

    ...
      Normal  NewInstanceCreationTriggered  62s    hardware-fault-helper  controller default/hardware-fault-helper-example-7cf4cf96c5 (apiVersion:apps/v1, kind:ReplicaSet) will create a new instance
  4. 查看驱逐事件:等待hardwareFaultEvictionSeconds的配置时间后,故障 Pod 将会被下线(进入 Terminating 状态后删除),此时也可以观察到一个下线事件。

    kubectl describe po POD_NAME

    预期输出:

    ...
      Warning  InstanceEvictedGracefully     2s     hardware-fault-helper  pod is deleted due to hardware fault
      Normal   Killing                       1s     kubelet                Stopping container main-container
  5. 确认恢复:最终,故障 Pod 被完全替换,只留下新创建的Pod。

    kubectl get pods -l app=hardware-fault-helper-example

    预期输出:

    NAME                                             READY   STATUS      RESTARTS   AGE
    hardware-fault-helper-example-7cf4cf96c5-yyyyy   1/1     Running     0          5m5s

计费说明

安装 acs-instance-helper 组件将在您的集群中部署一个包含两个副本的 Deployment。每个副本的资源规格为 1 vCPU 和 2 GiB 内存,这将占用集群资源并产生相应费用。详细计费,请参考ACS算力计费说明

常见问题

使用 PDB 资源控制 Pod 驱逐并发度

当因节点排空、自动缩容等外部事件需要驱逐Pod时,为了保障业务高可用,可以配置 PodDisruptionBudget (PDB) 策略。该策略的核心作用是控制驱逐的并发度,具体通过以下参数实现:

  • maxUnavailable (最大不可用数): 定义在驱逐过程中,最多允许有多少个Pod处于不可用状态。

  • minAvailable (最小可用数): 定义在驱逐过程中,必须保证至少有多少个Pod处于可用状态。

以下示例表示,驱逐时保证至少有一个Pod可用。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: app-pdb
  namespace: YOUR_NAMESPACE # 指定策略生效的命名空间,不指定默认default
spec:
  minAvailable: 1
  selector:
    matchLabels:
      app: app