すべてのプロダクト
Search
ドキュメントセンター

Container Compute Service:Pod 間のアフィニティに基づいて Pod をスケジュールする

最終更新日:Mar 26, 2025

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 をスケジュールする方法を示しています。

  1. 次のコマンドを実行して、クラスタ内のノードを表示します。

    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
  2. 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
  3. 次のコマンドを実行して、with-affinity-label-pod ファイルをクラスタにデプロイします。

    kubectl apply -f with-affinity-pod.yaml
  4. 次のコマンドを実行して、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 ゾーンにスケジュールされていることを示しています。

  5. 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
  6. 次のコマンドを実行して、origin-affinity-pod.yaml ファイルをクラスタにデプロイします。

    kubectl apply -f origin-affinity-pod.yaml
  7. 次のコマンドを実行して、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 が同じゾーンにデプロイされていることを示しています。