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

Container Compute Service:ACK Pro マネージドクラスターは、ECS インスタンスと ACS 計算能力のコロケーションスケジューリングをサポートしています。

最終更新日:Jan 17, 2025

ポッドスケジューリングにおける弾力性の要件を満たすために、Alibaba Cloud は優先順位ベースのリソーススケジューリングを提供しています。アプリケーションのリリースまたはスケーリング中に、カスタムリソースポリシーを設定して、アプリケーションポッドを Alibaba Cloud Container Compute Service (ACS) にスケジューリングできます。これにより、Elastic Compute Service (ECS) インスタンスと ACS ポッドをコロケーション方式でデプロイできます。

重要

kube-scheduler v1.x.x-aliyun-6.4 以降では、ResourcePolicy の ignorePreviousPod パラメーターはデフォルトで False に設定され、ignoreTerminatingPod パラメーターはデフォルトで True に設定されます。前述のパラメーターを使用する既存の ResourcePolicy は、この変更または今後の更新の影響を受けません。

制限事項

  • スケールインシナリオでこの機能を pod-deletion-cost とともに使用する場合、逆順でのスケールインを実行することはできません。

  • max パラメーターは、クラスターで Kubernetes 1.26 以降が実行されており、クラスターにインストールされているスケジューラのバージョンが 6.7 以降の場合にのみ使用できます。

  • この機能をエラスティックノードプールとともに使用すると、無効なノードがエラスティックノードプールに追加される可能性があります。エラスティックノードプールがユニットに含まれていることを確認してください。ユニットに max パラメーターを指定しないでください

使用方法

Container Service for Kubernetes (ACK) Pro マネージドクラスターの優先順位ベースのスケジューリング機能の詳細については、「優先順位ベースのリソーススケジューリングを設定する」をご参照ください。

前提条件

  • クラスターの Kubernetes バージョンに基づいて、特定のバージョンのスケジューラが必要です。次の表は、各 Kubernetes バージョンに必要なスケジューラバージョンと仮想ノードバージョンを示しています。

    Kubernetes バージョン

    スケジューラバージョン

    仮想ノードバージョン

    ≥ V1.26

    ≥ V1.26.3-aliyun-6.7.0

    ≥ V2.13.0

  • さまざまなスケジューラバージョンの機能の詳細については、「kube-scheduler」をご参照ください。

  • ACK Pro マネージドクラスターの ACS の計算能力を有効にする方法については、「ACK Pro マネージドクラスターで ACS の計算能力を使用する」をご参照ください。

ECS インスタンスと ACS 計算能力のコロケーションスケジューリング

サブスクリプション ECS インスタンス、従量課金 ECS インスタンス、ACS ポッドなど、複数のタイプのリソースにデプロイメントのポッドをスケジューリングするとします。リソースコストを削減するために、サブスクリプション ECS インスタンス > 従量課金 ECS インスタンス > ACS ポッドという優先順位に基づいて、ポッドをリソースにスケジューリングします。スケールインアクティビティでは、ACS ポッド、従量課金 ECS インスタンス、サブスクリプション ECS インスタンスの順序で、これらのリソースからポッドを削除します。この例では、各ノードに 2 vCPU と 4 GB のメモリがあります。ECS インスタンスと ACS 計算能力のコロケーションスケジューリングを設定するには、次の手順を実行します。

  1. 次のコマンドを実行して、異なる課金方法を示す ラベル をノードに追加します。ノードプールを使用して、ラベル をノードに自動的に追加することもできます。

    kubectl label node cn-beijing.10.0.3.137 paidtype=subscription 
    kubectl label node cn-beijing.10.0.3.138 paidtype=subscription
    kubectl label node cn-beijing.10.0.6.46 paidtype=pay-as-you-go
    kubectl label node cn-beijing.10.0.6.47 paidtype=pay-as-you-go

    ノード ラベル の説明

    • paidtype=subscription: サブスクリプション

    • paidtype=pay-as-you-go: 従量課金

  2. 次の内容に基づいて ResourcePolicy を作成します。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: nginx
      namespace: default
    spec:
      selector:
        app: nginx               # ResourcePolicy を適用するポッドのラベルを指定する必要があります。
      strategy: prefer
      units:
      - resource: ecs
        nodeSelector:
          paidtype: subscription
      - resource: ecs
        nodeSelector:
          paidtype: pay-as-you-go
      - resource: acs 
  3. 次のテンプレートを使用して、2 つのポッドをプロビジョニングするデプロイメントを作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx                                           # ポッドラベルは、ResourcePolicy のセレクターに指定したものと同じである必要があります。
            alibabacloud.com/compute-class: general-purpose      # ACS 計算能力の計算クラス。デフォルト値: general-purpose。
            alibabacloud.com/compute-qos: default                # ACS ポッドのサービス品質 (QoS) クラス。デフォルト値: default。
        spec:
          containers:
          - name: nginx
            image: registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: 2
              requests:
                cpu: 2
  4. NGINX アプリケーションをデプロイし、ポッドをクエリします。

    1. 次のコマンドを実行して、NGINX アプリケーションをデプロイします。

      kubectl apply -f nginx.yaml 

      予期される出力:

      deployment.apps/nginx created
    2. 次のコマンドを実行して、ポッドをクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-b****   1/1     Running   0          66s   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          66s   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      出力は、2 つのポッドが paidtype=subscription ラベル を持つノードにスケジューリングされていることを示しています。この例では、cn-beijing.10.0.3.137 と cn-beijing.10.0.3.138 が使用されています。

  5. NGINX アプリケーションのポッドをスケールアウトします。

    1. 次のコマンドを実行して、ポッドの数を 4 つに増やします。

      kubectl scale deployment nginx --replicas 4

      予期される出力:

      deployment.apps/nginx scaled
    2. 次のコマンドを実行して、ポッドのステータスをクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running   0          16s     172.29.113.155   cn-beijing.10.0.6.47    <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running   0          3m48s   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running   0          16s     172.29.113.88    cn-beijing.10.0.6.46    <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          3m48s   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      paidtype=subscription ラベル を持つノードではリソースが不足しているため、新しいポッドは paidtype=pay-as-you-go ラベル を持つノードにスケジューリングされています。この例では、cn-beijing.10.0.6.46 と cn-beijing.10.0.6.47 が使用されています。

    3. 次のコマンドを実行して、ポッドの数を 6 つに増やします。

      kubectl scale deployment nginx --replicas 6

      予期される出力:

      deployment.apps/nginx scaled
    4. 次のコマンドを実行して、ポッドのステータスをクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS    RESTARTS   AGE     IP               NODE                           NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running   0          3m10s   172.29.113.155   cn-beijing.10.0.6.47           <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running   0          6m42s   172.29.112.215   cn-beijing.10.0.3.137          <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running   0          3m10s   172.29.113.88    cn-beijing.10.0.6.46           <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          6m42s   172.29.113.23    cn-beijing.10.0.3.138          <none>           <none>
      nginx-9cdf7bbf9-s****   1/1     Running   0          36s     10.0.6.68        virtual-kubelet-cn-beijing-j   <none>           <none>
      nginx-9cdf7bbf9-v****   1/1     Running   0          36s     10.0.6.67        virtual-kubelet-cn-beijing-j   <none>           <none>

      出力は、ECS インスタンスのリソースが不足していることを示しています。ポッドは ACS にスケジューリングされています。この例では、virtual-kubelet-cn-beijing-j が使用されています。

  6. NGINX アプリケーションのポッドをスケールインします。

    1. 次のコマンドを実行して、ポッドの数を 4 つに減らします。

      kubectl scale deployment nginx --replicas 4

      予期される出力:

      deployment.apps/nginx scaled
    2. 次のコマンドを実行して、ポッドのステータスをクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS        RESTARTS   AGE     IP               NODE                           NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   1/1     Running       0          4m59s   172.29.113.155   cn-beijing.10.0.6.47           <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running       0          8m31s   172.29.112.215   cn-beijing.10.0.3.137          <none>           <none>
      nginx-9cdf7bbf9-f****   1/1     Running       0          4m59s   172.29.113.88    cn-beijing.10.0.6.46           <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running       0          8m31s   172.29.113.23    cn-beijing.10.0.3.138          <none>           <none>
      nginx-9cdf7bbf9-s****   1/1     Terminating   0          2m25s   10.0.6.68        virtual-kubelet-cn-beijing-j   <none>           <none>
      nginx-9cdf7bbf9-v****   1/1     Terminating   0          2m25s   10.0.6.67        virtual-kubelet-cn-beijing-j   <none>           <none>

      出力は、ACS 上で実行されているポッドが削除されていることを示しています。

    3. 次のコマンドを実行して、ポッドの数を 2 つに減らします。

      kubectl scale deployment nginx --replicas 2

      予期される出力:

      deployment.apps/nginx scaled
    4. 次のコマンドを実行して、ポッドのステータスをクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS        RESTARTS   AGE     IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-4****   0/1     Terminating   0          6m43s   172.29.113.155   cn-beijing.10.0.6.47    <none>           <none>
      nginx-9cdf7bbf9-b****   1/1     Running       0          10m     172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-f****   0/1     Terminating   0          6m43s   172.29.113.88    cn-beijing.10.0.6.46    <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running       0          10m     172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      paidtype=pay-as-you-go ラベル を持つノード上のポッドが削除されていることが出力に示されています。

    5. 数分待ってから、次のコマンドを再度実行してポッドの状態をクエリします。

      kubectl get pods -o wide

      予期される出力:

      NAME                    READY   STATUS    RESTARTS   AGE   IP               NODE                    NOMINATED NODE   READINESS GATES
      nginx-9cdf7bbf9-b****   1/1     Running   0          11m   172.29.112.215   cn-beijing.10.0.3.137   <none>           <none>
      nginx-9cdf7bbf9-r****   1/1     Running   0          11m   172.29.113.23    cn-beijing.10.0.3.138   <none>           <none>

      出力は、paidtype=subscription ラベル が付いたノード上でのみポッドが実行されていることを示しています。

関連情報

  • ACK クラスタをデプロイするときに、許容とノードアフィニティを設定して、スケジューラが ECS インスタンスまたは ACS の計算能力のみを使用できるようにするか、ECS インスタンスが不足している場合にスケジューラが ACS 計算リソースを自動的に適用できるようにすることができます。さまざまなスケジューリングポリシーを設定して、さまざまなシナリオでリソースをスケーリングできます。詳細については、「ACK Pro マネージドクラスターで ACS の計算能力を使用する」をご参照ください。

  • 高可用性と高パフォーマンスは、分散ジョブにとって不可欠です。 ACK Pro マネージドクラスターでは、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、高可用性のためにゾーン全体に分散ジョブを分散できます。また、Kubernetes ネイティブのスケジューリングセマンティクスを使用して、高パフォーマンスのためにアフィニティ設定に基づいて特定のゾーンに分散ジョブをデプロイすることもできます。詳細については、「ノードアフィニティスケジューリング」をご参照ください。