Agendamento baseado em prioridade e preempção
Uma prioridade de pod indica a importância de um pod em relação a outros pods. Volcano suporta PriorityClasses de pod no Kubernetes. Depois que as PriorityClasses são configuradas, o agendador programa preferencialmente pods de alta prioridade. Quando os recursos de cluster são insuficientes, o agendador desalojará proativamente pods de baixa prioridade para possibilitar o agendamento de pods de alta prioridade pendentes.
Pré-requisitos
- Um cluster de v1.19 ou posterior está disponível. Para mais detalhes, consulte Compra de um cluster do CCE.
- O complemento Volcano foi instalado. Para mais detalhes, consulte Volcano scheduler.
Visão geral
Os serviços executados em um cluster são diversificados, incluindo serviços essenciais, serviços não essenciais, serviços on-line e serviços off-line. Você pode configurar prioridades para diferentes serviços com base na importância do serviço e nos requisitos de SLA. Por exemplo, configure uma alta prioridade para serviços principais e serviços online para que esses serviços obtenham preferencialmente recursos de cluster. Quando os recursos do cluster são ocupados por serviços não essenciais e os recursos restantes são insuficientes para novos serviços principais, o agendador antecipa ou despeja pods de baixa prioridade para liberar os recursos usados por serviços não essenciais para que os recursos possam ser usados para programar os pods dos serviços principais.
Tabela 1 lista o agendamento baseado em prioridade suportado pelos clusters do CCE.
Tipo de agendamento |
Descrição |
Agendador |
---|---|---|
Agendamento baseado em prioridade |
O agendador garante preferencialmente a execução de pods de alta prioridade, mas não expulsará pods de baixa prioridade que estão em execução. O agendamento baseado em prioridade é ativado por padrão e não pode ser desativado. |
kube-scheduler ou Volcano scheduler |
Preempção baseada em prioridade |
Quando os recursos de cluster são insuficientes, o agendador desalojará proativamente pods de baixa prioridade para possibilitar o agendamento de pods de alta prioridade pendentes. |
Volcano scheduler |
Procedimento
Depois que o Volcano for instalado, você poderá ativar ou desativar o agendamento baseado em prioridade na página Scheduling Configuration.
- Efetue logon no console do CCE.
- Clique no nome do cluster para acessar o console do cluster. Escolha Settings no painel de navegação e clique na guia Scheduling Configuration.
- Na área Business priority scheduling, configure o agendamento baseado em prioridade.
- Scheduling based on priority: o agendador garante preferencialmente a execução de pods de alta prioridade, mas não despejará pods de baixa prioridade que estão em execução. O agendamento baseado em prioridade é ativado por padrão e não pode ser desativado.
- Whether to enable preemption: se o Volcano scheduler for usado como o agendador padrão do cluster, a preempção baseada em prioridade é suportada. Quando os recursos de cluster são insuficientes, o agendador despejará proativamente pods de baixa prioridade para possibilitar o agendamento de pods de alta prioridade pendentes.
Depois que a preempção baseada em prioridade estiver ativada, a criação de pods atrasada não será permitida.
Figura 1 Agendamento baseado em prioridade
- Clique em Confirm.
- Após a configuração, você pode usar PriorityClasses para programar os pods de cargas de trabalho ou prioridades baseadas em tarefas do Volcano.
- Crie uma ou mais PriorityClasses.
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 globalDefault: false description: ""
- Crie uma carga de trabalho ou uma tarefa de Volcanoe especifique seu nome de PriorityClass.
- Carga de trabalho
apiVersion: apps/v1 kind: Deployment metadata: name: high-test labels: app: high-test spec: replicas: 5 selector: matchLabels: app: test template: metadata: labels: app: test spec: priorityClassName: high-priority schedulerName: volcano containers: - name: test image: busybox imagePullPolicy: IfNotPresent command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600'] resources: requests: cpu: 500m limits: cpu: 500m
- Tarefa do Volcano
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: vcjob spec: schedulerName: volcano minAvailable: 4 priorityClassName: high-priority tasks: - replicas: 4 name: "test" template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: requests: cpu: "1" restartPolicy: OnFailure
- Carga de trabalho
- Crie uma ou mais PriorityClasses.
Casos de uso
Agendamento baseado em prioridade
Por exemplo, há dois nós ociosos e várias cargas de trabalho com três prioridades (alta prioridade, média prioridade e baixa prioridade). Execute a carga de trabalho de alta prioridade para esgotar todos os recursos de cluster e emita as cargas de trabalho de média e baixa prioridade. Em seguida, os dois tipos de cargas de trabalho estão pendentes devido a recursos insuficientes. Quando a carga de trabalho de alta prioridade termina, os pods da carga de trabalho de prioridade média serão programados antes dos pods da carga de trabalho de baixa prioridade de acordo com a configuração de programação baseada em prioridade.
- Adicione três PriorityClasses (high-priority, med-priority e low-priority) em priority.yaml.
Exemplo de configuração de priority.yaml:
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 100 globalDefault: false description: "This priority class should be used for volcano job only." --- apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: med-priority value: 50 globalDefault: false description: "This priority class should be used for volcano job only." --- apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: low-priority value: 10 globalDefault: false description: "This priority class should be used for volcano job only."
Crie PriorityClasses.kubectl apply -f priority.yaml
- Verifique PriorityClasses.
kubectl get PriorityClass
Saída do comando:NAME VALUE GLOBAL-DEFAULT AGE high-priority 100 false 97s low-priority 10 false 97s med-priority 50 false 97s system-cluster-critical 2000000000 false 6d6h system-node-critical 2000001000 false 6d6h
- Crie uma carga de trabalho de alta prioridade chamada high-priority-job para esgotar todos os recursos do cluster.
high-priority-job.yaml
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: priority-high spec: schedulerName: volcano minAvailable: 4 priorityClassName: high-priority tasks: - replicas: 4 name: "test" template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: requests: cpu: "1" restartPolicy: OnFailure
Execute o seguinte comando para emitir a tarefa:
kubectl apply -f high_priority_job.yaml
Execute o comando kubectl get pod para verificar os status do pod:
NAME READY STATUS RESTARTS AGE priority-high-test-0 1/1 Running 0 3s priority-high-test-1 1/1 Running 0 3s priority-high-test-2 1/1 Running 0 3s priority-high-test-3 1/1 Running 0 3s
A saída do comando mostra que todos os recursos do cluster foram usados.
- Crie uma carga de trabalho de média prioridade med-priority-job e uma carga de trabalho de baixa prioridade baixa low-priority-job.
med-priority-job.yaml
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: priority-medium spec: schedulerName: volcano minAvailable: 4 priorityClassName: med-priority tasks: - replicas: 4 name: "test" template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: requests: cpu: "1" restartPolicy: OnFailure
low-priority-job.yaml
apiVersion: batch.volcano.sh/v1alpha1 kind: Job metadata: name: priority-low spec: schedulerName: volcano minAvailable: 4 priorityClassName: low-priority tasks: - replicas: 4 name: "test" template: spec: containers: - image: alpine command: ["/bin/sh", "-c", "sleep 1000"] imagePullPolicy: IfNotPresent name: running resources: requests: cpu: "1" restartPolicy: OnFailure
Execute os seguintes comandos para emitir as tarefas:
kubectl apply -f med_priority_job.yaml kubectl apply -f low_priority_job.yaml
Execute o comando kubectl get pod para verificar os status dos pods das cargas de trabalho recém-criadas. A saída do comando mostra que os pods estão pendentes devido a recursos insuficientes:
NAME READY STATUS RESTARTS AGE priority-high-test-0 1/1 Running 0 3m29s priority-high-test-1 1/1 Running 0 3m29s priority-high-test-2 1/1 Running 0 3m29s priority-high-test-3 1/1 Running 0 3m29s priority-low-test-0 0/1 Pending 0 2m26s priority-low-test-1 0/1 Pending 0 2m26s priority-low-test-2 0/1 Pending 0 2m26s priority-low-test-3 0/1 Pending 0 2m26s priority-medium-test-0 0/1 Pending 0 2m36s priority-medium-test-1 0/1 Pending 0 2m36s priority-medium-test-2 0/1 Pending 0 2m36s priority-medium-test-3 0/1 Pending 0 2m36s
- Exclua a carga de trabalho high_priority_job para liberar recursos e verifique se os pods da carga de trabalho med-priority-job serão preferencialmente agendados.
Execute o comando kubectl delete -f high_priority_job.yaml para liberar recursos de cluster e verificar o agendamento de pods.
NAME READY STATUS RESTARTS AGE priority-low-test-0 0/1 Pending 0 5m18s priority-low-test-1 0/1 Pending 0 5m18s priority-low-test-2 0/1 Pending 0 5m18s priority-low-test-3 0/1 Pending 0 5m18s priority-medium-test-0 1/1 Running 0 5m28s priority-medium-test-1 1/1 Running 0 5m28s priority-medium-test-2 1/1 Running 0 5m28s priority-medium-test-3 1/1 Running 0 5m28s
Preempção baseada em prioridade
- Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster. Escolha Settings no painel de navegação e clique na guia Scheduling Configuration.
- Modifique configurações.
- Selecione volcano scheduler como o agendador de cluster padrão.
- Ative Scheduling based on priority.
- Emita a carga de trabalho high_priority_job. Em seguida, o agendador expulsará os pods da carga de trabalho med_priority_job para que os pods da carga de trabalho de alta prioridade possam ser agendados.
Execute o comando kubectl apply -f high_priority_job.yaml para emitir a carga de trabalho de alta prioridade. Em seguida, verifique os status dos pods.
NAME READY STATUS RESTARTS AGE priority-high-test-0 0/1 Pending 0 2s priority-high-test-1 0/1 Pending 0 2s priority-high-test-2 0/1 Pending 0 2s priority-high-test-3 0/1 Pending 0 2s priority-low-test-0 0/1 Pending 0 14s priority-low-test-1 0/1 Pending 0 14s priority-low-test-2 0/1 Pending 0 14s priority-low-test-3 0/1 Pending 0 14s priority-medium-test-0 1/1 Terminating 0 21s priority-medium-test-1 1/1 Terminating 0 21s priority-medium-test-2 1/1 Terminating 0 21s priority-medium-test-3 1/1 Terminating 0 21s
Depois que os recursos usados pela carga de trabalho do recurso med_priority_job resource forem liberados, os pods da carga de trabalho high_priority_job poderão ser agendados.
NAME READY STATUS RESTARTS AGE priority-high-test-0 1/1 Running 0 70s priority-high-test-1 1/1 Running 0 70s priority-high-test-2 1/1 Running 0 70s priority-high-test-3 1/1 Running 0 70s priority-low-test-0 0/1 Pending 0 82s priority-low-test-1 0/1 Pending 0 82s priority-low-test-2 0/1 Pending 0 82s priority-low-test-3 0/1 Pending 0 82s priority-medium-test-0 0/1 Pending 0 37s priority-medium-test-1 0/1 Pending 0 36s priority-medium-test-2 0/1 Pending 0 37s priority-medium-test-3 0/1 Pending 0 37s