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

Container Compute Service:ゾーン・トポロジー分散

最終更新日:Mar 01, 2026

分散タスク実行において、高可用性は重要な要件です。ACS クラスターでは、Kubernetes ネイティブのスケジューリング・セマンティクスを使用してワークロードをゾーン全体に分散し、高可用性デプロイメントを実現します。ワークロードのゾーンレベルの分散を有効にするには、トポロジー分散制約プロトコルの topologyKey フィールドにゾーン・トポロジー・ラベルを指定します。このトピックでは、ACS におけるトポロジー分散制約の制約と使用方法について説明します。

前提条件

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

    ACS クラスターのバージョン

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

    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 (GPU-HPN) コンピュート・タイプを使用していること。

  • Pod の schedulerNamedefault-scheduler であること。

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

プロトコル・フィールド

意味

制約

labelSelector

一致する Pod を検索するために使用されます。このラベルに一致する Pod は、対応するトポロジー・ドメイン内の Pod 数を決定するためにカウントされます。

他のコンピュート・タイプ (汎用、コンピュート最適化、GPU) の Pod は、一致するカウントの計算時に含まれません。

matchLabelKeys

分散が計算される Pod のセットを選択するために labelSelector とともに使用されるタグキーのリスト。

nodeAffinityPolicy

Pod トポロジー分散のドリフトを計算する際に、Pod の nodeAffinity/nodeSelector がどのように処理されるかを示します。

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

nodeTaintsPolicy

Pod トポロジー分散のドリフトを計算する際に、ノードの Taint がどのように処理されるかを示します。

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

汎用、コンピュート最適化、GPU インスタンスの場合、ゾーン・トポロジー分散ポリシーはこれらの制約の対象ではありません。各フィールドの詳細については、「Topology Spread Constraints」をご参照ください。

操作手順

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

    kubectl get node

    期待される出力:

    NAME                            STATUS   ROLES   AGE     VERSION
    virtual-kubelet-cn-hangzhou-i   Ready    agent   5h42m   v1.28.3-xx
    virtual-kubelet-cn-hangzhou-j   Ready    agent   5h42m   v1.28.3-xx
  2. 次の YAML コンテンツで `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 は、ゾーン間の 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>

    出力には、2つのゾーンに分散された4つの Pod が表示されます。