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-xx
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 ゾーンにスケジュールされていることを示しています。
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 が同じゾーンにデプロイされていることを示しています。