Pod アフィニティスケジューリングは、Pod のコロケーションに関する優先設定を指定します。ノードアフィニティとは異なり、Pod アフィニティでは、仮想ノード上で実行中の Pod のラベルに基づいて、Pod のスケジュール先を制約できます。ACS クラスターでは、ネイティブの Kubernetes スケジューリングセマンティクスを使用して Pod アフィニティを実装します。`podAffinity` または `podAntiAffinity` フィールドでトポロジードメインとラベルルールを指定して、Pod を特定のトポロジードメインにスケジュールします。このトピックでは、ACS における Pod アフィニティスケジューリングの制約と使用方法について説明します。
前提条件
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 クラスターでは、Pod アフィニティは、次のすべての条件を満たす Pod で使用する場合に制約があります。
ACS スケジューラコンポーネントの [GPU-HPN ノードのカスタムタグとスケジューラを有効にする] 構成は、新しいバージョンではデフォルトで有効になっています。詳細については、「kube-scheduler」をご参照ください。
Pod が高性能ネットワーク GPU (GPU-HPN) コンピュートタイプを使用している。
Pod の
schedulerNameはdefault-schedulerです。スケジューラコンポーネントの構成で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] が選択されていない。
プロトコルフィールドと制約は以下の通りです。
requiredDuringSchedulingIgnoredDuringExecutionポリシー。フィールド
説明
制約
LabelSelector
一致する Pod を検索します。このラベルを持つ Pod は、各トポロジードメインに存在する Pod の数を決定するためにカウントされます。
汎用、コンピューティング最適化、GPU などの他のインスタンスタイプの Pod は、この合計にはカウントされません。
Namespaces
一致する Pod を検索する名前空間を指定します。`LabelSelector` とともに使用されます。
サポートされていません
NamespaceSelector
`Namespaces` フィールドに似ていますが、名前の代わりに名前空間ラベルで名前空間を選択します。
サポートされていません
preferredDuringSchedulingIgnoredDuringExecutionプロトコルはサポートされていません。
各フィールドの詳細については、「Pod のアフィニティおよびアンチアフィニティ」をご参照ください。
例
この例では、podAffinity を使用してアプリケーションを特定のゾーンにスケジュールする方法を示します。
次のコマンドを実行して、クラスター内の仮想ノードを一覧表示します。
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 コンテンツを含む `with-affinity-pod.yaml` という名前のファイルを作成します。
apiVersion: v1 kind: Pod metadata: labels: pod-affinity-label: with-pod-affinity name: with-affinity-label-pod spec: containers: - args: - 'infinity' command: - sleep image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 imagePullPolicy: IfNotPresent name: stress resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi次のコマンドを実行して、`with-affinity-label-pod` をクラスターにデプロイします。
kubectl apply -f with-affinity-pod.yaml次のコマンドを実行して、ノード間での Pod の分散状況を確認します。
kubectl get pod -o wide想定される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES with-affinity-label-pod 1/1 Running 0 75s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>Pod はゾーン `cn-hangzhou-i` にスケジュールされます。
次の YAML コンテンツを含む `origin-affinity-pod.yaml` という名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: dep-pod-affinity labels: app: pod-affinity-demo spec: replicas: 4 selector: matchLabels: app: pod-affinity-demo template: metadata: labels: app: pod-affinity-demo spec: containers: - name: pod-affinity-demo image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi # Pod アフィニティを適用して、`pod-affinity-label:with-pod-affinity` というラベルが付いた Pod と同じゾーンに Pod を配置します affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: pod-affinity-label operator: In values: - with-pod-affinity topologyKey: topology.kubernetes.io/zone次のコマンドを実行して、`origin-affinity-pod.yaml` をクラスターにデプロイします。
kubectl apply -f origin-affinity-pod.yaml次のコマンドを実行して、ノード間での Pod の分散状況を確認します。
kubectl get pod -o wide想定される出力:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dep-pod-affinity-6b9d4f7c87-5jlfx 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-hwdpc 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-jfcrq 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> dep-pod-affinity-6b9d4f7c87-xwbfr 1/1 Running 0 3m26s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none> with-affinity-label-pod 1/1 Running 0 6m30s 192.168.xx.xxx virtual-kubelet-cn-hangzhou-i <none> <none>すべての Pod が同じゾーンで実行されます。