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

Container Compute Service:トポロジースプレッド制約を使用したゾーン間での Pod の分散

最終更新日:Sep 17, 2026

高可用性は、分散アプリケーションにとって重要な要件です。Alibaba Cloud Container Compute Service (ACS) クラスターでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、ワークロードをゾーン間に分散させることで高可用性を実現できます。トポロジースプレッド制約の topologyKey フィールドにトポロジーラベルを指定することで、このクロスゾーン分散を有効にできます。このトピックでは、ACS におけるトポロジースプレッド制約の条件と使用方法について説明します。

前提条件

  • kube-scheduler がインストールされており、そのバージョンが以下の要件を満たしていること。

    ACK クラスタバージョン

    スケジューラコンポーネントのバージョン

    1.31

    v1.31.0-aliyun-1.2.0 以降

    1.30

    v1.30.3-aliyun-1.1.1 以降

    1.28

    v1.28.9-aliyun-1.1.0 以降

  • acs-virtual-node がインストールされており、そのバージョンが v2.12.0-acs.4 以降であること。

使用上の注意

説明

ACS スケジューラコンポーネントの GPU-HPN ノードのカスタムラベルとスケジューラを有効にする設定は、最近のバージョンではデフォルトで有効になっています。 詳細については、「kube-scheduler」をご参照ください。

ACS クラスターでトポロジースプレッド制約を使用する場合、以下のすべての条件を満たす Pod に対して、一部のフィールドに制限があります。

  • Pod のコンピューティングタイプが GPU-HPN であること。

  • Pod の schedulerName が default-scheduler に設定されていること。

  • スケジューラコンポーネントの設定で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] オプションが選択されていません。

パラメータ

説明

制約

labelSelector

一致する Pod を検索し、対応するトポロジードメイン内の Pod 数を決定するためにカウントします。

汎用、パフォーマンス強化型、GPU 高速化などの他のコンピューティングタイプの Pod はカウントに含まれません。

matchLabelKeys

labelSelector と組み合わせて、分散計算のための Pod グループを定義する Pod ラベルキーのリストです。

nodeAffinityPolicy

トポロジースプレッドスキューを計算する際に、Pod の nodeAffinity/nodeSelector をどのように扱うかを定義します。

サポートされていません。

nodeTaintsPolicy

トポロジースプレッドスキューを計算する際に、Node Taint をどのように扱うかを定義します。

サポートされていません。

汎用、パフォーマンス強化型、GPU 高速化インスタンスの場合、トポロジースプレッドに関する上記の制約は適用されません。各フィールドの詳細については、「Pod トポロジースプレッド制約」をご参照ください。

手順

  1. 次のコマンドを実行して、クラスター内のノードを表示します。

    kubectl get node

    出力例:

    NAME                            STATUS   ROLES   AGE     VERSION
    virtual-kubelet-cn-hangzhou-i   Ready    agent   5h42m   v1.28.9-xx
    virtual-kubelet-cn-hangzhou-j   Ready    agent   5h42m   v1.28.9-xx
  2. dep-spread-demo.yaml という名前のファイルを作成し、次の内容をファイルに追加します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-spread-demo
      labels:
        app: spread-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: spread-demo
      template:
        metadata:
          labels:
            app: spread-demo
        spec:
          containers:
          - name: spread-demo
            image: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
          # ゾーン分散制約を指定します。maxSkew=1 は、ゾーン間で Pod 数が最大 1 つまで異なることを意味します。
          topologySpreadConstraints:
          - maxSkew: 1
            topologyKey: topology.kubernetes.io/zone
            whenUnsatisfiable: DoNotSchedule
            labelSelector:
              matchLabels:
                app: spread-demo
  3. 次のコマンドを実行して、dep-spread-demo をクラスターにデプロイします。

    kubectl apply -f dep-spread-demo.yaml
  4. 次のコマンドを実行して、Pod の分散結果を表示します。

    kubectl get pod -o wide

    出力例:

    NAME                               READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATES
    dep-spread-demo-7c656dbf5f-6twkc   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-i   <none>           <none>
    dep-spread-demo-7c656dbf5f-cgxr8   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-spread-demo-7c656dbf5f-f4fz9   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-spread-demo-7c656dbf5f-kc6xf   1/1     Running   0          2m29s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-i   <none>           <none>

    出力結果から、4 つの Pod が 2 つのゾーンに分散されていることがわかります。