当底层硬件出现异常时,ACS会通过Kubernetes事件(Event)、状态(Condition)等方式上报,详见GPU故障诊断与恢复。为避免业务中断,可通过配置 acs-instance-helper 开启故障处理功能,实现对工作负载的自动扩容和驱逐,提升运维效率的同时,保障业务稳定性。
工作原理
当ACS 实例底层发生节点计划运维或硬件故障(如GPU损坏)时,可能影响业务稳定性、性能或存在宕机风险,配置acs-instance-helper 组件可实现全自动的故障处理:
自动监听故障:组件持续监听 Pod 的故障
Condition。该信号由底层基础设施自动上报(如 GPU 掉卡、整机故障、计划内节点重启运维事件等)。对齐窗口处理:组件根据底层节点上报的故障处理期限结合运维窗口配置(可选)判定处理时机。在期限允许时,组件会静默等待直到进入预设的运维窗口进行处理。
触发轮转更新:组件会自动结合无状态应用(如 Deployment、CloneSet)的在线扩容策略(先扩容,后销毁),实现故障节点 Pod 的平滑轮转。
重要对于非在线应用,acs-instance-helper在感知异常状态后,会直接驱逐该实例。
适用范围
ACS集群版本为1.28及以上。
已安装虚拟节点组件(ACK Virtual Node),且版本为v2.16.0及以上。更多信息,请参见ACK Virtual Node。
安装组件
在ACS控制台页面,单击目标集群名称,在集群详情页左侧导航栏,选择。
在Helm页面,单击创建。
基本信息:在Chart中搜索acs-instance-helper,勾选搜索结果。
参数配置:Chart版本选择最新版。
为acs-instance-helper组件进行全局配置(可选)
为组件配置额外支持的工作负载类型及运维窗口。
控制台
在目标集群详情页左侧导航栏,选择配置管理 > 配置项。
在配置项页面,单击使用YAML创建资源,然后将以下内容复制到模板区域,单击创建。
kubectl
将以下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" # 运维窗口:每周六、周日可展开查看以下配置项说明,了解具体参数说明。
创建并配置工作负载
为工作负载配置注解(annotations)开启故障处理功能。
故障处理功能通过反复尝试驱逐(Eviction API)而非直接删除(Delete)故障实例来实现轮转。可配置PodDisruptionBudget(PDB)策略,控制并发驱逐的速率,防止服务中断,请参考使用 PDB 资源控制 Pod 驱逐并发度。
控制台
在目标集群左侧导航栏,选择工作负载 > 无状态。
在无状态页面,单击使用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在弹窗中找到目标无状态应用,单击查看,确认Pod状态为
Running。
kubectl
将以下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确认目标应用Pod状态为
Running。kubectl get pods -l app=hardware-fault-helper-example
模拟故障场景并观察现象
在真实场景中,Condition 由底层管控系统自动添加。此处通过手动为其中一个 Pod 注入 Condition 来模拟故障场景。
模拟故障:替换
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")'" } ] } }'观察扩容:故障注入后,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查看扩容事件:检查故障 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查看驱逐事件:等待
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确认恢复:最终,故障 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