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

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

最終更新日:Dec 27, 2024

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

  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 // 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
  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 が同じゾーンに分散されていることを示しています。