すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:ハードウェア障害に対するインスタンスの自動回転の設定

最終更新日:Jun 24, 2026

ACS は、Kubernetes のイベントと Condition を通じてハードウェア障害をレポートします (「GPU 障害の診断と回復」をご参照ください)。acs-instance-helper コンポーネントを設定することで、自動スケールアップとエビクションによる障害処理を自動化し、サービスの中断を防ぎます。

仕組み

ACS インスタンスでスケジュールされたノードメンテナンスや、損傷した GPU などのハードウェア障害が発生すると、サービスの安定性とパフォーマンスに影響が及ぶ可能性があります。acs-instance-helper コンポーネントは、障害処理を自動化します。

  1. 障害の自動モニタリング: コンポーネントは、Pod の障害 Condition を継続的にモニタリングします。 基盤となるインフラストラクチャは、GPU 障害、ホストマシンの障害、スケジュールされたノードのメンテナンスや再起動などのイベントが発生すると、この信号を自動的に報告します。

  2. メンテナンスウィンドウとの連携:コンポーネントは、基盤となるノードからレポートされる障害処理の期限と、オプションのメンテナンスウィンドウに基づいて、いつ処理を実行するかを判断します。期限に余裕がある場合、コンポーネントは事前定義されたメンテナンスウィンドウまで待機してから処理を進めます。

  3. トリガーされる回転更新:Deployment や CloneSet などのステートレスアプリケーションに対して、コンポーネントはオンラインスケールアップ戦略 (先にスケールアップし、次に削除) を使用して、障害が発生したノード上の Pod を回転させます。

    重要

    オンラインではないアプリケーションの場合、acs-instance-helper は障害 Condition を検出した後、インスタンス上の Pod を直接エビクションします。

前提条件

  • ご利用の ACS クラスターのバージョンが 1.28 以降であること。

  • ACK Virtual Node がインストールされており、バージョンが v2.16.0 以降であること。詳細については、「ACK Virtual Node」をご参照ください。

コンポーネントのインストール

  1. ACS コンソールで、対象のクラスターの名前をクリックします。左側のナビゲーションペインで、Applications > [Helm] を選択します。

  2. [Helm] ページで、[作成] をクリックします。

    1. 基本情報: [Chart] 検索ボックスに acs-instance-helper を入力し、結果から選択します。

    2. パラメーター:Chart Version で、最新バージョンを選択します。

acs-instance-helper のグローバル設定 (オプション)

メンテナンスウィンドウの設定や、カスタムワークロードタイプのサポートを追加することもできます。

コンソール

  1. 左側のナビゲーションペインで、Configurations > ConfigMaps を選択します。

  2. ConfigMaps ページで、Create from YAML をクリックします。次のマニフェストを テンプレート エリアにコピーし、Create をクリックします。

kubectl

  1. kubectl を使用してクラスターの KubeConfig を取得し、クラスターに接続します

  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"  # メンテナンスウィンドウ:毎週土曜日と日曜日

パラメーターの説明については、次のセクションを展開してください。

パラメーター

キー

説明

customOnlineWorkloads

ワークロードを「オンラインサービス」タイプとしてマークし、オンラインスケールアップ戦略 (先にスケールアップし、次に削除) を使用して障害が発生したノード上の Pod を回転させます。

デフォルトでは、コンポーネントは Deployment ワークロードタイプをサポートしています。このパラメーターを使用して、カスタムワークロードタイプのサポートを追加できます。

重要
  • カスタムワークロードコントローラーが指定されたレプリカ数を維持できることを確認してください (例:数が少なすぎる場合に自動的に新しいものを作成するなど)。

  • すべてのカスタムワークロードでシームレスな回転が保証されるわけではありません。カスタムワークロードでこの機能を有効にする場合は、十分にテストしてください。

foo.io/SomeWorkload,bar.io/AnotherWorkload

hardwareFaultEvictionSeconds

「スケールアップしてエビクション」戦略を使用するサービスの場合、このパラメーターはスケールアップ完了から障害が発生したインスタンス上の Pod のエビクションまでの待機期間 (秒単位) を定義します。

  • デフォルト値は "300" (5 分) です。値は文字列である必要があります。例: "60"

"60"

maintenanceTime

クラスターのメンテナンスウィンドウを有効にし、開始時刻を RFC3339 フォーマットで設定します。

+08:00UTCなど、明示的なタイムゾーン識別子を使用してください。

2025-10-09T10:00:00+08:00

メンテナンスウィンドウが 2025 年 10 月 9 日午前 10:00 (UTC+8) に開始することを宣言します。

maintenanceDuration

各メンテナンスウィンドウの期間を指定します。

  • このパラメーターは、maintenanceTime が設定されている場合にのみ有効になります。

  • 値は文字列である必要があります。"3""3h""3H" などの形式がサポートされています。

  • デフォルト値は "3" で、3 時間を意味します。

"4h"

maintenanceWeeklyPeriod

メンテナンスを行う曜日を指定します。

  • このパラメーターは、maintenanceTime が設定されている場合にのみ有効になります。

  • 有効な値は MondayTuesdayWednesdayThursdayFridaySaturdaySunday です。複数の値はカンマで区切ります。

  • この パラメーターが設定されている場合、maintenanceRecurrence の値をオーバーライドします。

Saturday,Sunday

maintenanceRecurrence

RFC5545 の繰り返しルールの構文を使用して、カスタムメンテナンススケジュールを定義します。

  • このパラメーターは、maintenanceTime が設定されている場合にのみ有効になります。

  • 現在、FREQ=WEEKLY のみがサポートされています。COUNT および UNTIL パラメーターはサポートされていません。

  • maintenanceWeeklyPeriod も設定されている場合、このパラメーターは無視されます。

FREQ=WEEKLY;BYDAY=SA,SU

障害解決のタイミングは、障害処理の期限と設定されたメンテナンスウィンドウの両方に依存します。期限前に利用可能なメンテナンスウィンドウがある場合、acs-instance-helper はそのウィンドウ内での修復を優先します。1 つのウィンドウ内でプロセスが完了しない場合、残りの操作は次に利用可能なウィンドウで継続されます。

ワークロードの作成と構成

アノテーションを設定して、ご利用のワークロードで障害処理機能を有効にします。

障害処理機能は、障害が発生したインスタンス上の Pod を直接削除するのではなく、Eviction API を使用して繰り返しエビクションを試みることで回転を実行します。PodDisruptionBudget (PDB) ポリシーを設定して、エビクションの同時実行数を制御し、サービスの中断を防ぐことができます。詳細については、「PDB を使用して Pod エビクションの同時実行数を制御する」をご参照ください。

コンソール

  1. 対象クラスターの左側のナビゲーションペインで、Workloads > Deployments を選択します。

  2. 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
  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 は基盤となるコントロールプレーンによって自動的に追加されます。このセクションでは、エラーシナリオをシミュレートするために、手動で Condition を Pod にインジェクトします。

  1. エラーのシミュレーション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")'"
          }
        ]
      }
    }'
  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 はオフラインになります。 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 コンポーネントをインストールすると、クラスターに 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