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

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

最終更新日:Mar 26, 2025

Alibaba Cloud Container Service for Kubernetes (ACK) クラスタ内のすべてのノードは仮想ノードです。 ラベルは、ゾーン、リージョン、仮想ノードの GPU モデルなど、ノードのさまざまな属性をマークするために使用されます。 ACK クラスタでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、ノードアフィニティスケジューリングを実装できます。 nodeSelector または nodeAffinity フィールドでノード属性を設定することにより、特定の属性を持つ仮想ノードにポッドをスケジュールできます。 このトピックでは、ACK のノードアフィニティスケジューリングについて説明します。

前提条件

  • 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 以降であること。

使用上の注意

nodeSelector

nodeSelector フィールドを設定して仮想ノードにラベルを追加することにより、ノードアフィニティスケジューリングを実装できます。 次の表に、さまざまなタイプの仮想ノードで 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

alibabacloud.com/gpu-model-series

GPU モデル

alibabacloud.com/gpu-model-series: <example-model>

nodeAffinity

ノードアフィニティを使用して、ノードのアフィニティ属性を指定することもできます。 ただし、nodeAffinity の方が表現力豊かです。 さまざまなコンピューティングクラスに対して、ACK は特定のフィールドに制約を提供します。 次の表に、制約を示します。

コンピューティングクラス

フィールド

説明

制約

  • GPU アクセラレーション

  • GPU-HPN

requiredDuringSchedulingIgnoredDuringExecution

ルールが満たされている場合にのみ、ポッドをスケジュールできます。 このフィールドは、nodeSelector フィールドに似ています。

nodeSelectorTerms フィールドの場合:

  • matchExpressions フィールドには、上記の affinity ラベルのみを追加できます。

  • matchFields フィールドはサポートされていません。

preferredDuringSchedulingIgnoredDuringExecution

このフィールドは、重み付けに基づいてノードアフィニティを指定するために使用されます。 スケジューラは、ルールを満たすノードを見つけようとします。 ただし、一致するノードが使用できない場合でも、スケジューラはポッドをスケジュールします。

サポートされていません。

汎用およびパフォーマンス強化コンピューティングクラスのポッドでは、nodeAffinity フィールドの上記の制約は使用できません。

次の例は、nodeSelector フィールドを設定してアプリケーションを特定のゾーンにスケジュールする方法を示しています。

  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. dep-node-selector-demo.yaml という名前のファイルを作成し、次の内容をファイルに追加します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-node-selector-demo
      labels:
        app: node-selector-demo
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: node-selector-demo
      template:
        metadata:
          labels:
            app: node-selector-demo
        spec:
          containers:
          - name: node-selector-demo
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "infinity"
          # ゾーンを cn-hangzhou-j に設定します。
          nodeSelector:
            topology.kubernetes.io/zone: cn-hangzhou-j
  3. 次のコマンドを実行して、アプリケーションをクラスタにデプロイします。

    kubectl apply -f dep-node-selector-demo.yaml
  4. 次のコマンドを実行して、ポッドの分散結果を表示します。

    kubectl get pod -o wide

    期待される結果:

    NAME                                     READY   STATUS    RESTARTS   AGE    IP               NODE                            NOMINATED NODE   READINESS GATES
    dep-node-selector-demo-b4578576b-cgpfq   1/1     Running   0          112s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-fs8kl   1/1     Running   0          110s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-nh8zm   1/1     Running   0          2m8s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>
    dep-node-selector-demo-b4578576b-rpp8l   1/1     Running   0          2m8s   192.168.xx.xxx   virtual-kubelet-cn-hangzhou-j   <none>           <none>

    出力は、4 つのポッドが cn-hangzhou-j ゾーンに分散されていることを示しています。