Zmienianie rozmiaru pul węzłów w usłudze Azure Kubernetes Service (AKS)

W przypadku rosnącej liczby wdrożeń lub w celu uruchomienia większego obciążenia warto rozważyć zmianę planu zestawu skalowania maszyn wirtualnych lub zmianę rozmiaru wystąpień usługi AKS. Jednak zgodnie z zasadami pomocy technicznej dla usługi AKS:

Węzły agenta usługi AKS są wyświetlane w witrynie Azure Portal jako zwykłe zasoby IaaS platformy Azure. Jednak te maszyny wirtualne są wdrażane w niestandardowej grupie zasobów platformy Azure (zwykle poprzedzonej MC_*). Nie można wykonywać żadnych bezpośrednich dostosowań w tych węzłach przy użyciu interfejsów API IaaS lub zasobów. Wszelkie zmiany niestandardowe, które nie są wykonywane za pośrednictwem interfejsu API usługi AKS, nie będą utrwalane w ramach uaktualniania, skalowania, aktualizowania ani ponownego uruchamiania.

Ten brak trwałości dotyczy również operacji zmiany rozmiaru, dlatego zmiana rozmiaru wystąpień usługi AKS w ten sposób nie jest obsługiwana. W tym przewodniku z instrukcjami poznasz zalecaną metodę, aby rozwiązać ten scenariusz.

Ważne

Ta metoda jest specyficzna dla klastrów AKS opartych na zestawie skalowania maszyn wirtualnych. W przypadku korzystania z zestawów dostępności maszyn wirtualnych jest ograniczona tylko do jednej puli węzłów na klaster.

Przykładowe zasoby

Załóżmy, że chcesz zmienić rozmiar istniejącej puli węzłów o nazwie nodepool1z rozmiaru jednostki SKU Standard_DS2_v2 na Standard_DS3_v2. Aby wykonać to zadanie, należy utworzyć nową pulę węzłów przy użyciu Standard_DS3_v2, przenieść obciążenia z nodepool1 do nowej puli węzłów i usunąć nodepool1. W tym przykładzie wywołamy tę nową pulę mynodepoolwęzłów .

Screenshot of the Azure portal page for the cluster, navigated to Settings > Node pools. One node pool, named node pool 1, is shown.

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>

Tworzenie nowej puli węzłów przy użyciu żądanej jednostki SKU

Użyj polecenia az aks nodepool add, aby utworzyć nową pulę węzłów o nazwie mynodepool z trzema węzłami przy użyciu Standard_DS3_v2 jednostki SKU maszyny wirtualnej:

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

Uwaga

Każdy klaster usługi AKS musi zawierać co najmniej jedną pulę węzłów systemowych z co najmniej jednym węzłem. W powyższym przykładzie używamy elementu --modeSystem, ponieważ zakłada się, że klaster ma tylko jedną pulę System węzłów, co wymaga zastąpienia puli węzłów. Tryb puli węzłów można aktualizować w dowolnym momencie.

Podczas zmiany rozmiaru należy wziąć pod uwagę inne wymagania i odpowiednio skonfigurować pulę węzłów. Może być konieczne zmodyfikowanie powyższego polecenia. Aby uzyskać pełną listę opcji konfiguracji, zobacz stronę az aks nodepool add reference (Dodawanie puli węzłów az aks).

Po kilku minutach zostanie utworzona nowa pula węzłów:

Screenshot of the Azure portal page for the cluster, navigated to Settings > Node pools. Two node pools, named node pool 1 and my node pool are shown.

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

Cordon istniejących węzłów

Cordoning oznacza określone węzły jako nieplanowalne i uniemożliwia dodawanie kolejnych zasobników do węzłów.

Najpierw uzyskaj nazwy węzłów, które chcesz połączyć za pomocą polecenia kubectl get nodes. Dane wyjściowe powinny wyglądać podobnie do następujących:

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

Następnie, używając polecenia kubectl cordon <node-names>, określ żądane węzły na liście rozdzielanej spacjami:

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

Opróżnianie istniejących węzłów

Ważne

Aby pomyślnie opróżnić węzły i wykluczyć uruchomione zasobniki, upewnij się, że wszystkie zasobniki PodDisruptionBudget (PDB) zezwalają na przeniesienie co najmniej jednej repliki zasobnika naraz. W przeciwnym razie operacja opróżniania/eksmisji zakończy się niepowodzeniem. Aby to sprawdzić, możesz uruchomić kubectl get pdb -A polecenie i sprawdzić, czy ALLOWED DISRUPTIONS jest co najmniej jeden.

Opróżnianie węzłów spowoduje, że zasobniki będą na nich eksmitowane i ponownie tworzone na innych węzłach, które można schedulowalne.

Aby opróżnić węzły, ponownie użyj polecenia kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data, używając rozdzielanej spacjami listy nazw węzłów:

Ważne

Użycie --delete-emptydir-data jest wymagane do eksmisji utworzonych coredns i metrics-server zasobników usługi AKS. Jeśli ta flaga nie jest używana, oczekiwany jest błąd. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą emptydir.

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

Po zakończeniu operacji opróżniania wszystkie zasobniki inne niż te kontrolowane przez zestawy demonów są uruchomione w nowej puli węzłów:

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>

Rozwiązywanie problemów

Może zostać wyświetlony błąd podobny do następującego:

Błąd podczas eksmitowania zasobników/[podname] -n [przestrzeń nazw] (spróbuje ponownie po 5s): Nie można wykluczyć zasobnika, ponieważ naruszałoby to budżet zakłóceń zasobnika.

Domyślnie klaster ma AKS_managed budżety zakłóceń zasobników (na przykład coredns-pdb lub konnectivity-agent) z wartością MinAvailable 1. Jeśli na przykład istnieją dwa coredns zasobniki uruchomione, podczas gdy jeden z nich jest odtwarzany i jest niedostępny, drugi nie może mieć wpływu z powodu budżetu przerwy w działaniu zasobnika. To rozwiązuje się po zaplanowaniu i uruchomieniu początkowego coredns zasobnika, co umożliwia prawidłowe eksmitowanie i ponowne utworzenie drugiego zasobnika.

Napiwek

Rozważ opróżnianie węzłów jeden po drugim w celu zapewnienia bezproblemowego środowiska eksmisji i uniknięcia ograniczania przepustowości. Aby uzyskać więcej informacji, zobacz:

Usuwanie istniejącej puli węzłów

Aby usunąć istniejącą pulę węzłów, użyj witryny Azure Portal lub polecenia az aks nodepool delete :

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

Po zakończeniu ostatecznym wynikiem jest klaster usługi AKS z jedną, nową pulą węzłów z nowym, żądanym rozmiarem jednostki SKU oraz prawidłowym uruchamianiem wszystkich aplikacji i zasobników:

Screenshot of the Azure portal page for the cluster, navigated to Settings > Node pools. One node pool, named my node pool, is shown.

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

Następne kroki

Po zmianie rozmiaru puli węzłów przez kordonowanie i opróżnianie dowiedz się więcej o używaniu wielu pul węzłów.