Fehlerbehebung bei GKE Standard-Knotenpools


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 aufgeführt, die beim Erstellen neuer Knotenpools in Standardclustern auftreten können, sowie Vorschläge zum Beheben dieser Probleme.

Problem: Knotenpool kann aufgrund unzureichender Ressourcen nicht erstellt werden

Das folgende Problem tritt auf, wenn Sie einen Knotenpool mit bestimmter Hardware in einer Google Cloud-Zone erstellen, in der nicht genügend Hardwareressourcen für Ihre Anforderungen verfügbar sind.

Prüfen Sie in den Protokollen, ob die Erstellung des Knotenpools fehlgeschlagen ist, weil 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 'MACHINE_NAME' does not exist in zone 'ZONE_NAME'

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

  • Prüfen Sie, ob in der ausgewählten Google Cloud-Region oder -Zone die erforderliche Hardware verfügbar ist. Anhand der Compute Engine-Verfügbarkeitstabelle können Sie prüfen, ob bestimmte Zonen bestimmte Hardware unterstützen. Wählen Sie eine andere Google Cloud-Region oder -Zone für Ihre Knoten aus, die möglicherweise eine bessere Verfügbarkeit der benötigten Hardware hat.
  • Erstellen Sie den Knotenpool mit kleineren Maschinentypen. Erhöhen Sie die Anzahl der Knoten im Knotenpool, damit die Gesamtrechenleistung gleich bleibt.
  • Verwenden Sie Compute Engine-Kapazitätsreservierungen, um die Ressourcen im Voraus zu reservieren.
  • Verwenden Sie die im folgenden Abschnitt beschriebene Best-Effort-Bereitstellung, um den Knotenpool zu erstellen, wenn mindestens eine bestimmte Mindestanzahl von Knoten aus der angeforderten Anzahl bereitgestellt werden kann.

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 bereitstellen kann. GKE versucht weiterhin, die verbleibenden Knoten bereitzustellen, um der ursprünglichen Anfrage im Laufe der Zeit zu genügen. Wenn Sie GKE anweisen möchten, die Best-Effort-Bereitstellung zu verwenden, verwenden Sie den folgenden Befehl:

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 zur Verfügbarkeit von GPU-Regionen und ‑Zonen werden in dieser Zone A100-GPUs unterstützt. 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 sich zehn Knoten im Knotenpool befinden.

Fehler: Instanz enthält keine Metadaten vom Typ „instance-template“

Möglicherweise wird der folgende Fehler als Status eines Knotenpools angezeigt, für den kein Upgrade, keine Skalierung und keine automatische Knotenreparatur durchgeführt werden kann:

Instance INSTANCE_NAME does not contain 'instance-template' metadata

Dieser Fehler gibt an, dass die von GKE zugewiesenen Metadaten der VM-Instanzen fehlerhaft waren. Dies ist in der Regel der Fall, wenn benutzerdefinierte Automatisierungen oder Scripts versuchen, neue Instanzmetadaten wie block-project-ssh-keys hinzuzufügen. Statt nur Werte hinzuzufügen oder zu aktualisieren, werden vorhandene Metadaten gelöscht. Informationen zu Metadaten für VM-Instanzen finden Sie unter Benutzerdefinierte Metadaten einrichten.

Wenn einer der wichtigsten Metadatenwerte (z. B. instance-template ,kube-labels ,kubelet-config ,kubeconfig ,cluster-name ,configure-sh oder cluster-uid) gelöscht wurde, kann sich der Knoten oder der gesamte Knotenpool in einen instabilen Zustand versetzen, da diese Werte für GKE-Vorgänge entscheidend sind.

Wenn die Instanzmetadaten beschädigt wurden, empfehlen wir, sie wiederherzustellen, indem Sie den Knotenpool mit den beschädigten VM-Instanzen neu erstellen. Sie müssen Ihrem Cluster einen Knotenpool hinzufügen und die Anzahl der Knoten im neuen Knotenpool erhöhen, während Sie Knoten in einem anderen sperren und entfernen. Eine Anleitung finden Sie unter Arbeitslasten zwischen Knotenpools migrieren.

Informationen dazu, von wem und wann Instanzmetadaten bearbeitet wurden, finden Sie unter Informationen zum Audit-Logging in Compute Engine. Alternativ können Sie mithilfe des Log-Explorers in Logs suchen. Geben Sie dafür eine Suchanfrage wie diese ein:

resource.type="gce_instance_group_manager"
protoPayload.methodName="v1.compute.instanceGroupManagers.setInstanceTemplate"

In den Logs finden Sie die IP-Adresse und den User-Agent des Anfrageerstellers. Beispiel:

requestMetadata: {
  callerIp: "REDACTED"
  callerSuppliedUserAgent: "google-api-go-client/0.5 GoogleContainerEngine/v1"
}

Arbeitslasten zwischen Knotenpools migrieren

Folgen Sie der folgenden Anleitung, um Arbeitslasten von einem Knotenpool zu einem anderen zu migrieren. Informationen zum Ändern der Maschinenattribute der Knoten in Ihrem Knotenpool finden Sie unter Vertikale Skalierung durch Änderung 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.

Durch diese Schritte werden die auf dem vorhandenen Knotenpool ausgeführten Pods ordnungsgemäß beendet. Kubernetes weist sie anschließend den anderen verfügbaren Knoten zu.

Damit Kubernetes Ihre Anwendungen ordnungsgemäß beendet, müssen die Container das SIGTERM-Signal verarbeiten können. Verwenden Sie diesen Ansatz, um aktive Clientverbindungen zu schließen und für Datenbanktransaktionen saubere Commits oder Rollbacks durchzuführen. 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 auf einen neuen Knotenpool migrieren möchten, erstellen Sie den neuen Knotenpool und sperren und leeren Sie dann die Knoten im vorhandenen Knotenpool:

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

    Überprü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 dabei 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. Aktualisieren Sie optional die Arbeitslasten, die auf dem vorhandenen Knotenpool ausgeführt werden, 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. So wird sichergestellt, dass GKE diese Arbeitslasten auf Knoten im neuen Knotenpool platziert.

  6. Leeren Sie jeden Knoten, indem Sie Pods innerhalb des zugewiesenen ordnungsgemäßen Beendigungszeitraums 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 sehen, dass die Knoten im vorhandenen Knotenpool in der Knotenliste den Status SchedulingDisabled haben:

    kubectl get nodes
    

    Außerdem sollten Sie sehen, dass die Pods jetzt 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.