Freigeben über


Ändern der Größe von Knotenpools in Azure Kubernetes Service (AKS)

Möglicherweise möchten Sie die Größe Ihrer virtuellen Computer (VMs) ändern, um eine steigende Anzahl von Bereitstellungen zu berücksichtigen oder eine größere Workload auszuführen. Das direkte Ändern der Größe von AKS-Instanzen wird bei Verwendung von Skalierungssätzen für virtuelle Computer in AKS nicht unterstützt, wie in den Supportrichtlinien für AKS beschrieben:

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_*). Sie können diese Knoten nicht direkt anpassen, indem Sie die IaaS-APIs oder -Ressourcen verwenden. Alle benutzerdefinierten Änderungen, die nicht über die AKS-API durchgeführt werden, werden nicht über ein Upgrade, eine Skalierung, ein Update oder einen Neustart beibehalten.

In diesem Artikel lernen Sie die empfohlene Methode zum Ändern der Größe eines Knotenpools kennen, indem Sie einen neuen Knotenpool mit der gewünschten SKU-Größe erstellen, die vorhandenen Knoten abkabeln und entwässern und dann den vorhandenen Knotenpool entfernen.

Wichtig

Diese Methode gilt speziell für AKS-Cluster, die auf Virtual Machine Scale Sets basieren. Wenn Sie virtuelle Computer-basierte Knotenpools verwenden, können Sie die VM-Größen in einem vorhandenen Knotenpool ganz einfach mit einem einzigen Azure CLI-Befehl aktualisieren und mehrere VM-Größen im selben Knotenpool haben. Weitere Informationen finden Sie in der Dokumentation zu Knotenpools für virtuelle Computer.

Erstellen eines neuen Knotenpools mit der gewünschten SKU

Hinweis

Jeder AKS-Cluster muss mindestens einen Systemknotenpool mit mindestens einem Knoten enthalten. In diesem Beispiel verwenden wir einen --mode von System, um einen Systemknotenpool hinzuzufügen, der den zu ändernden Systemknotenpool ersetzt. Sie können den Modus eines Knotenpools jederzeit aktualisieren . Sie können auch einen Benutzerknotenpool hinzufügen, indem Sie --mode auf User setzen.

Stellen Sie beim Ändern der Größe sicher, dass Sie alle Workloadanforderungen berücksichtigen, z. B. Verfügbarkeitszonen, und konfigurieren Sie den VMSS-Knotenpool entsprechend. Möglicherweise müssen Sie den folgenden Befehl so ändern, dass er Ihren Anforderungen am besten entspricht. Eine vollständige Liste der Konfigurationsoptionen finden Sie auf der Referenzseite zu az aks nodepool add.

  1. Erstellen Sie einen neuen Knotenpool mithilfe des az aks nodepool add Befehls. In diesem Beispiel erstellen wir einen neuen Knotenpool mit mynodepooldrei Knoten und der Standard_DS3_v2 VM-SKU, um einen vorhandenen Knotenpool zu ersetzen, nodepool1der über die Standard_DS2_v2 VM-SKU verfügt.

    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
    

    Es dauert ein paar Minuten, bis der neue Knotenpool erstellt wird.

  2. Rufen Sie den Status des neuen Knotenpools mithilfe des kubectl get nodes Befehls ab.

    kubectl get nodes
    

    Die Ausgabe sollte der folgenden Beispielausgabe ähneln und sowohl den neuen Knotenpool mynodepool als auch den vorhandenen Knotenpool nodepool1anzeigen:

    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
    

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.

  1. Rufen Sie die Namen der Knoten ab, die Sie mit dem kubectl get nodes Befehl abschotten möchten.

    kubectl get nodes
    

    Die Ausgabe sollte der folgenden Beispielausgabe ähneln, die die Knoten im vorhandenen Knotenpool nodepool1 anzeigt, die Sie sperren möchten.

    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. Sperren Sie die bestehenden Knoten mit dem Befehl kubectl cordon ab, und geben Sie die gewünschten Knoten in einer durch Leerzeichen getrennten Liste an. Beispiel:

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

    Die Ausgabe muss dem folgenden Beispielergebnis ähneln, das zeigt, dass die Knoten gesperrt sind.

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-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 Entwässerungs-/Auslassvorgang fehl. Um dies zu überprüfen, können Sie kubectl get pdb -A ausführen und überprüfen, ob ALLOWED DISRUPTIONS mindestens 1 oder höher 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.

  1. Entwässern Sie die vorhandenen Knoten mithilfe des kubectl drain Befehls und der --ignore-daemonsets--delete-emptydir-data Kennzeichnungen, und geben Sie die gewünschten Knoten in einer durch Leerzeichen getrennten Liste an. Beispiel:

    Wichtig

    Die Verwendung von --delete-emptydir-data ist erforderlich, um den von AKS erstellten coredns und die metrics-server-Pods zu entfernen. Wenn Sie dieses Flag nicht verwenden, wird eine Fehlermeldung angezeigt. Weitere Informationen finden Sie in der Dokumentation zu „emptydir“.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. Nach Abschluss des Abflussvorgangs sollten alle Pods (mit Ausnahme der Pods, die durch DaemonSets gesteuert werden) im neuen Knotenpool laufen. Sie können dies mithilfe des kubectl get pods-Befehls überprüfen.

    kubectl get pods -o wide -A
    

Problembehebung bei Pod-Entfernungsproblemen

Beim Entwässern von Knoten tritt möglicherweise der folgende Fehler auf:

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

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, kann jeweils nur einer unterbrochen werden. Während einer von ihnen neu erstellt wird und nicht verfügbar ist, kann der andere coredns-Pod aufgrund des Pod-Unterbrechungsbudgets nicht entfernt werden. Dieses Problem löst sich von selbst, wenn der erste coredns-Pod geplant ist 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

Wichtig

Wenn Sie einen Knotenpool löschen, führt AKS kein Absperren und Ausgleichen durch. Um die durch die Neuplanung von Pods, die derzeit in dem zu löschenden Knotenpool ausgeführt werden, bedingte Unterbrechung zu minimieren, sperren und entleeren Sie alle Knoten im Knotenpool, bevor Sie diesen löschen.

  1. Löschen Sie den ursprünglichen Knotenpool mithilfe des az aks nodepool delete Befehls.

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Stellen Sie sicher, dass Ihr AKS-Cluster nur über den neuen Knotenpool verfügt und die Anwendungen und Pods ordnungsgemäß laufen, indem Sie den kubectl get nodes Befehl verwenden.

    kubectl get nodes
    

    Die Ausgabe sollte der folgenden Beispielausgabe ähneln, wobei nur der neue Knotenpool mynodepoolangezeigt wird:

    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
    

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.