彈性負載會監聽原始負載,並根據彈性單元設定的調度策略,複製並產生彈性單元的負載。根據彈性負載中副本的變化,動態地分配原始負載和彈性單元上面的副本數目。本文介紹如何安裝以及使用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
在控制台左側導覽列,選擇。
在應用市場頁面單擊應用目錄頁簽,選中ack-kubernetes-elastic-workload應用。
在ack-kubernetes-elastic-workload頁面,單擊一鍵部署。
在建立面板中,選擇叢集和命名空間,然後單擊下一步。
在參數配置頁面,設定相應參數,然後單擊確定。
部署完成後,在叢集管理頁左側導覽列中,選擇,可以找到ack-kubernetes-elastic-workload的應用。
使用elastic-workload
假設:有一個應用經過容量規劃,預計最多有4個副本運行在ECS上,平時低峰時保留2個副本,超過4個副本時Auto Scaling到虛擬節點,防止幹擾其他正常容量規劃的應用。
在Kubernetes中,任何一種負載都要解決兩個問題,一個是調度問題,一個是生命週期管理問題。如果想要實現上述情境,需要解決以下問題:
當副本數目達到某個數值後,如何控制調度策略的變化。
在生命週期管理時,如何優先處理某些Pod。
針對上述情境和問題,下文為您介紹elastic-workload的使用方法。
建立一個簡單的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"使用彈性負載表達。
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。
查看部署結果。
查看目前狀態
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的優先處理。