全部產品
Search
文件中心

Container Service for Kubernetes:通過ack-co-scheduler實現多級彈性調度

更新時間:Jul 23, 2025

在混合雲情境下,通過多級彈性調度,可以使您線上線下混合部署的業務能更好的發揮混合雲的優勢,實現業務高可用,並能根據波峰波穀進行彈性資源申請等。本文介紹如何通過ack-co-scheduler進行多級彈性調度。

前提條件

  • 已建立註冊叢集,並將自建Kubernetes叢集接入註冊叢集。具體操作,請參見建立ACK One註冊叢集

  • 系統組件版本要求具體如下表所示。

    組件

    版本要求

    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彈性資源類型。自訂彈性資源優先順序調度是阿里雲提供的彈性調度策略。您可以在應用發布或擴容過程中,自訂資源策略(ResourcePolicy),設定應用執行個體Pod被調度到不同類型節點資源的順序。同時在縮容過程中按照原調度順序逆序縮容。更多資訊,請參見自訂彈性資源優先順序調度

使用限制

  • 本功能與pod-deletion-cost衝突,不能同時使用。關於pod-deletion-cost的更多資訊,請參見pod-deletion-cost

  • 本功能暫不支援與使用ECI彈性調度混合使用。關於ECI彈性調度的更多資訊,請參見通過ElasticResource實現ECI彈性調度(停止維護)

  • 修改ResourcePolicy的策略時,已調度的Pod將按照原ResourcePolicy的順序進行縮容,建立的Pod將按照更新後ResourcePolicy的順序進行縮容。

  • 與彈性節點池同時使用時,可能導致彈性節點池無效彈出節點。使用時請將彈性節點池包含在某個Unit中,且彈性節點池的Unit不要設定max欄位。

  • 與ResourcePolicy關聯的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:彈性資源的類型,目前支援eciecsidc三種類型。

    • nodeSelector:用nodelabel標識該調度單元下的節點,只對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. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

    3. 組件管理頁面的搜尋方塊中分別搜尋ack-virtual-node和ack-co-scheduler組件,並在對應組件卡片的右下方單擊安裝

    4. 在提示對話方塊中單擊確定

情境一:多級優先順序調度

  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  # 請替換為實際的Node id
      - resource: eci
  2. 使用以下YAML內容,建立Deployment,部署2個Pod。

    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的selector相關聯。
        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資源。

情境二:線上線下混合部署

  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內容,建立Deployment,部署2個Pod。

    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的selector相關聯。
        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的副本數目查看調度結果,可以看到其部署策略符合預期:在資源足夠情況下,IDC有2個Pod,ECS有4個Pod,其他副本在ECI上。