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

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

最終更新日:Dec 27, 2024

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

前提条件

  • ACK クラスタが作成されていること。詳細については、ACK クラスタを作成する を参照してください。

  • kube-scheduler がインストールされていること。詳細については、kube-scheduler を参照してください。

  • acs-virtual-node v2.12.0-acs.4 以降がインストールされていること。

使用上の注意

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

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

ノードタイプ

ラベル

説明

通常ノード

topology.kubernetes.io/zone

ネットワークゾーン

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

ACK は複数の計算クラスをサポートしています。異なる計算クラスの場合、トポロジ分散制約の他のフィールドを使用する際に、以下の制約があります。

計算クラス

フィールド

説明

制約

  • 汎用

  • パフォーマンス向上

labelSelector

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

他の計算クラス(GPU アクセラレーテッド計算クラスなど)の Pod はカウントされません。

matchLabelKeys

分散が計算される Pod を選択するために使用される Pod ラベルキーのリスト。

  • GPU アクセラレーテッド

labelSelector

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

他の計算クラス(汎用およびパフォーマンス向上計算クラスなど)の Pod はカウントされません。

matchLabelKeys

分散が計算される Pod を選択するために使用される Pod ラベルキーのリスト。

nodeAffinityPolicy

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

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

nodeTaintsPolicy

このフィールドは、Pod トポロジスプレッドスキューが計算されるときに、ノードテイントをどのように扱うかを指定します。

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

フィールドの詳細については、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. 次のコマンドを実行して、クラスタ内のノードを表示します。

    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. 次のコマンドを実行して、Pod の分散結果を表示します。

    kubectl get pod -o wide

    dep-spread-demo.yaml という名前のファイルを作成し、次の内容をファイルに追加します。

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