全部產品
Search
文件中心

Container Service for Kubernetes:安裝Elastic Workload(停止維護)

更新時間:Jun 26, 2024

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

重要

Elastic Workload處於非活躍開發狀態,建議使用UnitedDeployment,請參見在ACK上使用UnitedDeployment

前提條件

  • 您已經成功建立一個Kubernetes叢集,請參見建立Kubernetes託管版叢集

  • 如果建立的是ACK叢集,您還需要部署ack-virtual-node(請使用v2.0.0.102-045a06eb4-aliyun及以上版本),請參見ACK使用ECI

使用限制

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

部署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

在Kubernetes中,任何一種負載都要解決兩個問題,一個是調度問題,一個是生命週期管理問題。要實現上面描述的情境,我們核心要解決以下兩個問題:

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

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

針對上面的問題介紹彈性負載的使用方式與解決方案。

使用模板建立一個簡單的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: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "500m"

使用彈性負載表達Deployment類型應用。

  # 彈性負載定義。
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"
  # min: 0 每個單元也可以指定自己的上下限。
  # max: 10

以上就是這個情境的彈性負載定義,彈性負載的使用方式與HPA類似,通過外部掛載的方式使用,對原有的業務無侵入。

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

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

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

在上面的例子中,SourceTarget的副本上下限位2~4,表示當ElasticWorkload的replicas為2~4個副本時,會分配到sourceTarget,當超過4個副本時,會分配到彈性單元virtual-kubelet,而在彈性單元virtual-kubelet中可以定義這個單元所專屬的調度策略,包含label、annotation、nodeSelector、affinity、toleration等。調度

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

執行彈性負載模板後,您可以通過命令列查看當前的狀態,其中status中的每個單元的Desired Replicas表示彈性負載的分配副本數目。

執行以下命令查看彈性負載狀態。

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

預期輸出:

Name:     elasticworkload-sample
Namespace:  default
Labels:    <none>
Annotations: <none>
API Version: autoscaling.alibabacloud.com/v1beta1
Kind:     ElasticWorkload
Metadata:
 Creation Timestamp: 2021-04-30T06:58:03Z
 Generation:     2
 Resource Version: 1126368056
 Self Link:     /apis/autoscaling.alibabacloud.com/v1beta1/namespaces/default/elasticworkloads/elasticworkload-sample
 UID:        a465de9e-1253-4cbe-8cd5-98393393e990
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-04-30T06:58:03Z
 Replicas:      6
 Selector:      app=nginx
 Source Target:
  API Version:    apps/v1
  Desired Replicas: 4
  Kind:       Deployment
  Name:       nginx-deployment-basic
  Update Timestamp: 2021-04-30T06:58:03Z
Events:
 Type  Reason         Age         From       Message
 ----  ------         ----         ----       -------
 Normal UnitCreation      110s         ElasticWorkload ElasticWorkloadUnit nginx-deployment-basic-unit-virtual-kubelet created
 Normal ElasticWorkloadUpdate 110s (x2 over 110s) ElasticWorkload ElasticWorkload update
 Normal UnitUpdate       110s         ElasticWorkload ElasticWorkloadUnit virtual-kubelet has been updated

當下發彈性負載的模板後,可以查看Pod的情況。可以發現彈性負載複製出了新的Deployment與Pod,並且Deployment的Pod副本數目是根據上述的規則進行動態分配的。

執行以下命令查看Pod詳情。

kubectl get pod -o wide

預期輸出:

NAME                              READY  STATUS  RESTARTS  AGE  IP       NODE              NOMINATED NODE  READINESS GATES
nginx-deployment-basic-769f84b5cf-hdmlw            1/1   Running  0     46m  172.26.240.69  cn-hangzhou.10.1.84.111     <none>      <none>
nginx-deployment-basic-769f84b5cf-lmd99            1/1   Running  0     46m  172.26.240.6  cn-hangzhou.10.1.84.112     <none>      <none>
nginx-deployment-basic-769f84b5cf-nbp5c            1/1   Running  0     30m  172.26.240.75  cn-hangzhou.10.1.84.111     <none>      <none>
nginx-deployment-basic-769f84b5cf-scj68            1/1   Running  0     30m  172.26.240.11  cn-hangzhou.10.1.84.112     <none>      <none>
nginx-deployment-basic-unit-virtual-kubelet-594f86b5c9-8z876  1/1   Running  0     10m  10.1.84.119   virtual-kubelet-cn-hangzhou-i  <none>      <none>
nginx-deployment-basic-unit-virtual-kubelet-594f86b5c9-drxvq  1/1   Running  0     10m  10.1.84.118   virtual-kubelet-cn-hangzhou-i  <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的優先處理。