O Alibaba Cloud Container Compute Service (ACS) oferece o recurso de Gang Scheduling para jobs que exigem agendamento do tipo tudo ou nada.
Pré-requisitos
-
kube-scheduler instalado em uma versão que atenda aos seguintes requisitos:
Versão do cluster ACS
Versão mínima do scheduler
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
O Gang Scheduling suporta apenas a classe de computação GPU-HPN. Para mais informações, consulte Compute types.
A configuração Enable custom labels and schedulers for GPU-HPN nodes deve estar desativada. Para mais informações, consulte component configuration.
Como funciona
Um job geralmente cria vários pods que precisam iniciar e executar de forma coordenada. Isso exige que o scheduler aloque recursos para um grupo de pods como uma única unidade. Assim, todos os pods do grupo obtêm recursos ou o agendamento de todo o grupo falha caso um único pod não possa ser posicionado. Esse agendamento do tipo tudo ou nada evita deadlocks de recursos causados pela competição entre múltiplos jobs.
O scheduler integrado do ACS utiliza o Gang Scheduling para implementar essa semântica de tudo ou nada e garantir a execução adequada dos seus jobs.
Todos os pods em um grupo de Gang Scheduling devem pertencer à mesma compute-class.
Procedimento
O Gang Scheduling do ACS é compatível com o recurso personalizado da comunidade Kubernetes PodGroup, versão podgroups.scheduling.sigs.k8s.io/v1alpha1. Antes de enviar um job, crie um objeto PodGroup no namespace do job. Na definição do PodGroup, especifique o número mínimo de pods necessários definindo o campo minMember. Em seguida, ao criar os pods do job, associe-os ao PodGroup adicionando o rótulo pod-group.scheduling.sigs.k8s.io e definindo seu valor como o nome do PodGroup. O scheduler do ACS então aloca recursos para todos os pods com o mesmo rótulo de PodGroup como uma única unidade.
-
Crie o recurso personalizado PodGroup.
apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: default spec: scheduleTimeoutSeconds: 10 minMember: 3 # Specify the minimum number of pods required to run. -
Crie um job e associe-o ao PodGroup.
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: default spec: parallelism: 3 # The number of pods must be greater than or equal to minMember in the PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Specify the compute-class as gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Specify the GPU model for the GPU compute class. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Associate with the demo-job-podgroup 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
Garanta que o parallelism do job seja maior ou igual ao valor de minMember no PodGroup. Caso contrário, o job não será agendado.
Exemplo
Este exemplo demonstra cenários de falha e de sucesso no agendamento ao usar o Gang Scheduling.
-
Execute o comando a seguir para criar o namespace
test-gang.kubectl create ns test-gang -
Execute o comando abaixo para criar um ResourceQuota no namespace
test-gang. Essa ação simula um cenário com recursos insuficientes para demonstrar o funcionamento do Gang Scheduling.cat << EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: test-gang spec: hard: pods: "2" EOF -
Execute o seguinte comando para criar um objeto PodGroup. O campo
minMemberestá definido como 3, o que significa que pelo menos três pods do grupo devem ser agendados simultaneamente. Se essa condição não for atendida, os demais pods permanecerão no status 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 # Specify the minimum number of pods required to run. EOF -
Crie um arquivo chamado gang-job.yaml com o conteúdo a seguir. Esse arquivo define um objeto de job com quatro réplicas de pod e o associa ao objeto PodGroup.
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: test-gang spec: parallelism: 4 # The number of pods must be greater than or equal to minMember in the PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Specify the compute-class as gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Specify the GPU model for the GPU compute class. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Associate with the demo-job-podgroup 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 -
Implante o gang-job no cluster executando o comando a seguir.
kubectl apply -f gang-job.yaml -
Verifique o status dos pods com o comando abaixo.
kubectl get pod -n test-gangSaída esperada:
NAME READY STATUS RESTARTS AGE gang-job-hrnc6 0/1 Pending 0 23s gang-job-wthnq 0/1 Pending 0 23sO ResourceQuota limita o namespace a no máximo dois pods, quantidade inferior ao valor de
minMemberespecificado no PodGroup. Como resultado, esses dois pods permanecem no status Pending e não são agendados. -
Remova o limite de pods excluindo o ResourceQuota com o comando a seguir.
kubectl delete resourcequota -n test-gang object-counts -
Consulte novamente o status dos pods executando o comando abaixo.
kubectl get pod -n test-gangSaída esperada:
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 96sA saída mostra que os pods foram agendados com sucesso.