阿里云容器計算服務ACS支持在Pod標簽中聲明使用計算類型(Compute Class)和算力質量(Compute QoS)。由于不同類型實例的庫存是在動態變化的,可能會因為資源庫存等因素導致某種類型的實例無法創建。通過自定義資源優先級調度,您可以為Pod同時指定多種計算類型或算力質量,調度器將按先后順序依次嘗試創建對應類型的Pod實例,并通過Pod deletion cost機制控制應用的逆序縮容。本文介紹如何在ACS集群中使用自定義資源優先級調度。
前提條件
已安裝調度器組件kube-scheduler,且版本滿足以下要求。
ACS集群版本
調度器組件版本
1.30
v1.30.3-aliyun-1.1.1及以上(即當前所有版本)
1.28
v1.28.9-aliyun-1.1.0及以上
1.26
v1.26.3-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
注解,值會被自定義資源優先級調度策略覆蓋。關于Pod deletion cost的更多信息,請參見Pod deletion cost。
使用方式
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示例展示了自定義資源優先級調度的高級配置參數格式。
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。