高可用性は、分散アプリケーションにとって重要な要件です。Alibaba Cloud Container Compute Service (ACS) クラスターでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、ワークロードをゾーン間に分散させることで高可用性を実現できます。トポロジースプレッド制約の topologyKey フィールドにトポロジーラベルを指定することで、このクロスゾーン分散を有効にできます。このトピックでは、ACS におけるトポロジースプレッド制約の条件と使用方法について説明します。
前提条件
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 以降であること。
使用上の注意
ACS スケジューラコンポーネントの GPU-HPN ノードのカスタムラベルとスケジューラを有効にする設定は、最近のバージョンではデフォルトで有効になっています。 詳細については、「kube-scheduler」をご参照ください。
ACS クラスターでトポロジースプレッド制約を使用する場合、以下のすべての条件を満たす Pod に対して、一部のフィールドに制限があります。
-
Pod のコンピューティングタイプが GPU-HPN であること。
-
Pod の
schedulerNameがdefault-schedulerに設定されていること。 -
スケジューラコンポーネントの設定で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] オプションが選択されていません。
|
パラメータ |
説明 |
制約 |
|
labelSelector |
一致する Pod を検索し、対応するトポロジードメイン内の Pod 数を決定するためにカウントします。 |
汎用、パフォーマンス強化型、GPU 高速化などの他のコンピューティングタイプの Pod はカウントに含まれません。 |
|
matchLabelKeys |
|
|
|
nodeAffinityPolicy |
トポロジースプレッドスキューを計算する際に、Pod の nodeAffinity/nodeSelector をどのように扱うかを定義します。 |
サポートされていません。 |
|
nodeTaintsPolicy |
トポロジースプレッドスキューを計算する際に、Node Taint をどのように扱うかを定義します。 |
サポートされていません。 |
汎用、パフォーマンス強化型、GPU 高速化インスタンスの場合、トポロジースプレッドに関する上記の制約は適用されません。各フィールドの詳細については、「Pod トポロジースプレッド制約」をご参照ください。
手順
-
次のコマンドを実行して、クラスター内のノードを表示します。
kubectl get node出力例:
NAME STATUS ROLES AGE VERSION virtual-kubelet-cn-hangzhou-i Ready agent 5h42m v1.28.9-xx virtual-kubelet-cn-hangzhou-j Ready agent 5h42m v1.28.9-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-beijing.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" # ゾーン分散制約を指定します。maxSkew=1 は、ゾーン間で 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.yaml -
次のコマンドを実行して、Pod の分散結果を表示します。
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 つの Pod が 2 つのゾーンに分散されていることがわかります。