自訂彈性資源優先順序調度是阿里雲提供的彈性調度策略。您可以在應用發布或擴容過程中,自訂資源策略(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原生調度語義實現分布式任務在指定可用性區域中的親和性部署,以達到高效能部署的要求。詳細資料,請參見節點親和性調度。