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

Container Service for Kubernetes:ack-co-scheduler を使用した多階層エラスティックスケジューリングの実装

最終更新日:Nov 09, 2025

ハイブリッドクラウドシナリオでは、多階層エラスティックスケジューリングにより、オンプレミス環境とクラウド環境にまたがってデプロイされたビジネスが、ハイブリッドクラウドの利点をより活用できるようになります。これにより、ビジネスの高可用性を実現し、ピーク時とオフピーク時に基づいたエラスティックなリソースリクエストが可能になります。このトピックでは、ack-co-scheduler を使用して多階層エラスティックスケジューリングを実装する方法について説明します。

前提条件

  • 登録済みクラスターが作成され、外部 Kubernetes クラスターが登録済みクラスターに接続されていること。詳細については、「ACK コンソールで登録済みクラスターを作成する」をご参照ください。

  • 次の表に、必要なシステムコンポーネントのバージョンを示します。

    コンポーネント

    バージョン要件

    Kubernetes

    1.18.8 以降

    Helm

    3.0 以降

    Docker

    19.03.5

    オペレーティングシステム

    CentOS 7.6、CentOS 7.7、Ubuntu 16.04、Ubuntu 18.04、および Alibaba Cloud Linux

背景情報

ハイブリッドクラウドシナリオにおける多階層エラスティックスケジューリングは、IDC エラスティックリソースタイプを追加した、カスタムエラスティックリソース優先度スケジューリングの拡張機能です。カスタムエラスティックリソース優先度スケジューリングは、Alibaba Cloud が提供するエラスティックスケジューリングポリシーです。アプリケーションのデプロイメントまたはスケーリング中に、リソースポリシー (ResourcePolicy) をカスタマイズして、アプリケーションインスタンスの Pod が異なるタイプのノードリソースにスケジュールされる順序を設定できます。スケールイン中、Pod は元のスケジューリングシーケンスの逆の順序で削除されます。詳細については、「カスタムエラスティックリソース優先度スケジューリング」をご参照ください。

制限事項

  • この機能は pod-deletion-cost と競合するため、同時に使用することはできません。pod-deletion-cost の詳細については、「pod-deletion-cost」をご参照ください。

  • 現在、この機能は ECI エラスティックスケジューリングとの混合使用をサポートしていません。ECI エラスティックスケジューリングの詳細については、「ElasticResource を使用した ECI エラスティックスケジューリングの実装 (メンテナンス終了)」をご参照ください。

  • ResourcePolicy を変更すると、すでにスケジュールされている Pod は元の ResourcePolicy の順序に基づいてスケールインされ、新しく作成された Pod は更新された ResourcePolicy の順序に基づいてスケールインされます。

  • エラスティックノードプールと併用すると、この機能によりエラスティックノードプールからのノードのエビクションが効果的に行われなくなる可能性があります。この機能を使用する場合は、エラスティックノードプールを Unit に含め、エラスティックノードプールを含む Unit の max フィールドを設定しないでください。

  • 関連付けられた Pod が完全に削除されていない場合は、ResourcePolicy を変更しないでください。

使用方法

以下の内容を使用して、エラスティックリソースの優先度を定義する ResourcePolicy を作成します。

apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
  name: xxx
  namespace: xxx
spec:
  selector:
    key1: value1
  strategy: prefer
  units:
  - resource: idc
    max: 3
  - resource: ecs
    nodeSelector:
      key2: value2
  - resource: ecs
    nodeSelector:
      key3: value3
  - resource: eci
  • selector: ResourcePolicy が、同じ名前空間内で label key1=value1 を持つ Pod に適用されることを指定します。

  • strategy: スケジューリング戦略の選択。現在、prefer のみがサポートされています。

  • units: ユーザー定義のスケジューリングユニット。スケールアウト中、リソースは units で指定された順序で追加されます。スケールイン中、リソースは逆の順序で削除されます。

    • resource: エラスティックリソースのタイプ。現在、eciecs、および idc がサポートされています。

    • nodeSelector: node labels を使用して、スケジューリングユニット内のノードを識別します。これは ecs リソースにのみ適用されます。

    • max: このリソースグループにデプロイできるインスタンスの最大数。

関連コンポーネントのインストール

多階層エラスティックスケジューリングを使用するには、次のコンポーネントをインストールする必要があります。

  • ack-virtual-node: オプションコンポーネント。エラスティック ECI 機能を使用する場合にのみ、登録済みクラスターに ack-virtual-node コンポーネントをインストールする必要があります。

  • ack-co-scheduler: このコンポーネントを使用すると、カスタム ResourcePolicy CR オブジェクトを定義し、多階層エラスティックスケジューリング機能を使用できます。

    onectl でインストール

    1. オンプレミスのマシンに onectl をインストールします。詳細については、「onectl を使用して登録済みクラスターを管理する」をご参照ください。

    2. 次のコマンドを実行して、ack-virtual-node および ack-co-scheduler コンポーネントをインストールします。

      onectl addon install ack-virtual-node
      onectl addon install ack-co-scheduler

      期待される出力:

      Addon ack-virtual-node, version **** installed.
      Addon ack-co-scheduler, version **** installed.

    コンソール経由でインストール

    1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

    2. [クラスター] ページで、対象のクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネント] をクリックします。

    3. [コンポーネント] ページで、検索ボックスで ack-virtual-node および ack-co-scheduler コンポーネントを検索し、各コンポーネントカードの右下隅にある [インストール] をクリックします。

    4. 表示されるダイアログボックスで、[OK] をクリックします。

シナリオ 1: 多階層優先度スケジューリング

  1. 次の YAML 内容を使用して、ノードプールのスケジューリング順序をカスタマイズする ResourcePolicy を作成します。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: cost-balance-policy
    spec:
      selector:
        app: nginx
      strategy: prefer
      units:
      - resource: idc
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id=np7b30bxxxxxxa3940936c19ea42b  # 実際のノード ID に置き換えてください
      - resource: eci
  2. 次の YAML 内容を使用して、2 つの Pod をデプロイする Deployment を作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          annotations:
            addannotion: "true"
          labels:
            app: nginx      # これは、前のステップで作成した ResourcePolicy のセレクターと一致する必要があります。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              requests:
                cpu: 200m
              limits:
                cpu: 1
  3. 次のコマンドを実行して Nginx アプリケーションを作成します。

    kubectl apply -f nginx.yaml
  4. 次のコマンドを実行して Pod をスケールアウトします。

    kubectl scale deployment nginx --replicas 10

    期待される出力:

    deployment.apps/nginx scaled
  5. 次のコマンドを実行して Pod のステータスを確認します。

    kubectl get pod -o wide

    期待される出力:

    期待される出力を表示するには展開してください

    NAME                          READY   STATUS   RESTARTS        AGE    IP             NODE                           NOMINATED NODE   READINESS GATES
    nginx-load-85b845cffd-58bhb   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-7bv5h   1/1     Running   0              32s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-9bsz2   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-bh7bs   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-crqhv   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-crrnz   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-h8swv   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-hfdkv   1/1     Running   0              32s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-ttrhg   1/1     Running   0              32s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-vf8lg   1/1     Running   0              32s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>

    Nginx アプリケーションのレプリカ数を制御し、スケジューリング結果を確認すると、デプロイメント戦略が期待どおりであることがわかります。リソーススケジューリングの順序は、IDC リソース、次に ECS リソース、最後に ECI リソースの順に優先されます。

シナリオ 2: オンプレミス環境とクラウド環境にまたがるハイブリッドデプロイメント

  1. 次の YAML 内容を使用して、ノードプールのスケジューリング順序をカスタマイズする ResourcePolicy を作成します。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: load-balance-policy
    spec:
      selector:
        app: nginx
      strategy: prefer
      units:
      - resource: idc
        max: 2
      - resource: ecs
        nodeSelector:
          alibabacloud.com/nodepool-id=np7b30b52e99194275a3940936c19ea42b
        max: 4
      - resource: eci
  2. 次の YAML 内容を使用して、2 つの Pod をデプロイする Deployment を作成します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          annotations:
            addannotion: "true"
          labels:
            app: nginx    # これは、前のステップで作成した ResourcePolicy のセレクターと一致する必要があります。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              requests:
                cpu: 200m
              limits:
                cpu: 1                      
  3. 次のコマンドを実行して Nginx アプリケーションを作成します。

    kubectl apply -f nginx.yaml
  4. 次のコマンドを実行して Pod をスケールアウトします。

    kubectl scale deployment nginx --replicas 10

    期待される出力:

    deployment.apps/nginx scaled
  5. 次のコマンドを実行して Pod のステータスを確認します。

    kubectl get pod -o wide

    期待される出力:

    期待される出力を表示するには展開してください

    NAME                          READY   STATUS   RESTARTS        AGE    IP             NODE                           NOMINATED NODE   READINESS GATES
    nginx-load-85b845cffd-6r7lv   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-dk6nr   1/1     Running   0              33s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-lkgxk   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-r8ngs   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-rftlj   1/1     Running   0              33s   10.100.XX.XX    idc-oneline-hz-work****         <none>           <none>
    nginx-load-85b845cffd-rrht6   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-skrqm   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>
    nginx-load-85b845cffd-tnrqf   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-tv7rt   1/1     Running   0              33s   10.200.XX.XX    virtual-kubelet-cn-****         <none>           <none>
    nginx-load-85b845cffd-vprqr   1/1     Running   0              33s   10.200.XX.XX    cn-hangzhou.10.200.XX.XX        <none>           <none>

    Nginx アプリケーションのレプリカ数を制御し、スケジューリング結果を確認すると、デプロイメント戦略が期待どおりであることがわかります。リソースが十分な場合、2 つの Pod は IDC に、4 つの Pod は ECS に、残りのレプリカは ECI に配置されます。