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

Możesz zmienić rozmiar maszyn wirtualnych, aby uwzględnić rosnącą liczbę wdrożeń lub uruchomić większe obciążenie. Zmiana rozmiaru wystąpień usługi AKS bezpośrednio nie jest obsługiwana w przypadku korzystania z zestawów skalowania maszyn wirtualnych w usłudze AKS, jak opisano w zasadach 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 wprowadzać 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 za pośrednictwem uaktualnienia, skalowania, aktualizacji ani ponownego uruchamiania.

W tym artykule przedstawiono zalecaną metodę zmiany rozmiaru puli węzłów przez utworzenie nowej puli węzłów o żądanym rozmiarze jednostki SKU, kordonowaniu i opróżnieniu istniejących węzłów, a następnie usunięciu istniejącej puli węzłów.

Ważne

Ta metoda jest specyficzna dla klastrów AKS opartych na Zestawach Skalowania Maszyn Wirtualnych. W przypadku korzystania z pul węzłów opartych na maszynach wirtualnych można łatwo zaktualizować rozmiary maszyn wirtualnych w istniejącej puli węzłów przy użyciu jednego polecenia interfejsu wiersza polecenia platformy Azure i mieć wiele rozmiarów maszyn wirtualnych w tej samej puli węzłów. Aby uzyskać więcej informacji, zobacz dokumentację pul zasobów maszyn wirtualnych.

Zmiana rozmiaru puli węzłów VMSS na miejscu (wersja zapoznawcza)

Ważne

Funkcje usługi AKS w wersji zapoznawczej są dostępne na zasadzie samoobsługi i wymagają zapisania się. Wersje zapoznawcze są udostępniane w wersji "as is" i "jako dostępne" i są wykluczone z umów dotyczących poziomu usług i ograniczonej gwarancji. Wersje zapoznawcze usługi AKS są częściowo objęte pomocą techniczną dla klientów, świadczoną w miarę możliwości. W związku z tym te funkcje nie są przeznaczone do użytku produkcyjnego. Aby uzyskać więcej informacji, zobacz następujące artykuły pomocy technicznej:

Teraz możesz zmienić rozmiar maszyny wirtualnej (SKU) istniejącej puli węzłów opartej na zestawie skalowania maszyn wirtualnych (VMSS) za pomocą jednego polecenia przy użyciu az aks nodepool update --node-vm-size <new-size>. Po zainicjowaniu tej aktualizacji dostawca zasobów usługi AKS przeprowadza aktualizację stopniową w następujący sposób:

  1. Dynamiczne zwiększanie liczby nowych węzłów do docelowego rozmiaru maszyny wirtualnej.
  2. Kordonowanie i opróżnianie starych węzłów.
  3. Usuwanie starych węzłów.

Pozwala to uniknąć ręcznego przepływu pracy tworzenia/opróżniania/usuwania kordonu opisanego w pozostałej części tego artykułu.

Jak działa wdrażanie funkcji zmiany rozmiaru

Proces zmiany rozmiaru wykorzystuje ten sam mechanizm aktualizacji kroczącej co aktualizacja obrazu węzła i aktualizacja wersji Kubernetes, dlatego uwzględnia następujące ustawienia dotyczące aktualizacji, już skonfigurowane w puli węzłów. W szczególności zmiana rozmiaru uwzględnia następujące elementy:

  • Maksymalny wzrost (--max-surge): określa liczbę dodatkowych węzłów z docelowym rozmiarem maszyny wirtualnej podczas wdrażania. Większa wartość zmienia rozmiar puli szybciej, ale zużywa więcej zasobów obliczeniowych i limitu przydziału adresów IP; niższa wartość jest wolniejsza, ale mniej destrukcyjna. Wartość domyślna usługi AKS to 1, i 33% jest zalecana w przypadku pul węzłów produkcyjnych.
  • Limit czasu opróżniania węzła (--drain-timeout): jak długo AKS czeka na eksmisję zasobnika na każdym starym węźle, zanim wymusi jego usunięcie. Wartość domyślna to 30 minut. Połącz to z odpowiednimi PodDisruptionBudgets, aby obciążenia mogły być bezpiecznie opróżniane.
  • Czas stabilizacji węzła (--node-soak-duration): jak długo usługa AKS czeka od momentu, gdy nowy węzeł stanie się gotowy, zanim przejdzie do kolejnej partii. Przydatne do umożliwienia stabilizacji obciążeń na nowym rozmiarze maszyny wirtualnej przed kontynuowaniem wdrażania.

Ponieważ zmiana rozmiaru ponownie wykorzystuje proces uaktualniania, obowiązują te same wymagania wstępne: upewnij się, że Twoja subskrypcja ma wystarczającą dostępną pojemność dla docelowego rozmiaru maszyny wirtualnej oraz dostępne adresy IP w podsieci dla węzłów nadmiarowych, a także że ustawienia PodDisruptionBudget pozwalają na usunięcie co najmniej jednej repliki naraz, w przeciwnym razie zmiana rozmiaru może zostać zablokowana podczas opróżniania węzła. Aby uzyskać kompleksowe zalecenia, zobacz Best practices for AKS node pool upgrades (Najlepsze rozwiązania dotyczące uaktualnień puli węzłów usługi AKS).

Prerequisites

Zmienianie rozmiaru puli węzłów

Użyj polecenia az aks nodepool update z parametrem --node-vm-size, aby zmienić rozmiar maszyny wirtualnej istniejącej puli węzłów opartej na zestawie skalowania maszyn wirtualnych:

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3

Walidacja i nieobsługiwane kombinacje

Dostawca zasobów usługi AKS weryfikuje żądanie zmiany rozmiaru i blokuje niezgodne zmiany rozmiaru maszyny wirtualnej. Następujące zmiany są nieobsługiwane podczas zmiany rozmiaru w miejscu zestawu skalowania maszyn wirtualnych (VMSS):

  • Zmiana typu kontrolera dysku (na przykład SCSI na NVMe).
  • Zmiana architektury procesora CPU (na przykład x64 na ARM64).
  • Zmiana ustawień obsługi poufnego przetwarzania (na przykład włączanie lub wyłączanie SNP).
  • Zmiana generacji hiperwizora (na przykład z V1 na V2).
  • Połączenie zmiany rozmiaru z uaktualnieniem wersji platformy Kubernetes lub zmianą liczby węzłów w tej samej operacji.

Jeśli docelowy rozmiar maszyny wirtualnej wymaga jakichkolwiek powyższych zmian, użyj ręcznego przepływu pracy cordon-and-drain opisanego w poniższych sekcjach.

Uwaga

Zmiana rozmiaru w miejscu wymaga dodatkowej nadmiarowej pojemności, aby utworzyć nowe węzły w docelowym rozmiarze maszyny wirtualnej przed opróżnieniem starych węzłów. Jeśli dla puli węzłów skonfigurowano --max-surge 0 (to znaczy, że obowiązuje ustawienie --max-unavailable), żądanie zmiany rozmiaru zostanie odrzucone, a zwrócony zostanie kod 400 Bad Request. Aby kontynuować, ustaw --max-surge na co najmniej 1 podczas zmiany rozmiaru przy użyciu

az aks nodepool update \
    --resource-group MyResourceGroup \
    --cluster-name MyManagedCluster \
    --name nodepool1 \
    --node-vm-size Standard_D4s_v3 \
    --max-surge 33%

i opcjonalnie przywróć oryginalne wartości --max-surge i --max-unavailable po zakończeniu zmiany rozmiaru.

Utwórz nową pulę węzłów z wybranym SKU

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 tym przykładzie użyjemy elementu --modeSystem do dodania puli węzłów systemowych i zastąpienia puli węzłów systemowych, którą chcemy zmienić rozmiar. Tryb puli węzłów można zaktualizować w dowolnym momencie. Możesz również dodać pulę węzłów użytkownika, ustawiając --mode na User.

Podczas skalowania upewnij się, że uwzględnisz wszystkie wymagania związane z obciążeniem, takie jak strefy dostępności, i prawidłowo skonfiguruj pulę węzłów zestawu skalowania maszyn wirtualnych. Może być konieczne zmodyfikowanie następującego polecenia, aby najlepiej dopasować je do Twoich potrzeb. Aby uzyskać pełną listę opcji konfiguracji, zobacz stronę referencyjną az aks nodepool add .

  1. Utwórz nową pulę węzłów przy użyciu az aks nodepool add polecenia . W tym przykładzie utworzymy nową pulę węzłów z mynodepooltrzema węzłami i Standard_DS3_v2 jednostką SKU maszyny wirtualnej, aby zastąpić istniejącą pulę węzłów , nodepool1która ma Standard_DS2_v2 jednostkę 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
    

    Utworzenie nowej puli węzłów trwa kilka minut.

  2. Uzyskaj stan nowej puli węzłów przy użyciu kubectl get nodes polecenia.

    kubectl get nodes
    

    Dane wyjściowe powinny przypominać następujący przykład, pokazując zarówno nową pulę węzłów mynodepool, jak i istniejącą pulę węzłów nodepool1.

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

Odizoluj istniejące węzły

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

  1. Pobierz nazwy węzłów, które chcesz połączyć za pomocą kubectl get nodes polecenia .

    kubectl get nodes
    

    Dane wyjściowe powinny przypominać przykładowe dane wyjściowe z węzłami w istniejącej puli węzłów nodepool1, które chcesz odizolować:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. Cordon istniejące węzły przy użyciu polecenia kubectl cordon, określając żądane węzły w postaci listy rozdzielanej spacjami. Przykład:

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    Twój wynik powinien przypominać następujący przykład wyniku, pokazujący, że węzły są odizolowane:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-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 kończy się niepowodzeniem. Aby to sprawdzić, możesz uruchomić kubectl get pdb -A polecenie i sprawdzić, czy ALLOWED DISRUPTIONS wartość jest co najmniej 1 wyższa.

Przy opróżnianiu węzłów, uruchomione na nich pody są usuwane i odtwarzane na innych węzłach dostępnych do harmonogramowania.

  1. Opróżnij istniejące węzły za pomocą polecenia kubectl drain z flagami --ignore-daemonsets i --delete-emptydir-data, określając żądane węzły na liście oddzielonej spacjami. Przykład:

    Ważne

    Użycie --delete-emptydir-data jest wymagane, aby usunąć utworzone przez AKS zasobniki coredns i metrics-server. Jeśli nie używasz tej flagi, zostanie wyświetlony błąd. Aby uzyskać więcej informacji, zobacz dokumentację dotyczącą emptydir.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. Po zakończeniu operacji opróżniania wszystkie zasobniki (z wyłączeniem zasobników kontrolowanych przez zestawy demonów) powinny być uruchomione w nowej puli węzłów. Możesz to sprawdzić za pomocą kubectl get pods polecenia .

    kubectl get pods -o wide -A
    

Rozwiązywanie problemów z usuwaniem podów

Podczas opróżniania węzłów może wystąpić następujący błąd:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

Domyślnie klaster ma budżety zakłóceń podów zarządzane przez usługę AKS (na przykład coredns-pdb lub konnectivity-agent) z wartością MinAvailable1. Na przykład, jeśli uruchomione są dwa coredns pody, w danym momencie może być zakłócony tylko jeden z nich. Podczas gdy jeden z nich jest odtwarzany i jest niedostępny, drugi coredns pod nie może być eksmitowany z powodu budżetu zakłóceń poda. Ten problem rozwiązuje się po zaplanowaniu i uruchomieniu początkowego coredns zasobnika, co pozwala na prawidłowe usunięcie i ponowne utworzenie drugiego zasobnika.

Napiwek

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

Usuwanie istniejącej puli węzłów

Ważne

Gdy usuniesz pulę węzłów, AKS nie wykonuje procedur cordon i drain. Aby zminimalizować zakłócenia ponownego uruchamiania zasobników aktualnie uruchomionych w puli węzłów, którą planujesz usunąć, przed usunięciem wykonaj kordon i opróżnij wszystkie węzły w puli węzłów.

  1. Usuń oryginalną pulę węzłów przy użyciu polecenia az aks nodepool delete.

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Sprawdź, czy klaster usługi AKS ma tylko nową pulę węzłów z poprawnie uruchomionymi aplikacjami i zasobnikami przy użyciu polecenia kubectl get nodes.

    kubectl get nodes
    

    Dane wyjściowe powinny przypominać następujące przykładowe dane wyjściowe, pokazujące tylko nową pulę węzłów mynodepool.

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-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.