自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您可以在应用发布或扩容过程中,自定义资源策略(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集群自定义弹性资源优先级调度功能说明,请参见自定义弹性资源优先级调度。
前提条件
- Kubernetes集群为ACK Pro且版本为1.26及以上。关于如何升级,请参见升级ACK集群K8s版本。 
- 对于不同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算力混合调度的具体操作步骤如下:
- 执行以下命令,对不同付费类型的节点分别打不同的 - 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。 
 
- 使用以下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
- 使用以下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
- 创建应用Nginx并查看部署结果。 - 执行以下命令,创建应用Nginx。 - kubectl apply -f nginx.yaml- 预期输出: - deployment.apps/nginx created
- 执行以下命令,查看部署结果。 - 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被调度到 - label为- paidtype=subscription的节点上,在本示例中为cn-beijing.10.0.3.137和cn-beijing.10.0.3.138。
 
- 对Pod进行扩容。 - 执行以下命令,将Pod扩容到4个。 - kubectl scale deployment nginx --replicas 4- 预期输出: - deployment.apps/nginx scaled
- 执行以下命令,查看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>- 由预期输出得到,当 - label为- paidtype=subscription的节点资源不足时,调度到- label为- paidtype=pay-as-you-go的节点上,在本示例中为cn-beijing.10.0.6.46和cn-beijing.10.0.6.47。
- 执行以下命令,将Pod扩容到6个。 - kubectl scale deployment nginx --replicas 6- 预期输出: - deployment.apps/nginx scaled
- 执行以下命令,查看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。 
 
- 对Pod进行缩容。 - 执行以下命令,将Pod从6个副本缩容到4个。 - kubectl scale deployment nginx --replicas 4- 预期输出: - deployment.apps/nginx scaled
- 执行以下命令,查看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。 
- 执行以下命令,将4个副本缩容到2个。 - kubectl scale deployment nginx --replicas 2- 预期输出: - deployment.apps/nginx scaled
- 执行以下命令,查看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>- 由预期输出得到,根据调度节点的逆序,优先缩容位于 - label为- paidtype=pay-as-you-go节点上的Pod。
- 等待一段时间,再次执行以下命令,查看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>- 由预期输出得到,当前只存在 - label为- paidtype=subscription节点上的Pod。
 
相关文档
- 在ACK集群中部署服务时,您可以使用容忍度和节点亲和性来声明只使用ECS或ACS算力资源,或者是在ECS资源不足时自动申请ACS算力资源。通过配置调度策略,您可以在不同工作负载场景下实现对弹性资源的不同需求。详细信息,请参见通过ACK托管集群Pro版使用ACS算力。 
- 高可用以及高性能是分布式任务执行过程中的重要要求。在ACK集群Pro版中,您可以通过Kubernetes原生调度语义实现分布式任务的跨可用区打散,以达到高可用区部署的要求,或者通过Kubernetes原生调度语义实现分布式任务在指定可用区中的亲和性部署,以达到高性能部署的要求。详细信息,请参见节点亲和性调度。