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

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

Os nós do agente AKS aparecem no portal do Azure como recursos regulares de IaaS do Azure. Mas essas máquinas virtuais são implantadas em um grupo de recursos personalizado do Azure (geralmente prefixada com MC_*). Não é possível fazer personalizações diretas nesses nós usando as APIs ou recursos IaaS. Quaisquer alterações personalizadas que não sejam feitas através da API AKS não persistirão através de um upgrade, escalamento, 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, em seguida, removendo o pool de nós existente.

Importante

Este método é específico para clusters AKS baseados em Conjuntos de Escala de Máquina Virtual. 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 de máquinas virtuais.

Redimensione um pool de nós VMSS no local (pré-visualização)

Importante

Os recursos de pré-visualização do AKS estão disponíveis numa base de autosserviço e adesão voluntária. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões de teste do AKS são parcialmente cobertas pelo suporte ao cliente numa base de melhor esforço. Assim sendo, estas funcionalidades não se destinam ao uso em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Agora pode redimensionar o tamanho da VM (SKU) de um pool de nós existente baseado em VMSS num único comando usando az aks nodepool update --node-vm-size <new-size>. Quando desencadeia esta atualização, o fornecedor de recursos AKS realiza uma atualização contínua através de:

  1. Adicionar novos nós com o tamanho de VM de destino.
  2. Isolamento e drenagem dos nós antigos.
  3. Apagar os nós antigos.

Isto evita o fluxo manual de criar/cordonar/drenar/eliminar descrito no resto deste artigo.

Como funciona a implementação faseada do redimensionamento

A implementação do redimensionamento utiliza o mesmo mecanismo de atualização faseada que o usado numa atualização da imagem do nó e numa atualização da versão do Kubernetes, pelo que respeita as seguintes definições relacionadas com a atualização já configuradas no conjunto de nós. Em particular, a redimensionação respeita:

  • Aumento máximo (--max-surge): Controla quantos nós adicionais com o tamanho de VM de destino são adicionados durante a implementação. Um valor mais elevado redimensiona o pool mais rapidamente, mas consome mais computação e quota de IP; Um valor mais baixo é mais lento, mas menos disruptivo. O padrão do AKS é 1, e 33% é recomendado para pools de nós de produção.
  • Tempo limite para drenagem do nó (--drain-timeout): Quanto tempo o AKS espera pela remoção dos pods em cada nó antigo antes de o eliminar forçadamente. O padrão é 30 minutos. Combine isto com orçamentos PodDisruption adequados para que as cargas de trabalho possam drenar em segurança.
  • Tempo de estabilização do nó (--node-soak-duration): Quanto tempo o AKS espera depois de um novo nó estar no estado Ready antes de avançar para o lote seguinte. Útil para permitir que as cargas de trabalho se estabilizem no novo tamanho da VM antes de continuarem a implementação.

Como o redimensionamento reutiliza o pipeline de atualização, aplicam-se os mesmos pré-requisitos: garantir que a sua subscrição tem capacidade suficiente de substituição do tamanho alvo da VM e IPs de sub-redes disponíveis para os nós surge, e que os seus PodDisruptionBudgets permitem que pelo menos uma réplica seja despejada de cada vez, caso contrário o redimensionamento pode ser bloqueado durante a drenagem. Para recomendações completas, consulte Boas práticas para a atualização dos conjuntos de nós do AKS.

Pré-requisitos

Redimensione o pool de nós

Utilize o comando az aks nodepool update com o parâmetro --node-vm-size para alterar o tamanho da VM de um conjunto 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 não suportadas

O fornecedor de recursos AKS valida o pedido de redimensionamento e bloqueia alterações incompatíveis de tamanho da VM. As seguintes alterações não são suportadas como parte de uma redimensionação VMSS no local:

  • Alterar o tipo de controlador de disco (por exemplo, SCSI para NVMe).
  • Mudar a arquitetura do CPU (por exemplo, x64 para ARM64).
  • Alterar o suporte de computação confidencial (por exemplo, ativar ou desativar o SNP).
  • Alterar a geração do hipervisor (por exemplo, V1 para V2).
  • Combinar o redimensionamento com uma atualização de versão do Kubernetes ou uma alteração no número de nós na mesma operação.

Se o tamanho de VM pretendido exigir alguma das alterações acima, utilize, em alternativa, o fluxo de trabalho manual de cordon-and-drain descrito nas secções seguintes.

Nota

O redimensionamento no local requer capacidade adicional temporária para aprovisionar novos nós com o tamanho de VM pretendido antes de esvaziar os antigos. Se o pool de nós estiver configurado com --max-surge 0 (isto é, --max-unavailable estiver em vigor), o pedido de redimensionamento é rejeitado com um 400 Bad Request. Para avançar, 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, restaurar os seus valores originais --max-surge e --max-unavailable após a conclusão do redimensionamento.

Crie um novo pool de nós com a SKU desejada

Nota

Cada cluster AKS precisa ter pelo menos um pool de nós do sistema, incluindo pelo menos um nó. Neste exemplo, usamos um --mode de System para adicionar um pool de nós do sistema como substituto para 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, certifique-se de considerar todos os requisitos de carga de trabalho, como zonas de disponibilidade, e configure seu pool de nós VMSS de acordo. Talvez seja necessário modificar o comando a seguir para melhor atender às suas necessidades. Para obter uma lista completa das opções de configuração, consulte a az aks nodepool add página de referência.

  1. Crie um novo pool de nós usando o az aks nodepool add comando. Neste exemplo, criamos um novo pool de nós, mynodepool, com três nós e a Standard_DS3_v2 SKU da VM para substituir um pool de nós existente, nodepool1, que 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
    

    Demora alguns minutos até 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 à saída de exemplo a seguir, 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
    

Isolar os nós existentes

Cordoning marca nós especificados como não escalonáveis e impede que mais pods sejam adicionados aos nós.

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

    kubectl get nodes
    

    Sua saída deve ser semelhante ao seguinte exemplo, mostrando os nós no conjunto 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. Corde 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
    

Drene os nós existentes

Importante

Para drenar com êxito os nós e remover os pods em execução, certifique-se de que os PodDisruptionBudgets (PDBs) permitam que pelo menos uma réplica de pod seja realocada 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ê drena nós, os pods que correm sobre eles são removidos e recriados nos outros nós escalonáveis.

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

    Importante

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

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. Após o término da operação de drenagem, todos os pods (excluindo os pods controlados por conjuntos de daemons) devem ser executados no novo pool de nós. Você pode verificar isso usando o kubectl get pods comando.

    kubectl get pods -o wide -A
    

Solucionar problemas de remoção de pods

Você pode encontrar o seguinte erro ao drenar 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, o seu cluster tem orçamentos de interrupção de pods geridos 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 pode ser interrompido de cada vez. Enquanto um deles está sendo recriado e está indisponível, o outro coredns pod não pode ser removido devido ao orçamento de interrupção do pod. Esse problema se resolve depois que o pod inicial coredns é agendado e executado, permitindo que o segundo pod seja removido e recriado corretamente.

Sugestão

Considere drenar nós um a um para uma experiência de expulsão mais suave e para evitar o estrangulamento. Para obter mais informações, consulte:

Remover o pool de nós existente

Importante

Quando elimina um pool de nós, o AKS não executa cordonamento e drenagem. Para minimizar a interrupção do reagendamento de pods atualmente em execução no pool de nós que você planeja excluir, execute um cordão e drene todos os nós no pool de nós antes de excluir.

  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 seu cluster AKS tem apenas o novo node pool, com as aplicações e pods a funcionar corretamente, usando o comando kubectl get nodes.

    kubectl get nodes
    

    Sua saída deve ser semelhante à saída de exemplo a seguir, mostrando apenas o novo grupo 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óximos passos

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