ACS為作業調度情境提供了Gang Scheduling能力,滿足作業調度情境All-or-Nothing需求。本文介紹如何使用Gang Scheduling。
前提條件
已安裝調度器組件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及以上
Gang Scheduling僅支援高效能網路GPU型(gpu-hpn)計算類型。具體資訊,請參見計算類型定義。
未開啟GPU-HPN節點自訂標籤、調度器配置。具體資訊,請參見組件配置。
功能介紹
作業(Job)一般會建立多個Pod,並且這些Pod需要協調一致地啟動運行。這要求在調度時一定要按照一組Pod分配資源,保證這一組Pod都可以申請到資源,或者一旦有一個Pod拿不到資源就認為整組Pod調度失敗。這也就是調度器需要提供的All-or-Nothing調度語義,可以避免多個作業因為資源競爭出現資源維度死結現象。
ACS內建的調度器提供的Gang Scheduling能力實現了All-or-Nothing語義,保證作業順利運行。
Gang Scheduling對應的一組Pod必須屬於相同的compute-class。
使用方式
ACS提供的Gang Scheduling相容Kubernetes社區自訂資源PodGroup,對應版本podgroups.scheduling.sigs.k8s.io/v1alpha1。您在提交每一個作業前,需要先在作業所屬的命名空間下建立一個PodGroup執行個體,並在該PodGroup執行個體中聲明保證作業正常運行需要的最小Pod個數(minMember)。之後在建立作業的Pod時通過設定labels的形式配置Pod-group.scheduling.sigs.k8s.io關聯PodGroup執行個體名。ACS在調度時會統一為使用相同PodGroup標籤的執行個體Pod調度分配資源。
建立對應的PodGroup自訂資源。
apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: default spec: scheduleTimeoutSeconds: 10 minMember: 3 # 設定最小運行個數建立一個作業,並關聯PodGroup。
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: default spec: parallelism: 3 # Pod數量必須大於或者等於 pod group對象中的minMember template: metadata: labels: alibabacloud.com/compute-class: "gpu" # 指定compute class為gpu 或者 gpu-hpn alibabacloud.com/gpu-model-series: "example-model" # gpu計算類需要指定GPU型號 pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # 關聯 PodGroup 執行個體 demo-job-podgroup 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" nvidia.com/gpu: "1" limits: cpu: "1" memory: "1Gi" nvidia.com/gpu: "1" restartPolicy: Never backoffLimit: 4
請您確保關聯的Pod數量一定大於或等於PodGroup執行個體配置的minMember,否則無法成功調度。
操作樣本
本樣本依次示範作業在使用Gang Scheduling時調度失敗和調度成功的效果。
執行以下命令建立
test-gangNamespace。kubectl create ns test-gang執行以下命令,在
test-gang命名空間下建立ResourceQuota,示範資源不足情況下的Gang Scheduling效果。cat << EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: test-gang spec: hard: pods: "2" EOF執行以下命令,建立PodGroup對象,其中指定了
minMember為3,表示關聯的Pod中至少要有3個Pod同時調度成功,如果其中一個沒有建立或者沒有調度成功,其他Pod也應該處於 Pending 狀態。cat << EOF | kubectl apply -f - apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: test-gang spec: minMember: 3 # 設定最小運行個數 EOF使用以下YAML內容,建立gang-job.yaml檔案。該檔案描述了一個Job對象,其中指定了4個Pod副本,並關聯了PodGroup對象。
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: test-gang spec: parallelism: 4 # Pod數量必須大於或者等於 pod group對象中的minMember template: metadata: labels: alibabacloud.com/compute-class: "gpu" # 指定compute class為gpu 或者 gpu-hpn alibabacloud.com/gpu-model-series: "example-model" # gpu計算類需要指定GPU型號 pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # 關聯 PodGroup 執行個體 demo-job-podgroup 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" nvidia.com/gpu: "1" limits: cpu: "1" memory: "1Gi" nvidia.com/gpu: "1" restartPolicy: Never backoffLimit: 4執行以下命令,將gang-job部署到叢集。
kubectl apply -f gang-job.yaml執行以下命令,查看Pod狀態。
kubectl get pod -n test-gang預期輸出:
NAME READY STATUS RESTARTS AGE gang-job-hrnc6 0/1 Pending 0 23s gang-job-wthnq 0/1 Pending 0 23s由於ResourceQuota 限制只能運行 2 個Pod,因此該 Job 只有兩個Pod可以建立。這個數量小於PodGroup中指定的minMember,所以這2個Pod會處於Pending狀態不會被調度。
執行以下命令,刪除ResourceQuota,解除Pod數量的限制。
kubectl delete resourcequota -n test-gang object-counts執行以下命令,查看Pod狀態。
kubectl get pod -n test-gang預期輸出:
NAME READY STATUS RESTARTS AGE gang-job-24cz9 1/1 Running 0 96s gang-job-mmkxl 1/1 Running 0 96s gang-job-msr8v 1/1 Running 0 96s gang-job-qnclz 1/1 Running 0 96s可以發現Pod調度成功。