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

Container Service for Kubernetes:特定のノードプールへのアプリケーションのスケジューリング

最終更新日:Mar 25, 2026

特定の構成を持つノードにアプリケーションをスケジュールするには、ノードプールにラベルを設定し、アプリケーションに対応する nodeSelector または nodeAffinity を構成します。

仕組み

特定のノードプールへの Pod のスケジューリングでは、ネイティブの Kubernetes スケジューリングメカニズムが使用されます。このメカニズムは、ノードの ラベル を使用して、Pod をノードプール内のノードと照合します。プロセスは次のとおりです。

  1. ノードプールにラベルを設定します。ノードプールは、同じ構成を持つノードのグループを管理します。ノードプールに ノードラベル (Labels) を設定すると、Container Service for Kubernetes (ACK) はそのラベルをプール内のすべてのノードに同期します。これには、スケールアウト中に追加される新しいノードも含まれます。

    [ノードプールの設定] を選択し、既存のノードのテイント (Taints) とノードラベル (Labels) を同期して更新する にチェックを入れると、ACK はノードラベルを既存のノードに自動的に同期します。
  2. Pod のスケジューリングルールを定義します。Pod の YAML ファイルで、<a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector" id="09ff6ac5341l1">nodeSelector</a> または <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity" id="95866abd0a387">nodeAffinity</a> を使用して、ターゲットノードのラベルを指定します。

  3. (任意) 排他的アクセスを構成します。ノードプールに Taint を構成して、対応する Toleration を持つ Pod のみがそのノードプールにスケジュールされるようにすることができます。

  4. 自動スケジューリング。スケジューラは、前述のルールに基づいて、指定された条件を満たすノードに Pod を自動的にスケジュールします。

ステップ 1:ノードプールのラベル設定

カスタムラベルをノードプールに追加して、ビジネスプロパティや環境を識別し、スケジューリング管理を簡素化できます。

ACK は、各ノードプールに対してグローバルに一意なラベル alibabacloud.com/nodepool-id を自動的に作成します。このラベルを使用して、ノードプールを完全に一致させることができます。
  1. Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。

  2. クラスターリスト ページで、お使いのクラスターの名前をクリックし、左側のナビゲーションウィンドウで ノード > ノードプール をクリックします。

  3. 送信先ノードプールのアクション列で、編集をクリックします。詳細オプションセクションを展開し、以下のパラメーターを設定します。

    • ノードラベル (Labels)

      • キー:フォーマットは prefix/name です。

        • name (必須):名前は 1~63 文字で、英数字 [a-z0-9A-Z] で始まり、英数字、ハイフン (-)、アンダースコア (_)、ピリオド (.) を含めることができます。

        • prefix (任意):プレフィックスは DNS サブドメイン である必要があります。DNS サブドメインは、ピリオド (.) で区切られた DNS ラベルで構成されます。プレフィックスは 253 文字以内で、スラッシュ (/) で終わる必要があります。

          kubernetes.io/ プレフィックスは Kubernetes のコアコンポーネント用に予約されています。したがって、この名前空間のタグキーは、kubelet.kubernetes.io/node.kubernetes.io/ などの許可されたプレフィックスで始まる必要があります。

      • 値(任意):値は最大 63 文字の長さにすることができます。先頭および末尾は英数字 [a-z0-9A-Z] で始まり、終わる必要があります。また、英字、数字、ハイフン (-)、アンダースコア (_)、およびピリオド (.) を含めることができます。

    • (任意) 必要に応じて、既存のノードのテイント (Taints) とノードラベル (Labels) を同期して更新する を選択します。

  4. 左側のナビゲーションウィンドウで、ノード > ノード を選択します。次に、ラベルとテイントの管理 をクリックし、タグ タブでノードラベルを表示します。

ステップ 2:アプリケーションスケジューリングポリシーの設定

ノードプールのラベルを取得した後、アプリケーションの YAML ファイルで nodeAffinity または nodeSelector を設定して、アプリケーションを送信先のノードプールにスケジュールできます。

  • nodeSelector:Pod をノードにアタッチする簡単な方法を提供します。ラベルの完全一致を使用して、Pod を特定のノードにデプロイします。

  • nodeAffinity: nodeSelector よりも柔軟性が高い。

    • 完全一致だけでなく、InNotInExists などの式もサポートします。

    • ソフトアフィニティ (preferredDuringSchedulingIgnoredDuringExecution) をサポートします。これは、スケジューラが条件を満たすノードへの Pod のスケジューリングを優先することを意味します。そのようなノードが利用できない場合、Pod は他のノードにスケジュールされることがあります。

  1. deployment.yaml ファイルを作成します。

    nodeAffinity

    nodeAffinity には、次のスケジューリングポリシーが含まれます:

    • requiredDuringSchedulingIgnoredDuringExecution (ハードアフィニティ):Pod は条件を満たすノードにスケジュールされる必要があります。条件を満たすノードがない場合、Pod はスケジュールできず、Pending 状態のままになります。

    • preferredDuringSchedulingIgnoredDuringExecution (ソフトアフィニティ):スケジューラは、条件を満たすノードへの Pod のスケジューリングを優先します。そのようなノードが見つからない場合、スケジューラはこのプリファレンスを無視し、利用可能な別のノードに Pod をスケジュールします。

    次の例は、アプリケーションがラベル pod: nginx を持つノードで実行されるようにする方法を示しています。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-with-affinity
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            nodeAffinity:
              # ハード要件:Pod は条件を満たすノードにスケジュールされる必要があります。
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: pod         # ノードラベルのキー
                    operator: In
                    values:
                    - nginx        # ノードラベルの値
          containers:
          - name: nginx-with-affinity
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            # 本番環境では、サービス品質 (QoS) を確保するためにコンテナのリソース要件を宣言します。
            resources:
              requests:
                cpu: "100m"
                memory: "128Mi"
              limits:
                cpu: "200m"
                memory: "256Mi"

    nodeSelector

    次の例は、アプリケーションが常にラベル pod: nginx を持つノードで実行されるようにする方法を示しています。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:
            pod: nginx      # Pod が送信先ノードで実行されるように、ノードにこのラベルが含まれている必要があることを指定します。
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            # 本番環境では、サービス品質 (QoS) を確保するためにコンテナのリソース要件を宣言します。
            resources:
              requests:
                cpu: "100m"
                memory: "128Mi"
              limits:
                cpu: "200m"
                memory: "256Mi"
  2. アプリケーションをデプロイします。

    kubectl apply -f deployment.yaml
  3. Pod の実行ステータスとスケジューリング結果を確認します。

    -o wide パラメーターを追加して、Pod がスケジュールされている特定のノードを表示できます。
    kubectl get pods -l app=nginx -o wide

    出力で Pod が送信先ノードにスケジュールされているかどうかを確認できます。

参考

  • ノードプールを使用したノード管理に加えて、シングルノードにラベルを設定して、より詳細なスケジューリングを実現することもできます。詳細については、「ノードラベルの管理」をご参照ください。

  • Pod が異常な状態 (例えば、長時間 Pending 状態のままなど) にある場合は、「Pod の例外のトラブルシューティング」をご参照ください。

  • ACK は、異なるインスタンスリソースの順次スケールアウトと逆順スケールイン、ノードの実際のリソース使用量に基づく負荷感知スケジューリングなど、より柔軟なスケジューリングポリシーを提供します。詳細については、「ACK が提供するスケジューリングポリシー」をご参照ください。

  • ハードアフィニティスケジューリングを使用し、クラスター内に条件を満たすノードがない場合、ACK は、対応するラベルを持ち、自動スケーリングが有効になっているノードプールから新しいノードを自動的にスケールアウトします。

  • ノードプール機能が導入される前に作成された古いクラスターには、管理外のワーカーノードが含まれている場合があります。詳細については、「管理外ノードのノードプールへの移行」をご参照ください。