當底層硬體出現異常時,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