弹性负载会监听原始负载,并根据弹性单元设定的调度策略,克隆并生成弹性单元的负载。根据弹性负载中副本的变化,动态地分配原始负载和弹性单元上面的副本数目。本文介绍如何安装以及使用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个副本时弹性伸缩到虚拟节点,防止干扰其他正常容量规划的应用。
在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的优先处理。