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
.
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:
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 DISRUPTIONS
que 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:
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.
Azure Kubernetes Service