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

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

最終更新日:Dec 27, 2024

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

前提条件

  • ACKクラスタが作成されていること。詳細については、ACKクラスタの作成を参照してください。

  • kube-schedulerがインストールされていること。詳細については、kube-schedulerを参照してください。

  • acs-virtual-node v2.12.0-acs.4以降がインストールされていること。

注意事項

nodeSelectorフィールドを使用してノードにラベルを追加することにより、ノードアフィニティスケジューリングを実装できます。次の表に、さまざまなタイプのノードでACKがサポートするラベルを示します。

ノードタイプ

ラベル

説明

通常ノード

topology.kubernetes.io/zone

ネットワークゾーン

topology.kubernetes.io/zone: cn-shanghai-b

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

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

フィールド

説明

制約

  • GPUアクセラレーテッド

requiredDuringSchedulingIgnoredDuringExecution

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

nodeSelectorTermsフィールドの場合:

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

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

preferredDuringSchedulingIgnoredDuringExecution

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

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

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

次の例は、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. 次のコマンドを実行して、Podの分散結果を表示します。

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