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.
Rufen Sie in der Google Cloud Console den Log-Explorer auf:
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.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 Standardwert1
.
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:
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.
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:
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
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
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
Führen Sie den Befehl
kubectl cordon NODE
aus. Ersetzen Sie dabeiNODE
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
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, wobeiNEW_NODE_POOL_NAME
der Name des neuen Knotenpools ist. So wird sichergestellt, dass GKE diese Arbeitslasten auf Knoten im neuen Knotenpool platziert.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.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
Löschen Sie den vorhandenen Knotenpool, wenn Sie ihn nicht mehr benötigen:
gcloud container node-pools delete default-pool --cluster CLUSTER_NAME