自定义弹性资源优先级调度是阿里云提供的弹性调度策略。您可以在应用发布或扩容过程中,自定义资源策略(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-beta.2及以上
关于调度器各版本支持的功能,请参见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原生调度语义实现分布式任务在指定可用区中的亲和性部署,以达到高性能部署的要求。详细信息,请参见节点亲和性调度。