全部產品
Search
文件中心

Container Service for Kubernetes:通過Elastic Workload將彈性負載的Pod調度到ECI(停止維護)

更新時間:Mar 14, 2025

彈性負載會監聽原始負載,並根據彈性單元設定的調度策略,複製並產生彈性單元的負載。根據彈性負載中副本的變化,動態地分配原始負載和彈性單元上面的副本數目。本文介紹如何安裝以及使用Elastic Workload(彈性負載)。

重要

目前仍可以使用Elastic Workload。但自2024年06月起,Elastic Workload處於非活躍開發狀態,建議使用UnitdDeployment進行替換。

更多關於虛擬節點調度方案的介紹、對比和選型建議,請參見調度Pod至虛擬節點

前提條件

叢集中已部署ack-virtual-node組件,且版本為v2.0.0.102-045a06eb4-aliyun及以上版本。更多資訊,請參見通過虛擬節點將Pod調度到ECI上運行

使用限制

Elastic Workload不支援OpenKruise的Workload,建議您使用UnitdDeployment

部署ack-kubernetes-elastic-workload

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,選擇市場 > 應用市場

  3. 應用市場頁面單擊應用目錄頁簽,選中ack-kubernetes-elastic-workload應用。

  4. ack-kubernetes-elastic-workload頁面,單擊一鍵部署

  5. 建立面板中,選擇叢集和命名空間,然後單擊下一步

  6. 參數配置頁面,設定相應參數,然後單擊確定

    部署完成後,在叢集管理頁左側導覽列中,選擇應用 > Helm,可以找到ack-kubernetes-elastic-workload的應用。

使用elastic-workload

假設:有一個應用經過容量規劃,預計最多有4個副本運行在ECS上,平時低峰時保留2個副本,超過4個副本時Auto Scaling到虛擬節點,防止幹擾其他正常容量規劃的應用。

在Kubernetes中,任何一種負載都要解決兩個問題,一個是調度問題,一個是生命週期管理問題。如果想要實現上述情境,需要解決以下問題:

  • 當副本數目達到某個數值後,如何控制調度策略的變化。

  • 在生命週期管理時,如何優先處理某些Pod。

針對上述情境和問題,下文為您介紹elastic-workload的使用方法。

  1. 建立一個簡單的Deployment。

    apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
        #  nodeSelector:
        #    env: test-team
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            resources:
              limits:
                cpu: "500m"
  2. 使用彈性負載表達。

    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: ElasticWorkload
    metadata:
      name: elasticworkload-sample
    spec:
      sourceTarget:
        name: nginx-deployment-basic
        kind: Deployment
        apiVersion: apps/v1
        min: 2        #最小副本數
        max: 4        #最大副本數
      replicas: 6
      elasticUnit:
      - name: virtual-kubelet
        labels:
          alibabacloud.com/eci: "true"

    彈性負載的使用方式就像HPA,它通過外部掛載的方式使用,並不影響原有業務。

    調度

    彈性負載會監聽原始負載,並根據彈性單元設定的調度策略,複製並產生彈性單元的負載。根據彈性負載中副本的變化,動態地分配原始負載和彈性單元上的副本數目。

    一個典型的彈性負載主要包括兩個部分:

    • sourceTarget部分主要定義原始負載的類型、副本數目可變化的範圍。

    • elasticUnit部分是一個數組,定義彈性單元的調度策略,如果有多個彈性單元,則按照模板的順序定義。

    在上述樣本中:

    • sourceTarget中定義了副本數目的上下限為2~4個,表示ElasticWorkload的replicas為2~4個副本時,會調度到sourceTarget,當超過4個副本時,會調度到彈性單元,即虛擬節點virtual-kubelet。

    • elasticUnit中定義了彈性單元為虛擬節點virtual-kubelet,對應的調度策略為labels:alibabacloud.com/eci=true

  3. 查看部署結果。

    • 查看目前狀態

      kubectl describe ew elasticworkload-sample   # same as kubectl get elasticworkload

      返回樣本如下,其中Status中的每個單元的Desired Replicas表示彈性負載的分配副本數目。

      Name:         elasticworkload-sample
      Namespace:    default
      Labels:       <none>
      Annotations:  <none>
      API Version:  autoscaling.alibabacloud.com/v1beta1
      Kind:         ElasticWorkload
      Metadata:
        Creation Timestamp:  2021-05-21T01:53:58Z
        Generation:          4
        Managed Fields:
          API Version:  autoscaling.alibabacloud.com/v1beta1
          Fields Type:  FieldsV1
          fieldsV1:
            f:spec:
              .:
              f:elasticUnit:
              f:replicas:
              f:sourceTarget:
                .:
                f:apiVersion:
                f:kind:
                f:max:
                f:min:
                f:name:
          Manager:      Apache-HttpClient
          Operation:    Update
          Time:         2021-05-21T01:53:58Z
          API Version:  autoscaling.alibabacloud.com/v1beta1
          Fields Type:  FieldsV1
          fieldsV1:
            f:status:
              .:
              f:elasticUnitsStatus:
              f:replicas:
              f:selector:
              f:sourceTarget:
                .:
                f:apiVersion:
                f:desiredReplicas:
                f:kind:
                f:name:
                f:updateTimestamp:
          Manager:         manager
          Operation:       Update
          Time:            2021-05-21T01:56:45Z
        Resource Version:  8727
        Self Link:         /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/elasticworkloads/elasticworkload-sample
        UID:               c4a508aa-2702-4d17-ac25-e6a207c0761a
      Spec:
        Elastic Unit:
          Labels:
            alibabacloud.com/eci:  true
          Name:                    virtual-kubelet
        Replicas:                  6
        Source Target:
          API Version:  apps/v1
          Kind:         Deployment
          Max:          4
          Min:          2
          Name:         nginx-deployment-basic
      Status:
        Elastic Units Status:
          Desired Replicas:  2
          Name:              nginx-deployment-basic-unit-virtual-kubelet
          Update Timestamp:  2021-05-21T01:56:45Z
        Replicas:            6
        Selector:            app=nginx
        Source Target:
          API Version:       apps/v1
          Desired Replicas:  4
          Kind:              Deployment
          Name:              nginx-deployment-basic
          Update Timestamp:  2021-05-21T01:56:45Z
      Events:
        Type    Reason                 Age                  From             Message
        ----    ------                 ----                 ----             -------
        Normal  SourceUpdate           12m                  ElasticWorkload  Source Target scale from 2 to 4
        Normal  UnitCreation           12m                  ElasticWorkload  ElasticWorkloadUnit nginx-deployment-basic-unit-virtual-kubelet created
        Normal  ElasticWorkloadUpdate  9m27s (x9 over 12m)  ElasticWorkload  ElasticWorkload update
        Normal  UnitUpdate             9m27s (x8 over 12m)  ElasticWorkload  ElasticWorkloadUnit virtual-kubelet has been updated
    • 查看Pod情況

      kubectl get pod -o wide

      返回樣本如下,彈性負載已經複製出新的Deployment與Pod,且Deployment的Pod副本數目是根據設定的調度策略進行動態分配。

      NAME                                                           READY   STATUS    RESTARTS   AGE   IP              NODE                           NOMINATED NODE   READINESS GATES
      nginx-deployment-basic-5bf87f5f59-22jnw                        1/1     Running   0          16m   10.34.0.131     cn-beijing.172.16.0.1          <none>           <none>
      nginx-deployment-basic-5bf87f5f59-gfp24                        1/1     Running   0          13m   10.34.0.133     cn-beijing.172.16.0.1          <none>           <none>
      nginx-deployment-basic-5bf87f5f59-pw2zx                        1/1     Running   0          13m   10.34.0.134     cn-beijing.172.16.0.1          <none>           <none>
      nginx-deployment-basic-5bf87f5f59-qvh7m                        1/1     Running   0          16m   10.34.0.132     cn-beijing.172.16.0.1          <none>           <none>
      nginx-deployment-basic-unit-virtual-kubelet-65fb6f4cd7-48ssb   1/1     Running   0          13m   172.16.22.157   virtual-kubelet-cn-beijing-e   <none>           <none>
      nginx-deployment-basic-unit-virtual-kubelet-65fb6f4cd7-gjqhm   1/1     Running   0          13m   172.16.22.158   virtual-kubelet-cn-beijing-e   <none>           <none>

此外,彈性負載支援與HPA配合使用,可以將HPA作用在彈性負載上。彈性負載會根據HPA的狀態動態調整每個單元的副本分布,例如:如果當前是從6個副本縮容到4個副本,會優先將彈性單元的副本進行縮容。樣本如下:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: elastic-workload-demo
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: autoscaling.alibabacloud.com/v1beta1
    kind: ElasticWorkload
    name: elasticworkload-sample
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

總的來說,彈性負載一方面通過複製和覆寫調度策略的方式產生多個Deployment,實現了調度策略的管理,另一方面通過上層的副本計算,調整原始負載和彈性單元的副本分配,實現了針對一部分Pod的優先處理。