Pod 間のアフィニティスケジューリングポリシーは、Pod 間のアフィニティ設定を表すために使用されます。ノードアフィニティと比較して、Pod 間のアフィニティスケジューリングは、ノード上で既に実行されている Pod のラベルに基づいて、Pod をスケジュールできるノードを制限します。Alibaba Cloud Container Service for Kubernetes (ACK) クラスタでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、Pod 間のアフィニティスケジューリングを実装できます。 podAffinity または podAntiAffinity フィールドでトポロジードメインとラベルルールを指定することで、Pod を指定されたトポロジードメインにスケジュールできます。このトピックでは、ACK における Pod 間のアフィニティスケジューリングの制限事項と使用上の注意について説明します。
前提条件
ACK クラスタが作成されていること。詳細については、ACK クラスタの作成を参照してください。
kube-scheduler がインストールされていること。詳細については、kube-schedulerを参照してください。
acs-virtual-node v2.12.0-acs.4 以降がインストールされていること。
使用上の注意
Pod 間のアフィニティには、アフィニティモードとアンチアフィニティモードがあります。どちらのモードも同じプロトコル形式で、requiredDuringSchedulingIgnoredDuringExecution
ルールと preferredDuringSchedulingIgnoredDuringExecution
ルールで構成されます。TopologyKey フィールドは必須であり、仮想ノードのラベルに対応します。次の表に、さまざまなタイプのノードについて ACK でサポートされているトポロジラベルを示します。
ノードタイプ | ラベル | 説明 | 例 |
通常ノード | topology.kubernetes.io/zone | ネットワークゾーン | topology.kubernetes.io/zone: cn-shanghai-b |
ACK は複数のコンピュートクラスをサポートしています。トポロジー分散制約の他のフィールドを使用する場合、異なるコンピュートクラスには次の制約があります。
requiredDuringSchedulingIgnoredDuringExecution
コンピュートクラス
フィールド
説明
制約
汎用
パフォーマンス向上
LabelSelector
このフィールドは、一致する Pod を検索するために使用されます。このラベルセレクターに一致する Pod がカウントされ、トポロジードメイン内の Pod の数が決定されます。
GPU アクセラレーションやパフォーマンス向上などの他のコンピュートクラスの Pod はカウントされません。
Namespaces
このフィールドは、一致する名前空間を検索するために使用され、LabelSelector フィールドと一緒に使用できます。
NamespaceSelector
このフィールドは Namespaces フィールドに似ていますが、名前空間ラベルに基づいて名前空間を取得する点が異なります。
GPU アクセラレーション
LabelSelector
このフィールドは、一致する Pod を検索するために使用されます。このラベルセレクターに一致する Pod がカウントされ、トポロジードメイン内の Pod の数が決定されます。
汎用やパフォーマンス向上などの他のコンピュートクラスの Pod はカウントされません。
Namespaces
このフィールドは、一致する名前空間を検索するために使用され、LabelSelector フィールドと一緒に使用できます。
サポートされていません
NamespaceSelector
このフィールドは Namespaces フィールドに似ていますが、名前空間ラベルに基づいて名前空間を取得する点が異なります。
サポートされていません
preferredDuringSchedulingIgnoredDuringExecution
コンピュートクラス
フィールド
説明
制約
汎用
パフォーマンス向上
LabelSelector
Namespaces
NamespaceSelector
なし
GPU アクセラレーションやパフォーマンス向上などの他のコンピュートクラスの Pod はカウントされません。
フィールドの詳細については、Pod 間のアフィニティとアンチアフィニティを参照してください。
例
次の例は、podAffinity
フィールドを設定して、Pod を特定のゾーンにスケジュールする方法を示しています。
次のコマンドを実行して、クラスタ内のノードを表示します。
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
with-affinity-pod.yaml という名前のファイルを作成し、次の内容をファイルに追加します。
apiVersion: v1 kind: Pod metadata: labels: pod-affinity-label: with-pod-affinity // Pod アフィニティラベル 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 ゾーンにスケジュールされていることを示しています。
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 は、<pod-affinity-label:with-pod-affinity> ラベルが付いた 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 が同じゾーンに分散されていることを示しています。