Nós do Bin Pack com perfis de agendador no Serviço de Kubernetes do Azure (AKS) (versão preliminar)

Neste artigo, você aprenderá a empacotar seus nós para melhorar a utilização de nós nos clusters do Serviço de Kubernetes do Azure (AKS) usando o plug-in de agendamento nativo, NodeResourcesFit O scheduler padrão do AKS opera em um modo NodeResourcesFit:LeastAllocated, que prioriza nós com menor utilização ao agendar pods. Perfis configuráveis do Agendador no AKS permitem alterar esse comportamento padrão e ajustar a configuração para priorizar nós com maior utilização. Esta documentação aborda três perfis de agendador personalizados diferentes, destacando a recomendação de melhores práticas para aumentar a utilização enquanto reduz os pontos quentes de nós.

O empacotamento de nós em compartimento é uma estratégia de agendamento que maximiza a utilização de recursos ao aumentar a densidade dos pods nos nós, em vez de espalhar os pods por um pool de nós ou dimensionar os nós de forma automática prematuramente. O empacotamento de itens ajuda a minimizar os recursos não utilizados e pode reduzir os custos operacionais ao manter nós ociosos ou subutilizados. Melhorar a utilização do nó de processamento é fundamental, pois os dados mostram que a CPU e a memória são recursos frequentemente sobrecarregados. Além disso, à medida que a adoção da GPU cresce, a utilização eficiente dos aceleradores torna-se igualmente crítica devido à sua escassez e custo relativos.

Limitações

  • Atualmente, o AKS não gerencia a implantação de agendadores de terceiros ou de plug-ins de agendamento não nativos ao sistema.
  • O AKS não dá suporte a plug-ins de agendamento na árvore direcionados ao agendador aks-system. Essa restrição está em vigor para ajudar a evitar alterações inesperadas nos complementos do AKS habilitados em seu cluster. Além disso, você não pode definir um profile chamado aks-system.

Pré-requisitos

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

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

  1. Crie um cluster do AKS com a configuração de perfil do agendador habilitada 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. Depois que 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 habilitar o recurso no cluster do AKS, verifique se a CRD (definição de recurso personalizado) do controlador do agendador foi instalada com êxito usando o kubectl get comando.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Observação

    Esse 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ó com o Plug-in RequestedtoCapacity

Dos três perfis, RequestedToCapacityRatio fornece o controle de usuário mais granular para mapeamento de nós para uma utilização explícita. Por exemplo, esse perfil de agendamento foi configurado para favorecer nós dentro de uma faixa de utilização de 50 a 85%, evitar nós quase vazios e despriorizar severamente nós quase completos com utilização de 90% ou mais, deixando algum espaço de sobra. Dado esse nível de detalhe, RequestedtoCapacity é a estratégia de pontuação recomendada para o empacotamento de contêineres em 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, balanceando a carga dos nós e evitando a super saturação para aplicações intensivas em CPU. Por fim, você deve desabilitar o PodTopologySpread plugin, pois ele pode substituir a pontuação ponderada de NodeResourcesFit se deixado habilitado por padrão.

  • NodeResourcesFit controla como o agendador avalia se um nó tem recursos suficientes para executar um pod.
  • scoringStrategy: RequestedToCapacityRatio pontua os nós com base na relação entre recursos solicitados e a capacidade total do nó após a colocação hipotética do pod.
  • Resources especifica que CPU e Memory são os principais recursos considerados para a pontuação. Com um peso de 8, nós que utilizam CPU recebem uma pontuação 8x maior em comparação à memória durante o ciclo de agendamento do pod. Isso aumenta a probabilidade de nós com alta utilização serem selecionados.
  • shape: mapeia a utilização dos nós para a pontuação do agendador. Cada ponto representa um percentual de utilização e 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 o bin-packing de nó com o Plug-in MostAllocated

Configurar o agendador com MostAllocated prioritiza exclusivamente os nós com base no uso de recursos. Quanto maior a utilização do recurso, maior será a pontuação de um nó, evitando nós não utilizados ou dimensionamento até que seja necessário. Isoladamente, essa configuração corre o risco de saturar os nós além dos limites desejáveis, causando estrangulamento ou gargalos adicionais.

Essa configuração torna a utilização da CPU o fator dominante na seleção de nós. Para garantir um comportamento consistente, você deve desabilitar o plug-in PodTopologySpread, pois ele pode substituir a pontuação ponderada se o plug-in NodeResourcesFit for deixado habilitado por padrão.

  • NodeResourcesFit controla como o agendador avalia se um nó tem recursos suficientes para executar um pod.
  • scoringStrategy: MostAllocated pontuações com base em solicitações de pod. MostAllocated orienta o agendador a preferir nós com alto uso de recursos. Essa estratégia promove o agrupamento denso de pods e ajuda a obter melhor utilização de nós.
  • Resources especifica que CPU e Memory são os principais recursos considerados para a pontuação. Com um peso de 8, nós que utilizam CPU recebem uma pontuação 8x maior em comparação à memória durante o ciclo de agendamento do pod. Isso aumenta a probabilidade de nós com alta utilização serem selecionados.
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

Configuração de empacotamento de nós com os plug-ins MostAllocated e NodeResourcesBalancedAllocation

Essa configuração busca adicionar algumas diretrizes à estratégia MostAllocated simples e eficiente, avaliando nós com base no uso equilibrado de recursos-alvo. NodeResourcesBalancedAllocation incentiva o posicionamento de pods em nós com uma utilização proporcional definida pelo usuário, aumentando a eficiência geral e evitando os gargalos causados pela pressão assimétrica dos recursos. Por exemplo, nós com foco em CPU e memória abundante não utilizada receberiam pontuações mais baixas em favor de nós com um melhor equilíbrio de utilização de CPU e memória.

  • NodeResourcesBalancedAllocation avalia os nós com base em quão equilibrado é o uso dos recursos entre vários deles. Em vez de maximizar a utilização de um único recurso, esse plug-in prefere nós em que o consumo de recursos é proporcional.
  • Resources especifica quais recursos são considerados durante a avaliação de saldo. Com a CPU e a memória ponderadas igualmente, os nós recebem uma pontuação mais alta 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 inteiro do AKS

  1. Criar um arquivo 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 workloads específicas, atualize suas implantações de pods com o seguinte schedulerName:

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

Próximas Etapas 

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