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.
Atualizado em 2024-11-28 GMT+08:00

Reagendador

O agendamento em um cluster é o processo de vinculação de pods pendentes a nós e é realizado por um componente chamado kube-scheduler ou Volcano Scheduler. O agendador usa uma série de algoritmos para calcular o nó ideal para executar pods. No entanto, os clusters do Kubernetes são dinâmicos e seu estado muda ao longo do tempo. Por exemplo, se um nó precisar ser mantido, todos os pods no nó serão despejados para outros nós. Após a conclusão da manutenção, os pods despejados não retornarão automaticamente ao nó, pois o agendamento não será acionado quando um pod for vinculado a um nó. Devido a essas alterações, a carga de um cluster pode ser desequilibrada após a execução do cluster por um período de tempo.

O CCE resolveu esse problema usando o Volcano scheduler para expulsar os pods que não estão em conformidade com a política configurada para que os pods possam ser reagendados. Dessa forma, a carga do cluster é balanceada e a fragmentação de recursos é minimizada.

Recursos de reagendamento

Reagendamento com reconhecimento de carga

Durante o gerenciamento de cluster do Kubernetes, os nós sobreutilizados são devido ao alto uso de CPU ou memória, o que afeta a execução estável de pods nesses nós e aumenta a probabilidade de falhas de nó. Para equilibrar dinamicamente o uso de recursos entre nós em um cluster, é necessária uma visualização de recursos de cluster com base nas métricas de monitoramento de nós. Durante o gerenciamento de cluster, o monitoramento em tempo real pode ser usado para detectar problemas como alto uso de recursos em um nó, falhas de nó e número excessivo de pods em um nó, para que o sistema possa tomar medidas prontamente, por exemplo, migrando alguns pods de um nó sobreutilizado para nós subutilizados.

Figura 1 Reagendamento com reconhecimento de carga

Ao usar esse complemento, verifique se o valor de highThresholds é maior que o valor de lowThresholds. Caso contrário, o reagendador não poderá funcionar.

  • Appropriately utilized node: um nó cujo uso de recursos é maior ou igual a 30% e menor ou igual a 80%. O uso de recursos de nós adequadamente utilizados está dentro do intervalo esperado.
  • Over-utilized node: um nó cujo uso de recursos é superior a 80%. Alguns pods serão despejados de nós sobreutilizados para reduzir seu uso de recursos para ser menor ou igual a 80%. O reagendador agendará os pods despejados para nós subutilizados.
  • Under-utilized node: um nó cujo uso de recursos é inferior a 30%.

HighNodeUtilization

Essa política encontra nós que são subutilizados e despeja pods dos nós na esperança de que esses pods sejam agendados de forma compacta em menos nós. Esta política deve ser usada com a política binpack do Volcano scheduler ou a política MostAllocated do kube-scheduler scheduler. Os limites podem ser configurados para CPU e memória.

Pré-requisitos

  • Um cluster de v1.19.16 ou posterior está disponível. Para mais detalhes, consulte Compra de um cluster do CCE.
  • Volcano de v1.11.5 ou posterior foi instalado no cluster. Para mais detalhes, consulte Volcano scheduler.

Restrições

  • Os pods precisam ser reprogramados usando um agendador, e nenhum agendador pode rotular pods ou nós. Portanto, um pod despejado pode ser reagendado para o nó original.
  • O reagendamento não oferece suporte à antiafinidade entre pods. Um pod despejado está em relação à antiafinidade com outros pods em execução. Portanto, o agendador ainda pode agendar o pod de volta para o nó de onde o pod foi despejado.
  • Ao configurar o reagendamento com reconhecimento de carga, é necessário habilitar o agendamento com reconhecimento de carga no Volcano scheduler. Ao configurar HighNodeUtilization, é necessário habilitar o reagendamento binpack no Volcano scheduler.

Configurar uma política de reagendamento com reconhecimento de carga

Ao configurar uma política do reagendador com reconhecimento de carga, faça o seguinte para habilitar o agendamento com reconhecimento de carga no Volcano scheduler:

  1. Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster. Escolha Add-ons no painel de navegação, localize Volcano Scheduler à direita e clique em Install ou Edit.
  2. Na área Parameters, modifique Advanced Settings para configurar a política do reagendador com reconhecimento de carga e habilitar o complemento usage (um complemento de Volcano de código aberto).

    {
      "colocation_enable": "",
      "default_scheduler_conf": {
        "actions": "allocate, backfill",
        "tiers": [
          {
            "plugins": [
              {
                "name": "priority"
              },
              {
                "enablePreemptable": false,
                "name": "gang"
              },
              {
                "name": "conformance"
              },
              {
                "name": "usage",
                "arguments": {
                  "usage.weight": 5,
                  "thresholds": {
                    "CPUUsageAvg.5m": 60,
                    "MEMUsageAvg.5m": 65
                  }
                }
              }
            ]
          },
          {
            "plugins": [
              {
                "enablePreemptable": false,
                "name": "drf"
              },
              {
                "name": "predicates"
              },
              {
                "name": "nodeorder"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "cce-gpu-topology-predicate"
              },
              {
                "name": "cce-gpu-topology-priority"
              },
              {
                "name": "cce-gpu"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "nodelocalvolume"
              },
              {
                "name": "nodeemptydirvolume"
              },
              {
                "name": "nodeCSIscheduling"
              },
              {
                "name": "networkresource"
              }
            ]
          }
        ]
      },
      "deschedulerPolicy": {
        "profiles": [
          {
            "name": "ProfileName",
            "pluginConfig": [
              {
                "args": {
                  "ignorePvcPods": true,
                  "nodeFit": true,
                  "priorityThreshold": {
                    "value": 100
                  }
                },
                "name": "DefaultEvictor"
              },
              {
                "args": {
                  "duration": "2m",
                  "evictableNamespaces": {
                    "exclude": ["kube-system"]
                  },
                  "metrics": {
                    "address": "**.**.**.**:9090",
                    "type": "prometheus"
                  },
                  "targetThresholds": {
                    "cpu": 80,
                    "memory": 85
                  },
                  "thresholds": {
                    "cpu": 30,
                    "memory": 30
                  }
                },
                "name": "LoadAware"
              }
            ],
            "plugins": {
              "balance": {
                "enabled": ["LoadAware"]
              }
            }
          }
        ]
      },
      "descheduler_enable": "true",
      "deschedulingInterval": "10m"
    }
    Tabela 1 Parâmetros-chave de uma política do reagendamento de cluster

    Parâmetro

    Descrição

    descheduler_enable

    Se deve ativar uma política de reagendador de clusters.

    • true: a política do reagendador de cluster está ativada.
    • falso: a política do reagendador de cluster está desativada.

    deschedulingInterval

    Período de reagendamento.

    deschedulerPolicy

    Política do reagendador do cluster. Para mais detalhes, consulte Tabela 2.

    Tabela 2 Parâmetros de deschedulerPolicy

    Parâmetro

    Descrição

    profiles.[].plugins.balance.enable.[]

    Política do reagendador para um cluster.

    LoadAware: uma política de reagendamento com reconhecimento de carga é usada.

    profiles.[].pluginConfig.[].name

    Configuração de uma política do reagendador com reconhecimento de carga. Opções:

    • DefaultEvictor: política de despejo padrão
    • LoadAware: uma política de reagendamento com reconhecimento de carga

    profiles.[].pluginConfig.[].args

    Configuração da política do reagendador de um cluster.

    • Configurações para a política DefaultEvictor:
      • ignorePvcPods: se os pods de PVC devem ser ignorados ou despejados. O valor true indica que os pods são ignorados, e o valor false indica que os pods são despejados. Essa configuração não diferencia os tipos de PVC (PVs locais, SFS ou EVS).
      • nodeFit: se deve considerar as configurações de agendamento existentes, como afinidade de nó e mancha no nó durante o agendamento. O valor true indica que as configurações de agendamento existentes serão consideradas e o valor false indica que elas serão ignoradas.
      • priorityThreshold: definição de prioridade. Se a prioridade de um pod for maior ou igual ao valor deste parâmetro, o pod não será despejado. Exemplo:
        {
          "value": 100
        }
    • Configurações para a política LoadAware:
      • duration: período para obter o uso médio de CPU e memória do Prometheus.
      • evictableNamespaces: espaços de nomes onde a política de despejo entra em vigor. O valor padrão são os namespaces diferentes do kube-system. Exemplo:
        {
          "exclude": ["kube-system"]
        }
      • metrics: monitorando a coleta de dados, onde o endereço e o tipo de coleta devem ser especificados. Apenas Prometheus é suportado. Exemplo:
        {
          "address": "10.247.119.103:9090",
          "type": "prometheus"
        }
      • targetThresholds: limite para despejar pods de um nó. Quando o uso de CPU ou memória de um nó é maior que o limite, os pods no nó serão despejados. Exemplo:
        {
          "cpu": 60,
          "memory": 65
        }
      • thresholds: limite para um nó executar pods. Se o valor do nó for menor que o limite, o nó permitirá que pods despejados sejam executados. Exemplo:
        {
          "cpu": 30,
          "memory": 30
        }

  3. Clique em OK.

Configurar uma política HighNodeUtilization

Ao configurar uma política HighNodeUtilization, faça o seguinte para habilitar a política de agendamento binpack no Volcano scheduler:

  1. Efetue logon no console do CCE e clique no nome do cluster para acessar o console do cluster. Escolha Add-ons no painel de navegação, localize Volcano Scheduler à direita e clique em Install ou Edit.
  2. Na área Parameters, modifique Advanced Settings para configurar a política HighNodeUtilization.

    {
      "colocation_enable": "",
      "default_scheduler_conf": {
        "actions": "allocate, backfill",
        "tiers": [
          {
            "plugins": [
              {
                "name": "priority"
              },
              {
                "enablePreemptable": false,
                "name": "gang"
              },
              {
                "name": "conformance"
              },
              {
                "arguments": {
                  "binpack.weight": 5
                },
                "name": "binpack"
              }
            ]
          },
          {
            "plugins": [
              {
                "enablePreemptable": false,
                "name": "drf"
              },
              {
                "name": "predicates"
              },
              {
                "name": "nodeorder"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "cce-gpu-topology-predicate"
              },
              {
                "name": "cce-gpu-topology-priority"
              },
              {
                "name": "cce-gpu"
              }
            ]
          },
          {
            "plugins": [
              {
                "name": "nodelocalvolume"
              },
              {
                "name": "nodeemptydirvolume"
              },
              {
                "name": "nodeCSIscheduling"
              },
              {
                "name": "networkresource"
              }
            ]
          }
        ]
      },
      "deschedulerPolicy": {
        "profiles": [
          {
            "name": "ProfileName",
            "pluginConfig": [
              {
                "args": {
                  "ignorePvcPods": true,
                  "nodeFit": true,
                  "priorityThreshold": {
                    "value": 100
                  }
                },
                "name": "DefaultEvictor"
              },
              {
                "args": {
                  "evictableNamespaces": {
                    "exclude": ["kube-system"]
                  },
                  "thresholds": {
                    "cpu": 25,
                    "memory": 25
                  }
                },
                "name": "HighNodeUtilization"
              }
            ],
            "plugins": {
              "balance": {
                "enabled": ["HighNodeUtilization"]
              }
            }
          }
        ]
      },
      "descheduler_enable": "true",
      "deschedulingInterval": "10m"
    }
    Tabela 3 Parâmetros principais de uma política do reagendamento de cluster

    Parâmetro

    Descrição

    descheduler_enable

    Se deve ativar uma política de reagendador de clusters.

    • true: a política do reagendador de cluster está ativada.
    • false: a política do reagendador de cluster está desativada.

    deschedulingInterval

    Período de reagendamento.

    deschedulerPolicy

    Política do reagendador do cluster. Para mais detalhes, consulte Tabela 4.

    Tabela 4 Parâmetros de deschedulerPolicy

    Parâmetro

    Descrição

    profiles.[].plugins.balance.enable.[]

    Política do reagendador para um cluster.

    HighNodeUtilization: a política para minimizar a CPU e fragmentos de memória é usada.

    profiles.[].pluginConfig.[].name

    Configuração de uma política do reagendador com reconhecimento de carga. Opções:

    • DefaultEvictor: política de despejo padrão
    • HighNodeUtilization: política para minimizar fragmentos de CPU e memória

    profiles.[].pluginConfig.[].args

    Configuração da política do reagendador de um cluster.

    • Configurações para a política DefaultEvictor:
      • ignorePvcPods: se os pods de PVC devem ser ignorados ou despejados. O valor true indica que os pods são ignorados, e o valor false indica que os pods são despejados.
      • nodeFit: se deve considerar as configurações de agendamento existentes, como afinidade de nó e mancha no nó durante o agendamento. O valor true indica que as configurações de agendamento existentes serão consideradas e o valor false indica que elas serão ignoradas.
      • priorityThreshold: definição de prioridade. Se a prioridade de um pod for maior ou igual ao valor deste parâmetro, o pod não será despejado. Exemplo:
        {
          "value": 100
        }
    • Configurações para a política HighNodeUtilization:
      • evictableNamespaces: espaços de nomes onde a política de despejo entra em vigor. O valor padrão são os namespaces diferentes do kube-system. Exemplo:
        {
          "exclude": ["kube-system"]
        }
      • thresholds: limite para despejar pods de um nó. Quando o uso da CPU ou da memória de um nó é menor que o limite, os pods no nó serão despejados. Exemplo:
        {
          "cpu": 25,
          "memory": 25
        }

  3. Clique em OK.

Casos de uso

HighNodeUtilization

  1. Verifique os nós em um cluster. Verifica-se que alguns nós são subutilizados.

  2. Edite os parâmetros do vulcão para ativar o reagendador e defina os limites de uso de CPU e memória para 25. Quando o uso da CPU e da memória de um nó for menor que 25%, os pods no nó serão despejados.

  3. Depois que a política entrar em vigor, os pods no nó com endereço IP 192.168.44.152 serão migrados para o nó com endereço IP 192.168.54.65 para minimizar fragmentos de recursos.

Problemas comuns

Se um parâmetro de entrada estiver incorreto, por exemplo, o valor inserido além do intervalo de valores aceitos ou estiver em um formato incorreto, um evento será gerado. Nesse caso, modifique a configuração do parâmetro conforme solicitado.