Fehlerbehebung bei GKE-Standardknotenpools


Auf dieser Seite wird beschrieben, wie Sie Probleme mit Knotenpools im GKE-Standardmodus beheben.

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.

Probleme beim Erstellen von Knotenpools

In diesem Abschnitt werden Probleme beschrieben, die beim Erstellen neuer Knotenpools in Standardclustern auftreten können. Sie erhalten außerdem Vorschläge zur Problembehebung.

Knotenpool kann aufgrund der Ressourcenverfügbarkeit nicht erstellt werden

Das folgende Problem tritt auf, wenn Sie einen Knotenpool mit bestimmter Hardware in einer Google Cloud-Zone erstellen, auf der nicht genügend Hardware verfügbar ist, um Ihre Anforderungen zu erfüllen.

Prüfen Sie Ihre Logs auf relevante Fehlermeldungen, um zu prüfen, ob die Knotenpoolerstellung fehlgeschlagen ist, da eine Zone nicht genügend Ressourcen hatte.

  1. Rufen Sie in der Google Cloud Console den Log-Explorer auf:

    Zum Log-Explorer

  2. Geben Sie im Feld Abfrage die folgende Abfrage ein:

    log_id(cloudaudit.googleapis.com/activity)
    resource.labels.cluster_name="CLUSTER_NAME"
    protoPayload.status.message:("ZONE_RESOURCE_POOL_EXHAUSTED" OR "does not have enough resources available to fulfill the request" OR "resource pool exhausted" OR "does not exist in zone")
    

    Ersetzen Sie dabei CLUSTER_NAME durch den Namen Ihres GKE-Clusters.

  3. Klicken Sie auf Abfrage ausführen.

Möglicherweise wird eine der folgenden Fehlermeldungen angezeigt:

  • resource pool exhausted
  • The zone does not have enough resources available to fulfill the request. Try a different zone, or try again later.
  • ZONE_RESOURCE_POOL_EXHAUSTED
  • ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS
  • Machine type with name '<code><var>MACHINE_NAME</var></code>' does not exist in zone '<code><var>ZONE_NAME</var></code>'

Klären

Versuchen Sie, dieses Problem mit den folgenden Vorschlägen zu beheben:

  • Achten Sie darauf, dass die ausgewählte Google Cloud-Region oder -Zone die benötigte Hardware hat. Mit der Compute Engine-Verfügbarkeitstabelle können Sie prüfen, ob bestimmte Zonen bestimmte Hardware unterstützen. Wählen Sie für Ihre Knoten eine andere Google Cloud-Region oder -Zone aus, die möglicherweise eine bessere Verfügbarkeit der benötigten Hardware bietet.
  • Erstellen Sie den Knotenpool mit kleineren Maschinentypen. Erhöhen Sie die Anzahl der Knoten im Knotenpool, sodass die Gesamt-Rechenkapazität gleich bleibt.
  • Verwenden Sie die Compute Engine-Kapazitätsreservierung, um die Ressourcen im Voraus zu reservieren.
  • Verwenden Sie die im folgenden Abschnitt beschriebene Best-Effort-Bereitstellung, um den Knotenpool erfolgreich zu erstellen, wenn er mindestens eine angegebene Mindestanzahl von Knoten aus der angeforderten Anzahl bereitstellt.

Best-Effort-Bereitstellung

Für bestimmte Hardware können Sie die Best-Effort-Bereitstellung verwenden, die GKE anweist, den Knotenpool erfolgreich zu erstellen, wenn er mindestens eine bestimmte Mindestanzahl von Knoten bereitstellt. GKE versucht im Laufe der Zeit weiterhin, die verbleibenden Knoten bereitzustellen, um die ursprüngliche Anfrage zu erfüllen. Verwenden Sie den folgenden Befehl, um GKE anzuweisen, die Best-Effort-Bereitstellung zu verwenden:

gcloud container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --node-locations=ZONE1,ZONE2,... \
    --machine-type=MACHINE_TYPE
    --best-effort-provision \
    --min-provision-nodes=MINIMUM_NODES

Ersetzen Sie Folgendes:

  • NODE_POOL_NAME: der Name des neuen Knotenpools.
  • ZONE1,ZONE2,...: Die Compute Engine-Zonen für die Knoten. Diese Zonen müssen die ausgewählte Hardware unterstützen.
  • MACHINE_TYPE: Der Compute Engine-Maschinentyp für die Knoten. Beispiel: a2-highgpu-1g.
  • MINIMUM_NODES ist die Mindestanzahl von Knoten, die GKE bereitstellen soll, um den Knotenpool erfolgreich zu erstellen. Wenn keine Angabe gemacht wird, lautet der Standardwert 1.

Stellen Sie sich beispielsweise ein Szenario vor, in dem Sie zehn Knoten mit angehängten NVIDIA A100-GPUs mit 40 GB in us-central1-c benötigen. Gemäß der Tabelle der Verfügbarkeit von GPU-Regionen und -Zonen unterstützt diese Zone A100-GPUs. Um einen Fehler bei der Knotenpoolerstellung zu vermeiden, wenn zehn GPU-Maschinen nicht verfügbar sind, verwenden Sie die Best-Effort-Bereitstellung.

gcloud container node-pools create a100-nodes \
    --cluster=ml-cluster \
    --node-locations=us-central1-c \
    --num-nodes=10 \
    --machine-type=a2-highgpu-1g \
    --accelerator=type=nvidia-tesla-a100,count=1 \
    --best-effort-provision \
    --min-provision-nodes=5

GKE erstellt den Knotenpool auch dann, wenn nur fünf GPUs in us-central1-c verfügbar sind. Im Laufe der Zeit versucht GKE, mehr Knoten bereitzustellen, bis zehn Knoten im Knotenpool vorhanden sind.

Arbeitslasten zwischen Knotenpools migrieren

Verwenden Sie die folgende Anleitung, um Arbeitslasten von einem Knotenpool zu einem anderen Knotenpool zu migrieren. Wenn Sie die Maschinenattribute der Knoten in Ihrem Knotenpool ändern möchten, finden Sie weitere Informationen unter Vertikale Skalierung durch Ändern der Knotenmaschinenattribute.

Pods zu einem neuen Knotenpool migrieren

So migrieren Sie Pods zu einem neuen Knotenpool:

  1. Sperren Sie den vorhandenen Knotenpool. Dieser Vorgang markiert die Knoten im vorhandenen Knotenpool als nicht mehr planbar. Sobald die Knoten als nicht mehr planbar markiert sind, stellt Kubernetes die Zuweisung von neuen Pods für die Knoten ein.

  2. Leeren Sie den Inhalt des vorhandenen Knotenpools. Mit diesem Vorgang werden die Arbeitslasten entfernt, die auf den Knoten des vorhandenen Knotenpools ausgeführt werden.

Diese Schritte führen dazu, dass Pods, die in Ihrem vorhandenen Knotenpool ausgeführt werden, ordnungsgemäß beendet werden. Kubernetes verschiebt sie auf andere verfügbare Knoten.

Damit Kubernetes Ihre Anwendungen ordnungsgemäß beendet, müssen die Container das SIGTERM-Signal verarbeiten können. Mit diesem Ansatz können Sie aktive Clientverbindungen beenden und Datenbanktransaktionen können ordnungsgemäß per Commit abgeschlossen oder rückgängig gemacht werden. Im Pod-Manifest können Sie im Feld spec.terminationGracePeriodSeconds angeben, wie lange Kubernetes warten muss, bevor die Container im Pod angehalten werden. Der Standardwert beträgt 30 Sekunden. Weitere Informationen über die Beendigung von Pods finden Sie in der Kubernetes-Dokumentation.

Sie können Knoten mit den Befehlen kubectl cordon und kubectl drain sperren und leeren.

Knotenpool erstellen und Arbeitslasten migrieren

Wenn Sie Ihre Arbeitslasten in einen neuen Knotenpool migrieren möchten, erstellen Sie den neuen Knotenpool und sperren und leeren Sie die Knoten im vorhandenen Knotenpool.

  1. Fügen Sie dem Cluster einen Knotenpool hinzu.

    Prüfen Sie mit dem folgenden Befehl, ob der neue Knotenpool erstellt wurde:

    gcloud container node-pools list --cluster CLUSTER_NAME
    
  2. Führen Sie den folgenden Befehl aus, um zu sehen, auf welchem Knoten die Pods ausgeführt werden (siehe Spalte NODE):

    kubectl get pods -o=wide
    
  3. Rufen Sie eine Liste der Knoten im vorhandenen Knotenpool ab. Ersetzen Sie dabei EXISTING_NODE_POOL_NAME durch den Namen:

    kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME
    
  4. Führen Sie den Befehl kubectl cordon NODE aus. Ersetzen Sie NODE durch die Namen aus dem vorherigen Befehl. Der im Folgenden aufgeführte Shell-Befehl geht alle Knoten im bestehenden Knotenpool durch und markiert sie als nicht mehr planbar:

    for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do
      kubectl cordon "$node";
    done
    
  5. Optional können Sie Ihre im vorhandenen Knotenpool ausgeführten Arbeitslasten aktualisieren, um einen nodeSelector für das Label cloud.google.com/gke-nodepool:NEW_NODE_POOL_NAME hinzuzufügen, wobei NEW_NODE_POOL_NAME der Name des neuen Knotenpools ist. Dadurch wird sichergestellt, dass GKE diese Arbeitslasten auf Knoten im neuen Knotenpool platziert.

  6. Leeren Sie jeden Knoten, indem Sie Pods mit einem zugewiesenen Beendigungszeitraum von 10 Sekunden entfernen:

    for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=EXISTING_NODE_POOL_NAME -o=name); do
      kubectl drain --force --ignore-daemonsets --delete-emptydir-data --grace-period=GRACEFUL_TERMINATION_SECONDS  "$node";
    done
    

    Ersetzen Sie GRACEFUL_TERMINATION_PERIOD_SECONDS durch die erforderliche Zeit für die ordnungsgemäße Beendigung.

  7. Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Knoten im vorhandenen Knotenpool den Status SchedulingDisabled in der Knotenliste haben:

    kubectl get nodes
    

    Darüber hinaus sollten Sie sehen, dass die Pods nun auf den Knoten im neuen Knotenpool ausgeführt werden:

    kubectl get pods -o=wide
    
  8. Löschen Sie den vorhandenen Knotenpool, wenn Sie ihn nicht mehr benötigen:

    gcloud container node-pools delete default-pool --cluster CLUSTER_NAME
    

Nächste Schritte

Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.