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 Azure Portal jako zwykłe zasoby usługi Azure IaaS. 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ń do tych węzłów 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 przez uaktualnienie, skalowanie, aktualizowanie ani ponowne uruchamianie.

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 usługi AKS opartych na zestawie skalowania maszyn wirtualnych. W przypadku korzystania z zestawów dostępności maszyn wirtualnych można ograniczyć tylko jedną pulę węzłów na klaster.

Przykładowe zasoby

Załóżmy, że chcesz zmienić rozmiar istniejącej puli węzłów o nazwie nodepool1, z 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 nowej puli węzłów i usunąć nodepool1. W tym przykładzie wywołamy tę nową pulę mynodepoolwęzłów .

Zrzut ekranu przedstawiający stronę Azure Portal klastra, przejdź do pozycji Ustawienia > Pule węzłów. Wyświetlana jest jedna pula węzłów o nazwie pula węzłów 1.

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 Standard_DS3_v2 węzłami przy użyciu 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 utworzono nową pulę węzłów:

Zrzut ekranu przedstawiający stronę Azure Portal klastra, przejdź do pozycji Ustawienia > Pule węzłów. Pokazano dwie pule węzłów o nazwie pula węzłów 1 i pulę węzłów.

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żyj 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 PodDisruptionBudgets (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 i sprawdzić, czy ALLOWED DISRUPTIONS jest co najmniej jeden lub wyższy.

Opróżnianie węzłów spowoduje, że zasobniki uruchomione na nich będą eksmitowane i ponownie tworzone na innych węzłach z możliwością schedulowalnego.

Aby opróżnić węzły, użyj ponownie polecenia kubectl drain <node-names> --ignore-daemonsets --delete-emptydir-data, używając rozdzielanej spacją 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 wystąpić błąd podobny do następującego:

Błąd podczas eksmitowania zasobników/[podname] -n [przestrzeń nazw] (ponawia próbę 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 są uruchomione dwa coredns zasobniki, podczas gdy jeden z nich jest odtwarzany i jest niedostępny, drugi nie może mieć wpływu z powodu budżetu zakłóceń zasobnika. Rozwiązuje to problem po zaplanowaniu i uruchomieniu początkowego coredns zasobnika, co pozwala na prawidłowe eksmitowanie i ponowne utworzenie drugiego zasobnika.

Porada

Rozważ opróżnienie węzłów jeden po jednym 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 polecenia Azure Portal lub az aks nodepool delete:

Ważne

Po usunięciu puli węzłów usługa AKS nie wykonuje cordonu i opróżniania. Aby zminimalizować zakłócenia związane z ponownym harmonogramem zasobników aktualnie uruchomionych w puli węzłów, które chcesz usunąć, przed usunięciem wykonaj kordon i opróżnij wszystkie węzły w puli węzłów.

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

Po zakończeniu końcowy wynik to klaster usługi AKS zawierający jedną, nową pulę węzłów z nowym, żądanym rozmiarem jednostki SKU oraz prawidłowo uruchomionymi wszystkimi aplikacjami i zasobnikami:

Zrzut ekranu przedstawiający stronę Azure Portal klastra, przejdź do pozycji Ustawienia > Pule węzłów. Wyświetlana jest jedna pula węzłów o nazwie moja pula węzłów.

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 cordoning i opróżnianie dowiedz się więcej o korzystaniu z wielu pul węzłów.