全部產品
Search
文件中心

Container Compute Service:ACK Pro叢集支援ECS和ACS算力混合調度

更新時間:Jan 16, 2025

自訂彈性資源優先順序調度是阿里雲提供的彈性調度策略。您可以在應用發布或擴容過程中,自訂資源策略(ResourcePolicy),設定應用執行個體Pod被調度到ACS,實現ECS和ACS Pod的混合部署。

重要

自調度器版本v1.x.x-aliyun-6.4開始,自訂彈性資源優先順序功能的ignorePreviousPod欄位的預設值將修改為False,ignoreTerminatingPod欄位的預設值將修改為True。涉及這些欄位的存量ResourcePolicy不受影響,後續更新也不受影響。

使用限制

  • 本功能在縮容情境,與pod-deletion-cost同時使用,將無法保證一定按照逆序縮容。

  • max欄位僅支援在叢集版本為1.26及以上,且調度器版本為6.7及以上的版本中開啟。

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

使用方式

關於ACK Pro叢集自訂彈性資源優先順序調度功能說明,請參見自訂彈性資源優先順序調度

前提條件

  • 對於不同ACK版本的叢集,調度器、虛擬節點版本需要滿足以下要求。

    ACK版本

    調度器版本

    虛擬節點版本

    1.26及以上

    v1.26.3-aliyun-6.7.0及以上

    v2.13.0及以上

  • 關於調度器各版本支援的功能,請參見kube-scheduler

  • 關於ACK Pro叢集啟用ACS算力,具體操作,請參見通過ACK託管叢集Pro版使用ACS算力

ECS和ACS算力混合調度

當您需要部署一個Deployment,此時叢集中有3種類型的資源,分別是訂用帳戶的ECS、隨用隨付的ECS、ACS Pod。為了降低資源使用成本,您希望部署的服務優先調度順序依次為:訂用帳戶的ECS、隨用隨付的ECS、ACS Pod。同時在服務縮容時優先刪除ACS Pod,然後刪除隨用隨付的ECS上的Pod,最後刪除訂用帳戶的ECS上的Pod。樣本節點為2核4 GB,ECS和ACS算力混合調度的具體操作步驟如下:

  1. 執行以下命令,對不同付費類型的節點分別打不同的label(此處也可以通過節點池的功能自動標識label)。

    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

    節點label說明

    • paidtype=subscription:訂用帳戶ECS。

    • paidtype=pay-as-you-go:隨用隨付ECS。

  2. 使用以下YAML內容,建立ResourcePolicy自訂節點池調度順序。

    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: nginx
      namespace: default
    spec:
      selector:
        app: nginx               # 此處要與後續建立的Pod的label相關聯。
      strategy: prefer
      units:
      - resource: ecs
        nodeSelector:
          paidtype: subscription
      - resource: ecs
        nodeSelector:
          paidtype: pay-as-you-go
      - resource: acs 
  3. 使用以下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
          labels:
            app: nginx                                           # 此處與上一步建立的ResourcePolicy的selector相關聯。
            alibabacloud.com/compute-class: general-purpose      # 配置ACS Pod的算力類型,未配置預設general-purpose
            alibabacloud.com/compute-qos: default                # 配置ACS Pod的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>

      由預期輸出得到,前兩個Pod被調度到labelpaidtype=subscription的節點上,在本樣本中為cn-beijing.10.0.3.137和cn-beijing.10.0.3.138。

  5. 對Pod進行擴容。

    1. 執行以下命令,將Pod擴容到4個。

      kubectl scale deployment nginx --replicas 4

      預期輸出:

      deployment.apps/nginx scaled
    2. 執行以下命令,查看Pod狀態。

      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>

      由預期輸出得到,當labelpaidtype=subscription的節點資源不足時,調度到labelpaidtype=pay-as-you-go的節點上,在本樣本中為cn-beijing.10.0.6.46和cn-beijing.10.0.6.47。

    3. 執行以下命令,將Pod擴容到6個。

      kubectl scale deployment nginx --replicas 6

      預期輸出:

      deployment.apps/nginx scaled
    4. 執行以下命令,查看Pod狀態。

      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上的資源不足,Pod被調度到ACS的資源上,在本樣本中為virtual-kubelet-cn-beijing-j。

  6. 對Pod進行縮容。

    1. 執行以下命令,將Pod從6個副本縮容到4個。

      kubectl scale deployment nginx --replicas 4

      預期輸出:

      deployment.apps/nginx scaled
    2. 執行以下命令,查看Pod狀態。

      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上的Pod。

    3. 執行以下命令,將4個副本縮容到2個。

      kubectl scale deployment nginx --replicas 2

      預期輸出:

      deployment.apps/nginx scaled
    4. 執行以下命令,查看Pod狀態。

      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>

      由預期輸出得到,根據調度節點的逆序,優先縮容位於labelpaidtype=pay-as-you-go節點上的Pod。

    5. 等待一段時間,再次執行以下命令,查看Pod狀態。

      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>

      由預期輸出得到,當前只存在labelpaidtype=subscription節點上的Pod。

相關文檔

  • 在ACK叢集中部署服務時,您可以使用容忍度和節點親和性來聲明只使用ECS或ACS算力資源,或者是在ECS資源不足時自動申請ACS算力資源。通過配置調度策略,您可以在不同工作負載情境下實現對彈性資源的不同需求。詳細資料,請參見通過ACK託管叢集Pro版使用ACS算力

  • 高可用以及高效能是分布式任務執行過程中的重要要求。在ACK叢集Pro版中,您可以通過Kubernetes原生調度語義實現分布式任務的跨可用性區域打散,以達到高可用性區域部署的要求,或者通過Kubernetes原生調度語義實現分布式任務在指定可用性區域中的親和性部署,以達到高效能部署的要求。詳細資料,請參見節點親和性調度