高可用性は分散アプリケーションにとって不可欠です。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 ラベルキーのリスト。 | ||
| labelSelector | このフィールドは、一致する Pod を見つけるために使用されます。このラベルセレクターに一致する Pod は、トポロジドメイン内の Pod の数を決定するためにカウントされます。 | 他の計算クラス(汎用およびパフォーマンス向上計算クラスなど)の Pod はカウントされません。 |
matchLabelKeys | 分散が計算される Pod を選択するために使用される Pod ラベルキーのリスト。 | ||
nodeAffinityPolicy | このフィールドは、Pod トポロジスプレッドスキューが計算されるときに、Pod の nodeAffinity または nodeSelector をどのように扱うかを指定します。 | サポートされていません。 | |
nodeTaintsPolicy | このフィールドは、Pod トポロジスプレッドスキューが計算されるときに、ノードテイントをどのように扱うかを指定します。 | サポートされていません。 |
フィールドの詳細については、Pod Topology Spread Constraints を参照してください。
手順
クラスター内のノードを表示するには、次のコマンドを実行します。
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
次のコマンドを実行して、クラスタ内のノードを表示します。
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
次のコマンドを実行して、dep-spread-demo をクラスターにデプロイします。
kubectl apply -f dep-spread-demo.yaml
次のコマンドを実行して、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 つのゾーンに分散されていることを示しています。