Compartilhar via


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

Devido a um aumento no número de implantações ou para executar uma carga de trabalho maior, é útil alterar o plano do conjunto de dimensionamento de máquinas virtuais ou redimensionar as instâncias do AKS. No entanto, de acordo com as 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_*). Não é possível alterar as personalizações diretas nesses nós usando os recursos ou as APIs de IaaS. Todas as alterações personalizadas que não forem feitas por meio da API do AKS não serão persistidas por uma atualização, uma escala, uma atualização ou uma reinicialização.

Essa falta de persistência também se aplica à operação de redimensionamento, ou seja, não há suporte para o redimensionamento de instâncias do AKS dessa maneira. Neste guia de instruções, você conhecerá o método recomendado para resolver esse cenário.

Importante

Esse método é específico para clusters do AKS baseado em conjuntos de dimensionamento de máquinas virtuais. Ao usar conjuntos de disponibilidade de máquinas virtuais, você estará limitado a apenas um pool de nós por cluster.

Exemplos de recursos

Suponha que você queira redimensionar um pool de nós existente, chamado nodepool1, do tamanho de SKU Standard_DS2_v2 para Standard_DS3_v2. Para realizar essa tarefa, você precisará criar um pool de nós usando o Standard_DS3_v2, mover as cargas de trabalho do nodepool1 para o novo pool de nós e remover nodepool1. Neste exemplo, chamaremos esse novo pool de nós de mynodepool.

Captura de tela da página do cluster no portal do Azure, com o acesso aos pools de configurações > nós. Um pool de nós, chamado “pool de nós 1”, é mostrado.

kubectl get nodes

NAME                                STATUS   ROLES   AGE   VERSION
aks-nodepool1-31721111-vmss000000   Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000001   Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000002   Ready    agent   10d   v1.21.9
kubectl get pods -o wide -A

NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE                                NOMINATED NODE   READINESS GATES
default       sampleapp2-74b4b974ff-676sz           1/1     Running   0          93m     10.244.1.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
default       sampleapp2-76b6c4c59b-pfgbh           1/1     Running   0          94m     10.244.1.5   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-4n66k             1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-9p4c8             1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   azure-ip-masq-agent-nb7mx             1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   coredns-845757d86-dtvvs               1/1     Running   0          10d     10.244.0.2   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   coredns-845757d86-x27pp               1/1     Running   0          10d     10.244.2.3   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   coredns-autoscaler-5f85dc856b-nfrmh   1/1     Running   0          10d     10.244.2.4   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-9nfzt              3/3     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-bblsb              3/3     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-tjhj4              3/3     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-9pcr8              3/3     Running   0          3d10h   10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-bh2pc              3/3     Running   0          3d10h   10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   csi-azurefile-node-h75gq              3/3     Running   0          3d10h   10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-ngdlb   1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-rvvqt   1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   kube-proxy-4wzx7                      1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000   <none>           <none>
kube-system   kube-proxy-g5tvr                      1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002   <none>           <none>
kube-system   kube-proxy-mrv54                      1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001   <none>           <none>
kube-system   metrics-server-774f99dbf4-h52hn       1/1     Running   1          3d10h   10.244.1.3   aks-nodepool1-31721111-vmss000002   <none>           <none>

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

Ao fazer o redimensionamento, considere todos os requisitos de carga de trabalho, como zonas de disponibilidade, e configure o pool de nós de acordo. 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.

Use o comando az aks nodepool add para criar um pool de nós chamado mynodepool com três nós usando o SKU da VM Standard_DS3_v2:

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

Observação

Cada cluster do AKS precisa conter pelo menos um pool de nós do sistema com no mínimo um nó. No exemplo abaixo, estamos usando um --mode de System, pois considera-se que o cluster tem apenas um pool de nós, o que exige um pool de nós System para substituí-lo. O modo de um pool de nós pode ser atualizado a qualquer momento.

Após alguns minutos, o pool de nós será criado:

Captura de tela da página do cluster no portal do Azure, com o acesso aos pools de configurações > nós. Dois pools de nós, chamados “pool de nós 1” e “meu pool de nós”, são mostrados.

kubectl get nodes

NAME                                 STATUS   ROLES   AGE   VERSION
aks-mynodepool-20823458-vmss000000   Ready    agent   23m   v1.21.9
aks-mynodepool-20823458-vmss000001   Ready    agent   23m   v1.21.9
aks-mynodepool-20823458-vmss000002   Ready    agent   23m   v1.21.9
aks-nodepool1-31721111-vmss000000    Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-vmss000001    Ready    agent   10d   v1.21.9
aks-nodepool1-31721111-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.

Primeiro, obtenha os nomes dos nós que você gostaria de isolar com kubectl get nodes. A saída deve ser semelhante ao seguinte:

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-31721111-vmss000000   Ready    agent   7d21h   v1.21.9
aks-nodepool1-31721111-vmss000001   Ready    agent   7d21h   v1.21.9
aks-nodepool1-31721111-vmss000002   Ready    agent   7d21h   v1.21.9

Em seguida, usando kubectl cordon <node-names>, especifique os nós desejados em uma lista separada por espaços:

kubectl cordon aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002
node/aks-nodepool1-31721111-vmss000000 cordoned
node/aks-nodepool1-31721111-vmss000001 cordoned
node/aks-nodepool1-31721111-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 esvaziamento/remoção falhará. Para verificar isso, você pode executar kubectl get pdb -A e verificar ALLOWED DISRUPTIONSque seja, pelo menos, um ou maior.

O esvaziamento de nós fará com que os pods em execução sejam removidos e recriados em outros nós agendáveis.

Para esvaziar os nós, use kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data novamente com uma lista de nomes de nós separada por espaços:

Importante

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

kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data

Após a conclusão da operação de esvaziamento, todos os outros pods que não sejam controlados pelos conjuntos de daemon serão executados no novo pool de nós:

kubectl get pods -o wide -A

NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE     IP           NODE                                 NOMINATED NODE   READINESS GATES
default       sampleapp2-74b4b974ff-676sz           1/1     Running   0          15m     10.244.4.5   aks-mynodepool-20823458-vmss000002   <none>           <none>
default       sampleapp2-76b6c4c59b-rhmzq           1/1     Running   0          16m     10.244.4.3   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-4n66k             1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   azure-ip-masq-agent-9p4c8             1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   azure-ip-masq-agent-nb7mx             1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   azure-ip-masq-agent-sxn96             1/1     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   azure-ip-masq-agent-tsq98             1/1     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   azure-ip-masq-agent-xzrdl             1/1     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   coredns-845757d86-d2pkc               1/1     Running   0          17m     10.244.3.2   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   coredns-845757d86-f8g9s               1/1     Running   0          17m     10.244.5.2   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   coredns-autoscaler-5f85dc856b-f8xh2   1/1     Running   0          17m     10.244.4.2   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azuredisk-node-7md2w              3/3     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   csi-azuredisk-node-9nfzt              3/3     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   csi-azuredisk-node-bblsb              3/3     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   csi-azuredisk-node-lcmtz              3/3     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azuredisk-node-mmncr              3/3     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   csi-azuredisk-node-tjhj4              3/3     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   csi-azurefile-node-29w6z              3/3     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   csi-azurefile-node-4nrx7              3/3     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   csi-azurefile-node-9pcr8              3/3     Running   0          3d11h   10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   csi-azurefile-node-bh2pc              3/3     Running   0          3d11h   10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   csi-azurefile-node-gqqnv              3/3     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   csi-azurefile-node-h75gq              3/3     Running   0          3d11h   10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-2bbp5   1/1     Running   0          17m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   konnectivity-agent-6cd55c69cf-7xzxj   1/1     Running   0          16m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   kube-proxy-4wzx7                      1/1     Running   0          10d     10.240.0.4   aks-nodepool1-31721111-vmss000000    <none>           <none>
kube-system   kube-proxy-7h8r5                      1/1     Running   0          49m     10.240.0.7   aks-mynodepool-20823458-vmss000000   <none>           <none>
kube-system   kube-proxy-g5tvr                      1/1     Running   0          10d     10.240.0.6   aks-nodepool1-31721111-vmss000002    <none>           <none>
kube-system   kube-proxy-mrv54                      1/1     Running   0          10d     10.240.0.5   aks-nodepool1-31721111-vmss000001    <none>           <none>
kube-system   kube-proxy-nqmnj                      1/1     Running   0          49m     10.240.0.9   aks-mynodepool-20823458-vmss000002   <none>           <none>
kube-system   kube-proxy-zn77s                      1/1     Running   0          49m     10.240.0.8   aks-mynodepool-20823458-vmss000001   <none>           <none>
kube-system   metrics-server-774f99dbf4-2x6x8       1/1     Running   0          16m     10.244.4.4   aks-mynodepool-20823458-vmss000002   <none>           <none>

Solução de problemas

Você poderá receber um erro como o seguinte:

Erro ao remover pods/[nomedopod]-n [namespace] (nova tentativa após 5s): não é possível remover o pod, pois isso violará o orçamento de interrupção de pod.

Por padrão, o cluster tem orçamentos de interrupção de pod AKS_managed (como coredns-pdb ou konnectivity-agent) com um MinAvailable de 1. Se, por exemplo, houver dois pods coredns em execução, enquanto um deles estiver sendo recriado e não estiver disponível, o outro não poderá ser afetado devido ao orçamento de interrupção de pod. Isso se resolve por conta própria depois que o pod inicial coredns é agendado e executado, permitindo que o segundo pod seja removido e recriado corretamente.

Dica

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

Remover o pool de nós existente

Para excluir o pool de nós existente, use o portal do Azure ou o comando az aks nodepool delete:

az aks nodepool delete \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1

Após a conclusão, o resultado final será o cluster do AKS com um só pool de nós novo, com o tamanho de SKU novo e desejado e todos os aplicativos e os pods em execução:

Captura de tela da página do cluster no portal do Azure, com o acesso aos pools de configurações > nós. Um pool de nós, chamado “meu pool de nós”, é mostrado.

kubectl get nodes

NAME                                 STATUS   ROLES   AGE   VERSION
aks-mynodepool-20823458-vmss000000   Ready    agent   63m   v1.21.9
aks-mynodepool-20823458-vmss000001   Ready    agent   63m   v1.21.9
aks-mynodepool-20823458-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.