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

Container Compute Service:Pod アフィニティスケジューリング

最終更新日:Mar 01, 2026

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 の schedulerNamedefault-scheduler です。

  • スケジューラコンポーネントの構成で、[GPU-HPN ノードのカスタムタグとスケジューラを有効にする] が選択されていない。

プロトコルフィールドと制約は以下の通りです。

  • requiredDuringSchedulingIgnoredDuringExecution ポリシー。

    フィールド

    説明

    制約

    LabelSelector

    一致する Pod を検索します。このラベルを持つ Pod は、各トポロジードメインに存在する Pod の数を決定するためにカウントされます。

    汎用、コンピューティング最適化、GPU などの他のインスタンスタイプの Pod は、この合計にはカウントされません。

    Namespaces

    一致する Pod を検索する名前空間を指定します。`LabelSelector` とともに使用されます。

    サポートされていません

    NamespaceSelector

    `Namespaces` フィールドに似ていますが、名前の代わりに名前空間ラベルで名前空間を選択します。

    サポートされていません

  • preferredDuringSchedulingIgnoredDuringExecution プロトコルはサポートされていません。

各フィールドの詳細については、「Pod のアフィニティおよびアンチアフィニティ」をご参照ください。

この例では、podAffinity を使用してアプリケーションを特定のゾーンにスケジュールする方法を示します。

  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. 次の 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
  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. 次の 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
  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 が同じゾーンで実行されます。