ACS は、Kubernetes のイベントと Condition を通じてハードウェア障害をレポートします (「GPU 障害の診断と回復」をご参照ください)。acs-instance-helper コンポーネントを設定することで、自動スケールアップとエビクションによる障害処理を自動化し、サービスの中断を防ぎます。
仕組み
ACS インスタンスでスケジュールされたノードメンテナンスや、損傷した GPU などのハードウェア障害が発生すると、サービスの安定性とパフォーマンスに影響が及ぶ可能性があります。acs-instance-helper コンポーネントは、障害処理を自動化します。
-
障害の自動モニタリング: コンポーネントは、Pod の障害
Conditionを継続的にモニタリングします。 基盤となるインフラストラクチャは、GPU 障害、ホストマシンの障害、スケジュールされたノードのメンテナンスや再起動などのイベントが発生すると、この信号を自動的に報告します。 -
メンテナンスウィンドウとの連携:コンポーネントは、基盤となるノードからレポートされる障害処理の期限と、オプションのメンテナンスウィンドウに基づいて、いつ処理を実行するかを判断します。期限に余裕がある場合、コンポーネントは事前定義されたメンテナンスウィンドウまで待機してから処理を進めます。
-
トリガーされる回転更新:Deployment や CloneSet などのステートレスアプリケーションに対して、コンポーネントはオンラインスケールアップ戦略 (先にスケールアップし、次に削除) を使用して、障害が発生したノード上の Pod を回転させます。
重要オンラインではないアプリケーションの場合、acs-instance-helper は障害 Condition を検出した後、インスタンス上の Pod を直接エビクションします。
前提条件
ご利用の 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 をクリックします。次のマニフェストを テンプレート エリアにコピーし、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" # メンテナンスウィンドウ:毎週土曜日と日曜日
パラメーターの説明については、次のセクションを展開してください。
ワークロードの作成と構成
アノテーションを設定して、ご利用のワークロードで障害処理機能を有効にします。
障害処理機能は、障害が発生したインスタンス上の Pod を直接削除するのではなく、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: # キーアノテーション:ワークロードの障害処理機能を有効にします。 "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 は基盤となるコントロールプレーンによって自動的に追加されます。このセクションでは、エラーシナリオをシミュレートするために、手動で Condition を Pod にインジェクトします。
-
エラーのシミュレーション:
POD_NAMEを実際の 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 はオフラインになります。 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 つのレプリカを持つ Deployment がデプロイされます。各レプリカはクラスターの 1 vCPU と 2 GiB のメモリを消費し、料金が発生します。課金の詳細については、「ACS コンピューティング能力の課金」をご参照ください。
よくある質問
PDB を使用した Pod エビクションの制御
ノードのドレインやオートスケーリングのための Pod エビクション中に高可用性を維持するには、PodDisruptionBudget (PDB) ポリシーを設定します。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