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

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

最終更新日:Sep 17, 2026

ACS クラスターは、ノードを仮想ノードとして表現し、アベイラビリティーゾーン、リージョン、GPU モデルなどのノード属性を Kubernetes ラベルとして公開します。Pod spec で nodeSelector または nodeAffinity を使用して、特定の属性を持つ仮想ノードに Pod をスケジュールできます。

前提条件

作業を開始する前に、以下を確認してください。

  • お使いのクラスターに対応する最小バージョン以上の kube-scheduler がインストールされていること。

    ACS クラスターバージョン 最小 kube-scheduler バージョン
    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 以降がインストールされていること。

説明

kube-scheduler の新しいバージョンでは、[GPU-HPN ノードおよびスケジューラのカスタムラベルを有効化] オプションがデフォルトで有効になっています。手動での設定は必要ありません。詳細については、「kube-scheduler」をご参照ください。

スケジューリング方法の選択

方法 使用するケース
nodeSelector 特定のラベルを持つノードに Pod を固定します。最もシンプルな方法のため、まずはこちらの使用を検討してください。
nodeAffinity 複数のラベル条件や演算子ベースのマッチング (In、NotIn、Exists) など、より表現力の高いスケジューリングルールを記述します。

利用可能なノードラベル

ACS 仮想ノードは、スケジューリング用に以下のラベルを公開します。

ラベルキー 説明 値の例
topology.kubernetes.io/zone アベイラビリティーゾーン cn-hangzhou-j
topology.kubernetes.io/region リージョン cn-hangzhou
kubernetes.io/hostname 仮想ノード名 virtual-kubelet-cn-hangzhou-j

nodeSelector

nodeSelector は、ラベルによって Pod を仮想ノードにマッチングします。Pod spec にある nodeSelector の下にターゲットラベルを追加します。具体的な例については、「特定のゾーンへの Pod のスケジュール」をご参照ください。

nodeAffinity

nodeAffinity は、nodeSelector と同じラベルベースのマッチングをサポートしますが、より表現力豊かな構文を提供します。次の 2 つのモードがあります。

モード 動作
requiredDuringSchedulingIgnoredDuringExecution (ハードアフィニティ) スケジューラーは、ルールを満たすノードにのみ Pod を配置します。一致するノードが存在しない場合、Pod はスケジュールされません。
preferredDuringSchedulingIgnoredDuringExecution (ソフトアフィニティ) スケジューラーは一致するノードを検索しようとします。一致するノードが見つからない場合でも、Pod は適格な任意のノードにスケジュールされます。
説明

同じ Pod に nodeSelector と nodeAffinity の両方を指定した場合、Pod がスケジュールされるには両方の条件を満たす必要があります。nodeSelectorTerms 内では、複数のタームが OR ロジックで評価されます。つまり、いずれか 1 つのタームが一致すれば Pod がスケジュールされます。1 つのターム内では、複数の matchExpressions エントリが AND ロジックで評価されます。つまり、すべての式が一致する必要があります。

GPU-HPN Pod の制約

以下の 3 つの条件がすべて 満たされる場合、次の制約が適用されます。

  • Pod が GPU-HPN (High-Performance Network GPU) コンピューティングタイプを使用していること。

  • Pod の schedulerName が default-scheduler であること。

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

フィールド 制約
requiredDuringSchedulingIgnoredDuringExecution nodeSelectorTerms の matchExpressions には、サポートされているアフィニティラベルのみを指定できます。matchFields は指定できません。
preferredDuringSchedulingIgnoredDuringExecution サポートされていません。

汎用、コンピューティング最適化、および GPU インスタンスタイプの場合、nodeAffinity にこのような制約はありません。

特定のゾーンへの Pod のスケジュール

この例では、nodeSelector を使用して、Deployment を cn-hangzhou-j ゾーンにスケジュールします。

  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 ゾーンに Pod を固定します
          nodeSelector:
            topology.kubernetes.io/zone: cn-hangzhou-j
  3. マニフェストを適用します。

    kubectl apply -f dep-node-selector-demo.yaml
  4. すべての Pod が cn-hangzhou-j ゾーンにスケジュールされていることを確認します。

    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 つの Pod すべてが virtual-kubelet-cn-hangzhou-j で実行されており、ゾーンレベルのスケジューリングが期待どおりに機能していることが確認できます。

次のステップ