Pod 間のアフィニティスケジューリングポリシーは、Pod 間のアフィニティプリファレンスを表現するために使用されます。ノードアフィニティと比較して、Pod 間のアフィニティスケジューリングは、ノードで既に実行されている Pod のラベルに基づいて、Pod をスケジュールできるノードを制限します。Alibaba Cloud Container Service for Kubernetes (ACK) クラスタでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、Pod 間のアフィニティスケジューリングを実装できます。 podAffinity または podAntiAffinity フィールドでトポロジードメインとラベルルールを指定することにより、指定されたトポロジードメインに Pod をスケジュールできます。このトピックでは、ACK における Pod 間のアフィニティスケジューリングの制限事項と使用上の注意について説明します。
前提条件
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 以降であること。
使用上の注意
Pod 間のアフィニティには、アフィニティモードとアンチアフィニティモードが含まれます。どちらのモードも同じプロトコル形式で、requiredDuringSchedulingIgnoredDuringExecution ルールと preferredDuringSchedulingIgnoredDuringExecution ルールで構成されます。 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 はさまざまなコンピュートクラスをサポートしています。異なるコンピュートクラスの Pod に対して Pod 間のアフィニティの他のフィールドを設定する場合、次の制約があります。
requiredDuringSchedulingIgnoredDuringExecutionコンピュートクラス
フィールド
説明
制約
汎用
パフォーマンス向上
LabelSelector
このフィールドは、一致する Pod を検索するために使用されます。このラベルセレクターに一致する Pod がカウントされ、トポロジードメイン内の Pod の数が決定されます。
GPU アクセラレーテッド Pod と GPU-HPN Pod はカウントされません。
Namespaces
このフィールドは、一致する名前空間を検索するために使用され、LabelSelector フィールドと組み合わせて使用できます。
NamespaceSelector
このフィールドは Namespaces フィールドに似ていますが、名前空間ラベルに基づいて名前空間を取得する点が異なります。
GPU アクセラレーテッド
GPU-HPN
LabelSelector
このフィールドは、一致する Pod を検索するために使用されます。このラベルセレクターに一致する Pod がカウントされ、トポロジードメイン内の Pod の数が決定されます。
汎用 Pod とパフォーマンス向上 Pod はカウントされません。
Namespaces
このフィールドは、一致する名前空間を検索するために使用され、LabelSelector フィールドと組み合わせて使用できます。
サポートされていません
NamespaceSelector
このフィールドは Namespaces フィールドに似ていますが、名前空間ラベルに基づいて名前空間を取得する点が異なります。
サポートされていません
preferredDuringSchedulingIgnoredDuringExecutionコンピュートクラス
フィールド
説明
制約
汎用
パフォーマンス向上
LabelSelector
Namespaces
NamespaceSelector
なし
GPU アクセラレーテッド Pod と GPU-HPN Pod はカウントされません。
GPU アクセラレーテッド
GPU-HPN
すべてのフィールド
なし
サポートされていません
フィールドの詳細については、「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-xxwith-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 ゾーンにスケジュールされていることを示しています。
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 が同じゾーンにデプロイされていることを示しています。