Redimensionar pools de nós no AKS (Serviço de Kubernetes do Azure)

Talvez você queira alterar o tamanho das VMs (máquinas virtuais) para acomodar um número crescente de implantações ou executar uma carga de trabalho maior. Não há suporte para redimensionamento de instâncias do AKS diretamente ao usar conjuntos de dimensionamento de máquinas virtuais no AKS, conforme descrito nas políticas de suporte do AKS:

Os nós do agente do AKS são exibidos no portal do Azure como recursos comuns de IaaS do Azure. Porém essas máquinas virtuais são implantadas em um grupo de recursos do Azure personalizado (geralmente prefixado com MC_*). Você não pode fazer personalizações diretas para esses nós usando as APIs ou recursos de IaaS. Alterações personalizadas que não forem feitas por meio da API do AKS não persistirão após um upgrade, ajuste de escala, atualização ou reinicialização.

Neste artigo, você aprenderá o método recomendado para redimensionar um pool de nós criando um novo pool de nós com o tamanho de SKU desejado, isolando e drenando os nós existentes e removendo o pool de nós existente.

Importante

Esse método é específico para clusters do AKS baseados em Conjuntos de Escala de Máquinas Virtuais. Ao usar pools de nós baseados em Máquinas Virtuais, você pode atualizar facilmente os tamanhos de VM em um pool de nós existente usando um único comando da CLI do Azure e ter vários tamanhos de VM no mesmo pool de nós. Para obter mais informações, consulte a documentação dos pools de nós das Máquinas Virtuais.

Redimensionar um pool de nós do VMSS no local (versão preliminar)

Importante

As funcionalidades em versão preliminar do AKS estão disponíveis de forma optativa e por autoatendimento. As versões prévias são fornecidas “no estado em que se encontram” e “conforme disponíveis” e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões prévias do AKS são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção. Para obter mais informações, consulte os seguintes artigos:

Agora você pode redimensionar o tamanho da VM (SKU) de um pool de nós baseado em VMSS existente em um único comando usando az aks nodepool update --node-vm-size <new-size>. Quando você dispara essa atualização, o provedor de recursos do AKS executa uma atualização sem interrupção:

  1. Expandir novos nós com o tamanho da VM de destino.
  2. Isolar e drenar os nós antigos.
  3. Excluindo os nós antigos.

Isso evita o fluxo de trabalho manual de criar/isolar/drenar/excluir descrito no restante deste artigo.

Como funciona a distribuição do redimensionamento

A distribuição do redimensionamento usa o mesmo mecanismo de atualização contínua que uma atualização da imagem do nó e uma atualização da versão do Kubernetes; assim, ela respeita as seguintes configurações relacionadas a atualizações já definidas no pool de nós. Em particular, o redimensionamento respeita:

  • Aumento máximo (--max-surge): controla quantos nós extras com o tamanho da VM de destino são adicionados durante a distribuição. Um valor mais alto redimensiona o pool mais rapidamente, mas consome mais computação e cota de IP; um valor mais baixo é mais lento, mas menos disruptivo. O padrão no AKS é 1, e 33% é recomendado para conjuntos de nós de produção.
  • Tempo limite de drenagem do nó (--drain-timeout): quanto tempo o AKS aguarda pela remoção de pod em cada nó antigo antes de forçar a exclusão. O padrão é 30 minutos. Associe isso com PodDisruptionBudgets apropriado para permitir a drenagem segura de cargas de trabalho.
  • Duração de imersão do nó (--node-soak-duration): quanto tempo o AKS aguarda após um novo nó ficar pronto antes de passar para o próximo lote. Útil para permitir que as cargas de trabalho se estabilizem no novo tamanho da VM antes de continuar a distribuição.

Como o redimensionamento reutiliza o pipeline de atualização, os mesmos pré-requisitos se aplicam: verifique se sua assinatura tem capacidade de substituição de tamanho de VM de destino suficiente e IPs de sub-rede disponíveis para nós de aumento e que PodDisruptionBudgets permitam a remoção de pelo menos uma réplica de cada vez; caso contrário, o redimensionamento poderá ser bloqueado durante a drenagem. Para obter recomendações de ponta a ponta, consulte As práticas recomendadas para atualizações do pool de nós do AKS.

Pré-requisitos

Redimensionar o pool de nós

Use o comando az aks nodepool update com o parâmetro --node-vm-size para alterar o tamanho da VM de um pool de nós existente baseado em VMSS:

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3

Validação e combinações sem suporte

O provedor de recursos do AKS valida a solicitação de redimensionamento e bloqueia alterações de tamanho de VM incompatíveis. As seguintes alterações não têm suporte como parte de um redimensionamento local do VMSS:

  • Alterando o tipo de controlador de disco (por exemplo, SCSI para NVMe).
  • Alterando a arquitetura da CPU (por exemplo, x64 para ARM64).
  • Alterando o suporte à computação confidencial (por exemplo, habilitando ou desabilitando o SNP).
  • Alterando a geração do hipervisor (por exemplo, V1 para V2).
  • Combinando o redimensionamento com uma atualização de versão do Kubernetes ou uma alteração de contagem de nós na mesma operação.

Se o tamanho da VM de destino exigir qualquer uma das alterações acima, use o fluxo de trabalho manual de isolamento e drenagem descrito nas seções a seguir.

Observação

O redimensionamento no local exige capacidade adicional para provisionar novos nós com o tamanho da VM de destino antes de drenar os nós antigos. Se o pool de nós estiver configurado com --max-surge 0 (ou seja, --max-unavailable estiver em vigor), a solicitação de redimensionamento será rejeitada com um 400 Bad Request. Para continuar, defina --max-surge para pelo menos 1 ao redimensionar usando

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3 \
    --max-surge 33%

e, opcionalmente, restaure seus valores originais de --max-surge e --max-unavailable após a conclusão do redimensionamento.

Criar um novo pool de nós com o tamanho do SKU desejado

Observação

Cada cluster do AKS precisa conter pelo menos um pool de nós do sistema com no mínimo um nó. Neste exemplo, usamos um --mode de System para adicionar um pool de nós do sistema para substituir o pool de nós do sistema que queremos redimensionar. Você pode atualizar o modo de um pool de nós a qualquer momento. Você também pode adicionar um pool de nós de usuário definindo --mode como User.

Ao redimensionar, considere todos os requisitos de carga de trabalho, como zonas de disponibilidade, e configure o pool de nós do VMSS adequadamente. Talvez seja necessário modificar o comando a seguir de acordo com suas necessidades. Para ver uma lista completa das opções de configuração, confira a página de referência do comando az aks nodepool add.

  1. Crie um novo pool de nós usando o comando az aks nodepool add. Neste exemplo, criamos um novo pool de nós, mynodepoolcom três nós e a SKU da Standard_DS3_v2 VM para substituir um pool de nós existente, nodepool1que tem a SKU da Standard_DS2_v2 VM.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    Leva alguns minutos para que o novo pool de nós seja criado.

  2. Obtenha o status do novo pool de nós usando o kubectl get nodes comando.

    kubectl get nodes
    

    Sua saída deve ser semelhante à seguinte saída de exemplo, mostrando o novo pool de nós mynodepool e o pool de nós existente nodepool1.

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

Isole os nós existentes

O isolamento marca os nós especificados como não agendáveis e impede que outros pods sejam adicionados aos nós.

  1. Obtenha os nomes dos nós que você deseja isolar usando o kubectl get nodes comando.

    kubectl get nodes
    

    Sua saída deve se assemelhar ao seguinte exemplo, mostrando os nós no pool de nós existente nodepool1 que você deseja isolar:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. Isole os nós existentes usando o kubectl cordon comando, especificando os nós desejados em uma lista separada por espaço. Por exemplo:

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    Sua saída deve ser semelhante à seguinte saída de exemplo, mostrando que os nós estão isolados:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

Esvazie os nós existentes

Importante

Para esvaziar os nós com sucesso e remover os pods em execução, verifique se algum PDBs (PodDisruptionBudgets) permite que pelo menos uma réplica de pod seja movida de cada vez. Caso contrário, a operação de drenagem/remoção falhará. Para verificar isso, você pode executar kubectl get pdb -A e verificar ALLOWED DISRUPTIONS se é pelo menos 1 ou superior.

Quando você esvazia os nós, os pods em execução neles são desalojados e recriados nos outros nós agendáveis.

  1. Escorra os nós existentes usando o comando kubectl drain com os sinalizadores --ignore-daemonsets e --delete-emptydir-data, especificando os nós desejados em uma lista separada por espaços. Por exemplo:

    Importante

    O uso de --delete-emptydir-data é necessário para remover os pods coredns e metrics-server criados no AKS. Se você não usar esse sinalizador, receberá um erro. Para obter mais informações, confira a documentação sobre o emptydir.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. Após a conclusão da operação de esvaziamento, todos os pods (excluindo os pods controlados por daemon sets) devem estar em execução no novo pool de nós. Você pode verificar isso usando o comando kubectl get pods.

    kubectl get pods -o wide -A
    

Solução de problemas de desalojamento de pods

Você pode encontrar o seguinte erro ao esvaziar os nós:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

Por padrão, seu cluster tem orçamentos de interrupção de pod gerenciados pelo AKS (como coredns-pdb ou konnectivity-agent) com um MinAvailable de 1. Por exemplo, se houver dois coredns pods em execução, apenas um poderá ser interrompido por vez. Enquanto um deles está sendo recriado e está indisponível, o outro pod coredns não pode ser desalojado devido ao orçamento de interrupção de pods. Esse problema se resolve sozinho após o pod inicial coredns ser agendado e estar em execução, permitindo que o segundo pod seja desalojado e recriado corretamente.

Dica

Considere esvaziar os nós um por um para uma experiência de desalojamento mais suave e para evitar limitação de recursos. Para obter mais informações, consulte:

Remover o pool de nós existente

Importante

Quando você exclui um pool de nós, o AKS não executa o isolamento e o esvaziamento. Para minimizar a interrupção do reagendamento de pods atualmente em execução no pool de nós que você quer excluir, isole e drene todos os nós do pool de nós antes de excluí-los.

  1. Exclua o pool de nós original usando o az aks nodepool delete comando.

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Verifique se o cluster AKS possui apenas o novo pool de nós, com os aplicativos e pods em execução corretamente, usando o comando kubectl get nodes.

    kubectl get nodes
    

    Sua saída deve ser semelhante à seguinte saída de exemplo, mostrando apenas o novo pool de nós mynodepool:

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

Próximas etapas

Depois de redimensionar um pool de nós por isolamento e esvaziamento, saiba mais sobre como usar vários pools de nós.