Redimensionner des pools de nœuds dans Azure Kubernetes Service (AKS)
En raison d’un nombre croissant de déploiements ou de l’exécution d’une charge de travail plus importante, vous souhaiterez peut-être changer le plan du groupe de machines virtuelles identiques ou redimensionner les instances AKS. Toutefois, selon les stratégies de prise en charge pour AKS :
Les nœuds d’agent AKS sont affichés dans le portail Azure en tant que ressources Azure IaaS standard. Toutefois, ces machines virtuelles sont déployées dans un groupe de ressources Azure personnalisé (portant généralement le préfixe MC_*). Vous ne pouvez pas effectuer de personnalisations directes sur ces nœuds à l’aide des API ou des ressources IaaS. Les modifications personnalisées qui ne sont pas effectuées via l’API AKS ne sont pas conservées lors d’une mise à niveau, d’une mise à l’échelle, d’une mise à jour ou d’un redémarrage.
Ce manque de persistance s’applique également à l’opération de redimensionnement, donc le redimensionnement d’instances AKS n’est pas pris en charge. Dans ce guide pratique, vous allez apprendre la méthode recommandée pour traiter ce scénario.
Important
Cette méthode est spécifique aux clusters AKS basés sur un groupe de machines virtuelles identiques. Lorsque vous utilisez des groupes à haute disponibilité de machines virtuelles, vous êtes limité à un seul pool de nœuds par cluster.
Exemples de ressources
Présumons que vous souhaitiez redimensionner un pool de nœuds existant, appelé nodepool1
, de la taille de référence SKU Standard_DS2_v2 à Standard_DS3_v2. Pour accomplir cette tâche, vous devez créer un nouveau pool de nœuds avec Standard_DS3_v2, déplacer les charges de travail de nodepool1
vers le nouveau pool de nœuds et supprimer nodepool1
. Dans cet exemple, nous appellerons ce nouveau pool de nœuds 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>
Créer un pool de nœuds avec la référence SKU souhaitée
Lors du redimensionnement, veillez à prendre en compte toutes les exigences de charge de travail , telles que les zones de disponibilité, et à configurer votre pool de nœuds en conséquence. Il se peut que vous deviez modifier la commande suivante pour qu'elle réponde au mieux à vos besoins. Pour obtenir la liste complète des options de configuration, consultez la page de référence az aks nodepool add
.
Utilisez la commande az aks nodepool add
pour créer un pool de nœuds appelé mynodepool
avec trois nœuds à l’aide de la référence SKU de machine virtuelle 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
Remarque
Chaque cluster AKS doit contenir au moins un pool de nœuds système avec au moins un nœud. Dans l’exemple ci-dessus, nous utilisons un --mode
de System
, car le cluster est supposé avoir un seul pool de nœuds, ce qui nécessite un pool de nœuds System
pour le remplacer. Le mode d’un pool de nœuds peut être mis à jour à tout moment.
Après quelques minutes, le nouveau pool de nœuds est créé :
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
Isoler les nœuds existants
L’isolement marque les nœuds spécifiés comme non planifiables et empêche l’ajout d’autres pods aux nœuds.
Tout d’abord, obtenez les noms des nœuds que vous souhaitez isoler avec kubectl get nodes
. Votre résultat doit être semblable à ce qui suit :
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
Ensuite, à l’aide de kubectl cordon <node-names>
, spécifiez les nœuds souhaités dans une liste séparée par des espaces :
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
Drainer les nœuds existants
Important
Pour drainer correctement les nœuds et supprimer les pods en cours d’exécution, assurez-vous que chaque PodDisruptionBudgets (PDB) autorise le déplacement d’au moins 1 réplica de pod à la fois. Sinon, l’opération vidage/expulsion échouera. Pour ce faire, vous pouvez exécuter kubectl get pdb -A
et vérifier que ALLOWED DISRUPTIONS
est d’au moins 1 ou plus.
Le drainage des nœuds entraîne la suppression des pods qui s’y exécutent et leur recréation sur les autres nœuds planifiables.
Pour drainer les nœuds, utilisez kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data
en vous resservant d’une liste de noms de nœuds séparés par des espaces :
Important
L’utilisation de --delete-emptydir-data
est requise pour supprimer les pods coredns
et metrics-server
créés par AKS. Si cet indicateur n’est pas utilisé, une erreur est attendue. Pour plus d’informations, consultez la documentation sur emptydir.
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data
Une fois l’opération de drainage terminée, tous les pods autres que ceux contrôlés par les ensembles de démons s’exécutent sur le nouveau pool de nœuds :
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>
Résolution des problèmes
Vous verrez peut-être une erreur telle que la suivante :
Erreur lors de la suppression des pods/[nom des pods] -n [espace de noms] (nouvelle tentative dans 5s) : Impossible de supprimer le pod, car cette opération violerait le budget de perturbation de pod.
Par défaut, votre cluster dispose de budgets de perturbation de pod gérés par AKS (tels que coredns-pdb
ou konnectivity-agent
) avec un MinAvailable
de 1. Si, par exemple, il y a deux pods coredns
en cours d’exécution, si l’un d’entre eux est actuellement recréé et non disponible, l’autre ne peut pas être affecté en raison du budget de perturbation de pod. Cela se résout automatiquement après la planification et l’exécution du pod coredns
initial, ce qui permet au second pod d’être correctement supprimé et recréé.
Conseil
Envisagez de drainer les nœuds un par un pour une expérience de suppression plus fluide et pour éviter toute limitation. Pour plus d'informations, consultez les pages suivantes :
Supprimer le pool de nœuds existant
Pour supprimer le pool de nœuds existant, utilisez le Portail Microsoft Azure ou la commande az aks nodepool delete
:
az aks nodepool delete \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name nodepool1
Une fois l’opération terminée, le résultat final est le cluster AKS avec un seul nouveau pool de nœuds avec la nouvelle taille de SKU souhaitée et toutes les applications et tous les pods correctement exécutés :
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
Étapes suivantes
Après le redimensionnement d’un pool de nœuds par isolement et drainage, explorez plus en détail l’utilisation de plusieurs pools de nœuds.
Azure Kubernetes Service