基盤となるインフラストラクチャでハードウェア例外が発生した場合、Alibaba Cloud Service (ACS) は Kubernetes イベントや条件などの方法を使用して報告します。詳細については、「GPU 障害診断と復旧」をご参照ください。サービス中断を回避するために、acs-instance-helper コンポーネントを構成して障害処理を有効にできます。この機能は、ワークロードのスケールアウトとエビクションを自動化し、運用保守効率を向上させ、サービス安定性を確保します。
仕組み
ACS インスタンスの基盤となるインフラストラクチャで、計画的な運用保守イベントや、損傷した GPU などのハードウェア障害が発生した場合、サービス安定性やパフォーマンスに影響を与えたり、ダウンタイムのリスクをもたらしたりする可能性があります。acs-instance-helper コンポーネントを構成することで、完全に自動化された障害処理を実現できます。
自動障害監視:コンポーネントは、Pod の障害
Conditionを継続的にリッスンします。基盤となるインフラストラクチャは、GPU 障害、マシン全体の障害、計画的なノード再起動運用保守イベントなどのイベントに対して、このシグナルを自動的に報告します。アラインされたウィンドウ処理:コンポーネントは、基盤となるノードによって報告された障害処理期限と、オプションの運用保守ウィンドウ設定に基づいて処理時間を決定します。期限が許す場合、コンポーネントは事前設定された運用保守ウィンドウが開始されるまで待機してから処理を開始します。
トリガーされたローテーション更新:コンポーネントは、Deployment や CloneSets などのステートレスアプリケーションに対して、オンライン スケールアウトポリシー (最初にスケールアウトし、次に破棄する) を自動的に使用して、障害のあるノード上の Pod のスムーズなローテーションを実行します。
重要非オンラインアプリケーションの場合、acs-instance-helper は異常な状態を検出した後、インスタンスを直接エビクションします。
適用範囲
ご利用の ACS クラスターのバージョンは 1.28 以降です。
ACK Virtual Node コンポーネントがインストールされており、そのバージョンは v2.16.0 以降です。詳細については、「ACK Virtual Node」をご参照ください。
コンポーネントのインストール
ACS コンソールで、対象のクラスター名をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[Helm] ページで、[作成] をクリックします。
基本情報:[Chart] 検索ボックスに「acs-instance-helper」と入力し、検索結果から選択します。
パラメーター:Chart Version には、最新バージョンを選択します。
acs-instance-helper コンポーネントのグローバル設定の構成 (オプション)
コンポーネントに対して、追加でサポートされるワークロードタイプと運用保守ウィンドウを構成できます。
コンソール
対象クラスターの詳細ページの左側のナビゲーションウィンドウで、Configurations > ConfigMaps を選択します。
ConfigMaps ページで、Create from YAML をクリックします。次に、以下のマニフェストを [Templates] エリアにコピーし、Create をクリックします。
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" # 運用保守ウィンドウ:毎週土曜日と日曜日以下のセクションを展開して、設定項目の説明を表示します。
ワークロードの作成と構成
ワークロードのアノテーションを構成することで、障害処理機能を有効にできます。
障害処理機能では、インスタンスを直接削除する代わりに、Eviction API を使用してエビクションを繰り返し試行することにより、インスタンスをローテーションします。エビクションの同時実行数を制御し、サービス中断を防止するために、PodDisruptionBudget(PDB) ポリシーを設定できます。詳細については、「PDB リソースを使用した Pod のエビクション同時実行数の制御」をご参照ください。
コンソール
対象クラスターの左側のナビゲーションウィンドウで、Workloads > Deployments を選択します。
Deployments ページで、Create from YAML をクリックします。以下の内容を [Template] エリアにコピーし、Create をクリックします。
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: # Key annotation: Enables the fault handling feature for the workload # キーアノテーション:ワークロードの障害処理機能を有効にします "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: # Key annotation: Enables the fault handling feature for the workload # キーアノテーション:ワークロードの障害処理機能を有効にします "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 の 1 つに手動で 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` は O&M ウィンドウ構成 に基づいてスケールアウトをトリガーします (構成が存在しない場合は即座にトリガーします)。新しい 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 コンポーネントをインストールすると、ご利用のクラスターに 2 つのレプリカを持つデプロイメントが作成されます。各レプリカには 1 vCPU と 2 GiB のメモリが割り当てられます。これらのリソースはご利用のクラスターから消費され、料金が発生します。課金の詳細については、「ACS コンピューティングパワーの課金」をご参照ください。
よくある質問
PDB リソースによる Pod エビクションの同時実行性の制御
ノードのドレインや自動スケールインなどの外部イベントにより Pod をエビクションする必要がある場合、PodDisruptionBudget (PDB) ポリシーを設定して、サービスの可用性を確保できます。このポリシーは、以下のパラメーターを使用してエビクションの同時実行性をコントロールします。
maxUnavailable:エビクションプロセス中に利用不可にできる Pod の最大数を定義します。minAvailable:エビクションプロセス中に利用可能な状態を維持する必要がある Pod の最小数を定義します。
次の例では、エビクション中に少なくとも 1 つの Pod が利用可能な状態を維持することを保証します。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: app-pdb
namespace: YOUR_NAMESPACE # ポリシーが有効になる名前空間を指定します。指定しない場合、デフォルトは 'default' になります。
spec:
minAvailable: 1
selector:
matchLabels:
app: app