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

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

最終更新日:Nov 03, 2025

特定の構成を持つノードに特定のアプリケーションをスケジューリングするには、ノードプールに ラベル を追加し、アプリケーションの Pod 仕様 (spec) で対応する nodeSelector または nodeAffinity を設定します。

仕組み

特定のノードプールへの Pod のスケジューリングは、Kubernetes ネイティブのスケジューリングメカニズムを利用します。Pod のスケジューリングルールをプール内のノードの ラベル と照合することで、配置を制御できます。ワークフローは次のとおりです。

  1. ノードプールにラベルを付与: ノードプールは、同一の構成を持つノードのグループを管理します。ノードプールに [ノードラベル] を設定すると、Container Service for Kubernetes (ACK) はこれらのラベルをそのプール内の現在および将来のすべてのノードに自動的に伝播します。

    ラベルが既存のノードに適用されるようにするには、ノードプールの設定で [既存のノードのラベルと Taint を更新]
  2. Pod のスケジューリングルールの定義: Pod の YAML マニフェストで、nodeSelector または nodeAffinity を使用してターゲットノードのラベルを指定します。

  3. (オプション) 排他的アクセスの設定: 特定のワークロード専用にノードプールを予約するには、ノードプールに Taint を追加します。これにより、対応する Toleration を持たない Pod がそのプール内のノードにスケジューリングされるのを防ぎます。

  4. 自動スケジューリング: スケジューラは、定義されたすべてのルールを満たすノードに Pod を自動的に配置します。

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

スケジューリングのために、ビジネス属性、環境、その他のメタデータを識別できるよう、ノードプールにカスタムラベルを追加します。

ACK は、各ノードプールに対してグローバルに一意のラベル alibabacloud.com/nodepool-id を自動的に作成します。このラベルを使用して、ノードプールを正確に照合できます。
  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノードプール] を選択します。

  3. ターゲットノードプールを見つけ、[アクション] 列の [編集] をクリックします。[詳細オプション (オプション)] セクションを展開し、[ノードラベル] を構成します。

    • キー: prefix/name の形式である必要があります。

      • Name (必須): 長さは 1~63 文字で、英数字 ([a-z0-9A-Z]) で開始および終了する必要があります。ハイフン (-)、アンダースコア (_)、ドット (.)、および英数字を含めることができます。

      • Prefix (オプション): DNS サブドメイン である必要があります。これはドット (.) で区切られた一連の DNS ラベルです。プレフィックスの全長は 253 文字を超えてはならず、スラッシュ (/) で終わる必要があります。

        説明

        kubernetes.io/ プレフィックスは Kubernetes のコアコンポーネント用に予約されています。この名前空間を使用する場合、ラベルキーは 必ず 次のいずれかで始まる必要があります: kubelet.kubernetes.io/ または node.kubernetes.io/

    • (オプション): 長さは 1~63 文字にすることができ、英数字 ([a-z0-9A-Z]) で開始および終了する必要があります。ハイフン (-)、アンダースコア (_)、ドット (.)、および英数字を含めることができます。

  4. (オプション) 必要に応じて [既存のノードのラベルと Taint を更新] を選択します。

  5. 変更を保存します。[ノード] ページに移動して、ラベルが適用されていることを確認します。次に、[ラベルと Taint の管理] をクリックし、各ノードのラベルを確認します。

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

ノードプールにラベルを付けたら、nodeSelector または nodeAffinity のいずれかを使用して、アプリケーションの Deployment YAML でターゲットを指定できます。

  • nodeSelector: 1 つ以上のラベルについて完全一致を要求する、シンプルで直接的なノード選択方法を提供します。

  • nodeAffinity: 以下を含む、より表現力豊かで柔軟なスケジューリングルールを提供します。

    • InNotInExists などのオペレーター。

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

    • ソフトアフィニティ (preferredDuringSchedulingIgnoredDuringExecution): スケジューラーは、条件を満たすノードへの Pod の配置を 優先します が、一致するノードが利用できない場合は、他のノードにスケジューリングします。

Deployment の例

  1. deployment.yaml という名前のファイルを作成します。以下の例は、pod: nginx というラベルを持つノードに Nginx Deployment をスケジューリングする方法を示しています。

    nodeAffinity

    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

    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 は、必要なラベルを持つ 自動スケーリング が有効なノードプールから新しいノードを自動的にプロビジョニングします。

  • ノードプール機能が導入される前に作成されたクラスターには、管理対象外のワーカーノード (遊離ノード) が含まれている場合があります。一貫した管理を確保するために、これらのノードをノードプールに移行する ことを推奨します。