Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Cloud Container Engine/ Guia de usuário/ Agendamento/ Agendamento de Volcano/ Agendamento baseado em prioridade e preempção
Atualizado em 2024-11-28 GMT+08:00

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

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.

Tabela 1 Agendamento baseado em prioridade

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.

  1. Efetue logon no console do CCE.
  2. Clique no nome do cluster para acessar o console do cluster. Escolha Settings no painel de navegação e clique na guia Scheduling Configuration.
  3. 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

  4. Clique em Confirm.
  5. Após a configuração, você pode usar PriorityClasses para programar os pods de cargas de trabalho ou prioridades baseadas em tarefas do Volcano.

    1. Crie uma ou mais PriorityClasses.
      apiVersion: scheduling.k8s.io/v1
      kind: PriorityClass
      metadata:
        name: high-priority
      value: 1000000
      globalDefault: false
      description: ""
    2. 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

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.

  1. 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

  2. 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

  3. 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.

  4. 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

  5. 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

  1. 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.
  2. Modifique configurações.

    1. Selecione volcano scheduler como o agendador de cluster padrão.
    2. Ative Scheduling based on priority.

  3. 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