阿里雲容器計算服務ACS支援在Pod標籤中聲明使用計算類型(compute-class)和算力品質(compute-qos)。由於不同類型執行個體的庫存是在動態變化的,可能會因為資產庫存等因素導致某種類型的執行個體無法建立。通過自訂資源優先順序調度,您可以為Pod同時指定多種計算類型或算力品質,調度器將按先後順序依次嘗試建立對應類型的Pod執行個體,並通過Pod deletion cost機制控制應用的逆序縮容。本文介紹如何在ACS叢集中使用自訂資源優先順序調度。
前提條件
已安裝調度器組件kube-scheduler,且版本滿足以下要求。
ACS叢集版本
調度器組件版本
1.31
v1.31.0-aliyun-1.2.0及以上
1.30
v1.30.3-aliyun-1.1.1及以上
1.28
v1.28.9-aliyun-1.1.0及以上
已安裝acs-virtual-node組件,版本為v2.12.0-acs.4或以上。
注意事項
自訂資源優先順序調度支援的計算類型,請參見計算類型定義。
ACS自訂資源優先順序調度基於Kubernetes社區提供的Pod deletion cost功能控制Pod執行個體縮容順序。Pod deletion cost代表了刪除開銷,通常值越小表示會被優先縮容,事實上縮容演算法會考慮多種因素,這取決於應用控制器的具體實現。需要注意的是,若您在建立Pod時已經填寫了
controller.kubernetes.io/pod-deletion-cost註解,它的值會被ACS自訂資源優先順序調度策略覆蓋。
請勿在工作負載的標籤選取器(如Deployment的spec.selector.matchLabels)中使用系統保留標籤(如alibabacloud.com/compute-class、alibabacloud.com/compute-qos)。這些標籤可能在自訂優先順序調度期間被系統修改,導致控制器頻繁重建Pod,影響應用穩定性。
使用方式
ACS叢集以虛擬節點的形式提供資源。Pod的資源屬性主要包括可用性區域、計算類型和算力品質。為此,ACS定義了ResourcePolicy調度策略,支援在配置中通過spec.selector標記一類Pod,並同時配置多種資源屬性。調度器將在資產庫存不足時,按照配置順序建立其他類型的執行個體。ResourcePolicy調度策略使用方式如下。
建立ResourcePolicy調度策略。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: rp-demo namespace: default spec: selector: # 在selector中標記Pod,表示帶有app=stress標籤的Pod將遵循此調度策略 app: stress units: # 在units中定義調度順序 - resource: acs # 優先申請best-effort類型的資源 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs # 前者庫存不足時,申請default類型的資源 podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: default建立一個任意類型的工作負載(例如Job),其中
labels配置與ResourcePolicy的選取器保持一致。apiVersion: batch/v1 kind: Job metadata: name: demo-job namespace: default spec: parallelism: 3 template: metadata: labels: app: stress # 關聯ResourcePolicy中spec.selector定義的配置 spec: containers: - name: demo-job image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4 args: - 'infinity' command: - sleep resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi" restartPolicy: Never backoffLimit: 4
進階配置參數
以下ResourcePolicy的詳細YAML樣本展示了自訂資源優先順序調度的進階配置參數格式。
以下僅展示了在ACS叢集中使用ResourcePolicy的常用配置,關於ResourcePolicy功能的完整配置,請參見自訂彈性資源優先順序調度。
apiVersion: scheduling.alibabacloud.com/v1alpha1
kind: ResourcePolicy
metadata:
name: rp-demo
namespace: default
spec:
# 以下為應用配置,用於標記一部分pod,符合該條件的Pod將遵循此調度策略
selector:
app: stress
# 以上為應用配置
# 以下為資源配置,用於描述調度順序
units:
- resource: acs # resource類型必須指定為acs
podLabels: # 優先申請"general-purpose"+"best-effort"類型的資源
alibabacloud.com/compute-class: general-purpose
alibabacloud.com/compute-qos: best-effort
nodeSelector: # 支援通過nodeSelector指定虛擬節點的可用性區域
topology.kubernetes.io/zone: cn-hangzhou-i
- resource: acs # 前者庫存不足時,再申請"general-purpose"+"default"類型的資源
podLabels:
alibabacloud.com/compute-class: general-purpose
alibabacloud.com/compute-qos: default
# 以上為資源配置
# 其他欄位適用於非ACS叢集,ResourcePolicy建立後會有預設值,無需關注應用配置
應用配置由一組標籤組成,只有帶有該標籤的Pod會遵循此策略,您可以根據應用類型配置不同的資源順序。
配置項 | 類型 | 說明 | 樣本 |
selector | map[string]string | 同時帶有這些標籤的Pod將按本ResourcePolicy規則調度。 | |
資源配置
資源配置由一個列表組成,列表中的每個單元描述了詳細的資源屬性,對於符合應用配置條件的Pod,調度器將按每個單元的屬性依次嘗試建立,當庫存不足時自動嘗試下一個單元。當所有單元的庫存都不足時,Pod會處於Pending狀態,調度器會持續按順序重試,直至建立成功。下表中描述了每個單元中配置欄位的詳細含義。
配置項 | 類型 | 說明 | 取值 | 樣本 |
resource | string | 資源類型,必填。僅支援acs。 | acs |
|
nodeSelector | map[string]string | 通過label標記篩選虛擬節點,例如可用性區域範圍。 | 支援的標籤範圍詳見節點親和性調度。 | |
podLabels[alibabacloud.com/compute-class] | string | 描述Pod申請的計算類型(Compute Class)。 |
|
|
podLabels[alibabacloud.com/compute-qos] | string | 描述Pod申請的算力品質(Compute QoS)。 |
|
|
操作樣本
本樣本示範通過ResourcePolicy為應用依次申請default和best-effort算力品質的資源。
使用以下內容建立resource-policy.yaml。聲明了對於
app=stress標籤的Pod,申請計算類型為performance、算力品質為default的資源。apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: stress-demo namespace: default spec: selector: app: stress units: - resource: acs podLabels: alibabacloud.com/compute-class: performance alibabacloud.com/compute-qos: default執行以下命令,將ResourcePolicy部署到叢集。
kubectl apply -f resource-policy.yaml使用以下內容建立stress-dep.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: stress spec: replicas: 1 selector: matchLabels: app: stress template: metadata: labels: # 與ResourcePolicy中的配置保持一致 app: stress spec: containers: - name: stress image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4 command: - "sleep" - "infinity" resources: limits: cpu: '1' memory: 1Gi requests: cpu: '1' memory: 1Gi執行以下命令,將stress應用部署到叢集。
kubectl apply -f stress-dep.yaml執行以下命令,查看Pod狀態。
kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos預期輸出:
# 輸出結果受資產庫存等因素影響,請以實際為準 NAME READY STATUS RESTARTS AGE COMPUTE-CLASS COMPUTE-QOS stress-xxxxxxxx1 1/1 Running 0 53s performance default使用以下內容,更新上述resource-policy.yaml檔案。增加了資源屬性描述,要求按以下順序申請資源:
先申請計算類型為general-purpose、算力品質為best-effort的資源。
上述資產庫存不足時,再申請計算類型為performance、算力品質為default的資源。
apiVersion: scheduling.alibabacloud.com/v1alpha1 kind: ResourcePolicy metadata: name: stress-demo namespace: default spec: selector: app: stress units: - resource: acs podLabels: alibabacloud.com/compute-class: general-purpose alibabacloud.com/compute-qos: best-effort - resource: acs podLabels: alibabacloud.com/compute-class: performance alibabacloud.com/compute-qos: default執行以下命令,更新叢集內的ResourcePolicy策略。更新後的策略將對後續新建立的Pod生效。
kubectl apply -f resource-policy.yaml執行以下命令,將步驟3建立的stress應用,擴容為2個副本。
kubectl scale deployment stress --replicas=2執行以下命令,查看Pod狀態。
kubectl get pod -L alibabacloud.com/compute-class,alibabacloud.com/compute-qos預期輸出:
# 輸出結果受資產庫存等因素影響,請以實際為準 NAME READY STATUS RESTARTS AGE COMPUTE-CLASS COMPUTE-QOS stress-xxxxxxxx1 1/1 Running 0 2m14s performance default stress-xxxxxxxx2 1/1 Running 0 33s general-purpose best-effort可以看到新擴容的副本,計算類型和算力品質分別為general-purpose和best-effort。