Empacotamento de Nós com perfis de agendador no Azure Kubernetes Service (AKS) (pré-visualização)

Neste artigo, aprende como agrupar os seus nós para melhorar a utilização dos nós para clusters Azure Kubernetes Service (AKS) usando o plugin de agendamento em árvore. NodeResourcesFit O scheduler AKS predefinido opera num NodeResourcesFit:LeastAllocated modo que prioriza nós com menor utilização ao agendar pods. Configurable Scheduler Profiles no AKS permite-lhe alterar este comportamento predefinido e afinar a configuração para priorizar nós com maior utilização. Esta documentação cobre três perfis diferentes de agendadores personalizados, destacando as práticas recomendadas para melhorar a utilização ao reduzir os nós sobrecarregados.

O agrupamento de bins de nós é uma estratégia de agendamento que maximiza a utilização de recursos ao aumentar a densidade de pods nos nós, em vez de espalhar os pods por um pool de nós ou autoescalar os nós prematuramente. O empacotamento de caixas ajuda a minimizar recursos desperdiçados e pode reduzir o custo operacional de manter nós inativos ou subutilizados. Melhorar a utilização dos nós é fundamental, pois os dados mostram que a CPU e a memória são recursos frequentemente solicitados em excesso. Além disso, à medida que a adoção das GPUs cresce, a utilização eficiente dos aceleradores torna-se igualmente crítica devido à sua relativa escassez e custo.

Limitações

  • Atualmente, o AKS não gere a implantação de agendadores de terceiros ou de plugins de agendamento externos.
  • O AKS não suporta plugins de agendamento na árvore direcionados ao aks-system agendador. Essa restrição está em vigor para ajudar a evitar alterações inesperadas nos complementos do AKS habilitados no cluster. Além disso, não se pode definir um profile chamado aks-system.

Pré-requisitos

Habilitar a configuração do perfil do agendador em um cluster AKS

Você pode habilitar a configuração do perfil de agendamento em um cluster AKS novo ou existente.

  1. Crie um cluster AKS com a configuração do perfil do agendador ativada usando o comando az aks create com o flag --enable-upstream-kubescheduler-user-configuration.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<aks-cluster-name>
    
    # Create an AKS cluster with schedule profile configuration enabled
    az aks create \
    --resource-group $RESOURCE_GROUP \ 
    --name $CLUSTER_NAME \
    --enable-upstream-kubescheduler-user-configuration \
    --generate-ssh-keys
    
  2. Quando o processo de criação for concluído, conecte-se ao cluster usando o az aks get-credentials comando.

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Verificar a instalação do controlador do agendador

  • Depois de ativar o recurso no cluster AKS, verifique se a definição de recurso personalizada (CRD) do controlador do agendador foi instalada com êxito usando o kubectl get comando.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Observação

    Este comando não terá êxito se o recurso não tiver sido habilitado com êxito na seção anterior.

Configurar o bin-packing de nós utilizando o plugin RequestedtoCapacity.

Dos três perfis, RequestedToCapacityRatio fornece o controlo de utilizador mais granular para mapear nós para uma utilização explícita. Por exemplo, este perfil de agendamento foi configurado para favorecer nós dentro de uma faixa de utilização de 50-85%, evitar nós vazios e despriorizar severamente nós quase cheios com 90% de utilização ou mais, deixando alguma margem de manobra. Dado este nível de detalhe, RequestedtoCapacity é a estratégia de pontuação recomendada para o agrupamento de bins de nós no AKS para clusters de produção.

Esta configuração torna a utilização da CPU o fator dominante na seleção de nós, empacotando nós enquanto evita a saturação excessiva para aplicações com muita CPU. Por fim, tens de desativar o PodTopologySpread plugin, pois pode sobrepor a pontuação ponderada se NodeResourcesFit for deixado ativado por defeito.

  • NodeResourcesFit Determina como o agendador avalia se um nó possui recursos suficientes para executar um pod.
  • scoringStrategy: RequestedToCapacityRatio Pontua os nós com base na razão entre os recursos solicitados e a capacidade total do nó após a colocação hipoteticamente do pod.
  • Resources especifica que CPU e Memory são os principais recursos considerados para a pontuação. Com um peso de 8, os nós com utilização de CPU são pontuados 8 vezes mais do que a memória durante o ciclo de agendamento de pods. Isto aumenta a probabilidade de serem selecionados nós com elevada utilização.
  • shape: Mapeia a utilização do nó para a pontuação do agendador. Cada ponto representa uma percentagem de utilização e a sua pontuação correspondente, com uma pontuação linear entre pontos.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-RtC
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: RequestedToCapacityRatio
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
                requestedToCapacityRatio:
                  shape:
                    - utilization: 0
                      score: 0
                    - utilization: 30
                      score: 9
                    - utilization: 50
                      score: 10
                    - utilization: 85
                      score: 10
                    - utilization: 90
                      score: 5
                    - utilization: 100
                      score: 0

Configurar agrupamento de nós em bin com o Plugin MostAllocated

Configurar o escalonador com MostAllocated prioriza exclusivamente os nós com base no uso de recursos. Quanto maior for a utilização de recursos, maior é a pontuação atribuída a um nó, evitando nós que não são utilizados e adiando o escalonamento até ser necessário. Isoladamente, esta configuração corre o risco de saturar os nós além dos limites desejáveis, causando estrangulamento ou criando mais pontos de estrangulamento.

Esta configuração torna a utilização da CPU o fator dominante na seleção de nós. Para garantir um comportamento consistente, deve desativar o plug-in PodTopologySpread, pois pode sobrepor a pontuação ponderada caso o NodeResourcesFit permaneça ativado por defeito.

  • NodeResourcesFit Determina como o agendador avalia se um nó possui recursos suficientes para executar um pod.
  • scoringStrategy: MostAllocated Pontuações baseadas nas solicitações de pod. MostAllocated diz ao sistema de agendamento para dar preferência a nós com elevado nível de utilização de recursos. Esta estratégia promove uma colocação densa dos pods e ajuda a alcançar uma melhor utilização dos nós.
  • Resources especifica que CPU e Memory são os principais recursos considerados para a pontuação. Com um peso de 8, os nós com utilização de CPU são pontuados 8 vezes mais do que a memória durante o ciclo de agendamento de pods. Isto aumenta a probabilidade de serem selecionados nós com elevada utilização.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1

Configure o bin-packing de nós com os plugins MostAllocated e NodeResourcesBalancedAllocation

Esta configuração procura adicionar algumas barreiras à estratégia MostAllocated simples e eficiente, ao pontuar os nós com base na utilização equilibrada dos recursos-alvo. NodeResourcesBalancedAllocation incentiva a colocação de pods em nós com utilização proporcional definida pelo utilizador, aumentando a eficiência global enquanto evita gargalos causados pela pressão assimétrica dos recursos. Por exemplo, nós limitados pela CPU com memória abundante e não utilizada teriam uma pontuação mais baixa em favor dos nós com melhor equilíbrio entre utilização da CPU e da memória.

  • NodeResourcesBalancedAllocation Atribui pontuações aos nós com base em quão equilibrado é o uso de vários recursos. Em vez de maximizar a utilização de um único recurso, este plugin prefere nós onde o consumo de recursos é proporcional.
  • Resources Especifica quais os recursos considerados durante a avaliação do balanço. Com CPU e memória ponderadas de forma igual, os nós obtêm pontuações mais elevadas quando ambos os recursos são consumidos em níveis semelhantes.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA-BalancedAllocation
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
              - name: NodeResourcesBalancedAllocation
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
          - name: NodeResourcesBalancedAllocation
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesBalancedAllocationArgs
              resources:
                - name: cpu
                  weight: 1
                - name: memory
                  weight: 1

Atribuir um perfil de agendador a um cluster AKS inteiro

  1. Crie um ficheiro chamado cpu-bin-packing-scheduler.yaml, com o CRD nomeado upstream

  2. Aplique o manifesto de configuração de agendamento usando o kubectl apply comando.

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. Para direcionar esse mecanismo de agendamento para cargas de trabalho específicas, atualize as suas implementações de pod com o seguinte schedulerName:

    ...
    ...
        spec:
          schedulerName: binpacking-scheduler
    ...
    ...
    

Passos seguintes

Para saber mais sobre o agendador AKS, outras configurações e melhores práticas, consulte os seguintes recursos: