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

Container Compute Service:ゾーン全体にポッドを分散するためのトポロジスプレッド制約の使用

最終更新日:Mar 26, 2025

高可用性は、分散アプリケーションにとって不可欠です。 Alibaba Cloud Container Service for Kubernetes (ACK) クラスターでは、Kubernetes ネイティブのスケジューリングセマンティクスに基づいて、ゾーン全体に分散アプリケーションを分散することで、高可用性を確保できます。 トポロジスプレッド制約の TopologyKey フィールドを設定してトポロジラベルを追加することで、ゾーン全体にワークロードを分散できます。 このトピックでは、ACK におけるトポロジスプレッド制約の制限と使用方法について説明します。

前提条件

  • 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 以降であること。

使用上の注意

ACK クラスタ内のすべてのノードは仮想ノードです。 トポロジスプレッド制約の TopologyKey フィールドを設定して仮想ノードにトポロジラベルを追加することで、ゾーン全体にワークロードを分散できます。

次の表は、ACK でサポートされているさまざまなタイプのノードのトポロジラベルを示しています。

仮想ノードタイプ

ラベル

説明

標準仮想ノード

topology.kubernetes.io/zone

ネットワークゾーン

topology.kubernetes.io/zone: cn-shanghai-b

GPU-HPN 仮想ノード

topology.kubernetes.io/zone

ネットワークゾーン

topology.kubernetes.io/zone: cn-shanghai-b

alibabacloud.com/hpn-zone

高性能ネットワークゾーン

alibabacloud.com/hpn-zone: B1

ACK はさまざまなコンピュートクラスをサポートしています。 異なるコンピュートクラスのポッドに対してトポロジ分散制約の他のフィールドを設定する場合、次の制約があります。

コンピュートクラス

フィールド

説明

制約

  • 汎用

  • パフォーマンス向上

labelSelector

このフィールドは、一致するポッドを見つけるために使用されます。 このラベルセレクターに一致するポッドがカウントされ、トポロジドメイン内のポッド数が決定されます。

GPU アクセラレーションポッドと GPU-HPN ポッドはカウントされません。

matchLabelKeys

分散の計算対象となるポッドを選択するために使用されるポッドラベルキーのリスト。

  • GPU アクセラレーション

  • GPU-HPN

labelSelector

このフィールドは、一致するポッドを見つけるために使用されます。 このラベルセレクターに一致するポッドがカウントされ、トポロジドメイン内のポッド数が決定されます。

汎用やパフォーマンス向上などの他のコンピュートクラスのポッドはカウントされません。

matchLabelKeys

分散の計算対象となるポッドを選択するために使用されるポッドラベルキーのリスト。

nodeAffinityPolicy

このフィールドは、ポッドトポロジスプレッドスキューの計算時に、ポッドの nodeAffinity または nodeSelector をどのように扱うかを指定します。

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

nodeTaintsPolicy

このフィールドは、ポッドトポロジスプレッドスキューの計算時に、ノードの汚染をどのように扱うかを指定します。

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

フィールドの詳細については、「Pod 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. 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-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
          # スプレッド制約を指定します。 maxSkew の値は、ゾーン間のポッド数の差が 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. 次のコマンドを実行して、ポッドの分散結果を表示します。

    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 つのポッドが 2 つのゾーンに分散されていることを示しています。