分散タスク実行において、高可用性は重要な要件です。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 の
schedulerNameがdefault-schedulerであること。スケジューラコンポーネントの構成では、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] が選択されていません。
プロトコル・フィールド | 意味 | 制約 |
labelSelector | 一致する Pod を検索するために使用されます。このラベルに一致する Pod は、対応するトポロジー・ドメイン内の Pod 数を決定するためにカウントされます。 | 他のコンピュート・タイプ (汎用、コンピュート最適化、GPU) の Pod は、一致するカウントの計算時に含まれません。 |
matchLabelKeys | 分散が計算される Pod のセットを選択するために labelSelector とともに使用されるタグキーのリスト。 | |
nodeAffinityPolicy | Pod トポロジー分散のドリフトを計算する際に、Pod の nodeAffinity/nodeSelector がどのように処理されるかを示します。 | サポートされていません。 |
nodeTaintsPolicy | Pod トポロジー分散のドリフトを計算する際に、ノードの Taint がどのように処理されるかを示します。 | サポートされていません。 |
汎用、コンピュート最適化、GPU インスタンスの場合、ゾーン・トポロジー分散ポリシーはこれらの制約の対象ではありません。各フィールドの詳細については、「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次の 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クラスターに `dep-spread-demo` をデプロイするには、次のコマンドを実行します。
kubectl apply -f dep-spread-demo.yamlPod スケジューリングの分散を表示するには、次のコマンドを実行します。
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 が表示されます。