全部產品
Search
文件中心

Container Compute Service:配置硬體異常執行個體自動輪轉

更新時間:Feb 12, 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