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