Ändern der Größe von Knotenpools in Azure Kubernetes Service (AKS)
Aufgrund einer zunehmenden Anzahl von Bereitstellungen oder größeren Workloads müssen Sie möglicherweise den Plan für die VM-Skalierungsgruppe ändern oder die Größe von AKS-Instanzen ändern. Gemäß den Supportrichtlinien für AKS gilt jedoch Folgendes:
AKS-Agentknoten werden im Azure Portal als reguläre Azure IaaS-Ressourcen angezeigt. Diese virtuellen Computer werden jedoch in einer benutzerdefinierten Azure-Ressourcengruppe bereitgestellt (in der Regel mit dem Präfix MC_*). Mit den IaaS-APIs oder -Ressourcen können Sie keine direkten Anpassungen an diesen Knoten vornehmen. Benutzerdefinierte Änderungen, die nicht über die AKS-API erfolgen, werden nicht beibehalten, wenn Upgrades, Skalierungen, Updates oder Neustarts durchgeführt werden.
Diese fehlende Persistenz gilt auch für den Größenänderungsvorgang. Daher wird die Größenänderung von AKS-Instanzen auf diese Weise nicht unterstützt. In dieser Anleitung lernen Sie die empfohlene Methode für dieses Szenario kennen.
Wichtig
Diese Methode gilt speziell für AKS-Cluster, die auf VM-Skalierungsgruppen basieren. Bei Verwendung von VM-Verfügbarkeitsgruppen gilt eine Einschränkung auf nur einen Knotenpool pro Cluster.
Beispielressourcen
Angenommen, Sie möchten die Größe eines vorhandenen Knotenpools namens nodepool1
von der SKU-Größe Standard_DS2_v2 in Standard_DS3_v2 ändern. Um diese Aufgabe auszuführen, müssen Sie einen neuen Knotenpool mit „Standard_DS3_v2“ erstellen, die Workloads von nodepool1
in den neuen Knotenpool verschieben und nodepool1
entfernen. In diesem Beispiel erhält dieser neue Knotenpool den Namen 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>
Erstellen eines neuen Knotenpools mit der gewünschten SKU
Verwenden Sie den Befehl az aks nodepool add, um mithilfe der VM-SKU Standard_DS3_v2
einen neuen Knotenpool namens mynodepool
mit drei Knoten zu erstellen:
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
Hinweis
Jeder AKS-Cluster muss mindestens einen Systemknotenpool mit mindestens einem Knoten enthalten. Im obigen Beispiel verwenden Sie einen --mode
vom Typ System
, da davon ausgegangen wird, dass der Cluster nur über einen Knotenpool verfügt. Daher ist als Ersatz ein System
-Knotenpool erforderlich. Der Modus eines Knotenpools kann jederzeit aktualisiert werden.
Berücksichtigen Sie beim Ändern der Größe unbedingt auch andere Anforderungen, und konfigurieren Sie Ihren Knotenpool entsprechend. Möglicherweise müssen Sie den obigen Befehl modifizieren. Eine vollständige Liste der Konfigurationsoptionen finden Sie auf der Referenzseite zum Befehl az aks nodepool add.
Nach einigen Minuten wird der neue Knotenpool erstellt:
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
Absperren der vorhandenen Knoten
Durch das Absperren werden bestimmte Knoten als nicht planbar markiert. Dadurch wird verhindert, dass den Knoten weitere Pods hinzugefügt werden.
Rufen Sie zunächst mit dem Befehl kubectl get nodes
die Namen der Knoten ab, die Sie absperren möchten. Ihre Ausgabe sollte in etwa wie folgt aussehen:
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
Geben Sie als Nächstes mithilfe von kubectl cordon <node-names>
die gewünschten Knoten in einer durch Leerzeichen getrennten Liste an:
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
Entleeren der vorhandenen Knoten
Wichtig
Um Knoten erfolgreich auszugleichen und ausgeführte Pods zu entfernen, stellen Sie sicher, dass für alle PodDisruptionBudgets (PDB) jeweils die Verschiebung von mindestens einem Podreplikat gleichzeitig zulässig ist. Andernfalls schlägt der Ausgleichs-/Löschvorgang fehl. Um dies zu überprüfen, können Sie kubectl get pdb -A
ausführen und sicherstellen, dass ALLOWED DISRUPTIONS
mindestens 1 oder größer ist.
Das Entleeren von Knoten führt dazu, dass Pods, die darauf ausgeführt werden, entfernt und auf den anderen, planbaren Knoten neu erstellt werden.
Verwenden Sie zum Entleeren von Knoten den Befehl kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data
, indem Sie erneut eine durch Leerzeichen getrennte Liste von Knotennamen verwenden:
Wichtig
Die Verwendung von --delete-emptydir-data
ist erforderlich, um den von AKS erstellten coredns
und die metrics-server
-Pods zu entfernen. Wird dieses Flag nicht verwendet, wird ein Fehler erwartet. Weitere Informationen finden Sie in der Dokumentation zu „emptydir“.
kubectl drain aks-nodepool1-31721111-vmss000000 aks-nodepool1-31721111-vmss000001 aks-nodepool1-31721111-vmss000002 --ignore-daemonsets --delete-emptydir-data
Nach Abschluss des Entleerungsvorgangs werden alle Pods, die nicht durch DaemonSets gesteuert werden, im neuen Knotenpool ausgeführt:
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>
Problembehandlung
Möglicherweise erhalten Sie etwa folgende Fehlermeldung:
Fehler beim Entfernen von Pods/[podname] -n [namespace] (neuer Versuch nach 5 s): Pods können nicht entfernt werden, da dies gegen das Budget für die Unterbrechung des Pods verstoßen würde.
Standardmäßig verfügt Ihr Cluster über von AKS verwaltete Budgets für die Unterbrechung von Pods (z. B. coredns-pdb
oder konnectivity-agent
) mit einem MinAvailable
-Wert von 1. Wenn beispielsweise zwei coredns
-Pods ausgeführt werden und ein Pod neu erstellt wird und nicht verfügbar ist, bleibt der andere Pod aufgrund des Budgets für die Unterbrechung von Pods unberührt. Dieser Zustand löst sich von selbst, wenn der erste coredns
-Pod geplant und ausgeführt wird, sodass der zweite Pod ordnungsgemäß entfernt und neu erstellt werden kann.
Tipp
Erwägen Sie, Knoten einzeln nacheinander zu entleeren, um einen reibungsloseren Entfernungsvorgang zu gewährleisten und eine Drosselung zu vermeiden. Weitere Informationen finden Sie unter
Entfernen des vorhandenen Knotenpools
Verwenden Sie zum Löschen des vorhandenen Knotenpools das Azure-Portal oder den Befehl az aks nodepool delete:
az aks nodepool delete \
--resource-group myResourceGroup \
--cluster-name myAKSCluster \
--name nodepool1
Als Endergebnis nach Abschluss des Vorgangs verfügt der AKS-Cluster über einen einzelnen neuen Knotenpool mit der neuen gewünschten SKU-Größe, und alle Anwendungen und Pods werden ordnungsgemäß ausgeführt:
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
Nächste Schritte
Nachdem Sie die Größe eines Knotenpools durch Sperren und Entleeren geändert haben, erfahren Sie mehr über die Verwendung mehrerer Knotenpools.
Azure Kubernetes Service