Bei der Verwaltung von Standardclustern in Google Kubernetes Engine (GKE) können Probleme mit Ihren Knotenpools kritische Vorgänge unterbrechen. Diese Probleme können verhindern, dass Sie Arbeitslasten skalieren, um die Nachfrage zu decken, oder wichtige Infrastruktur-Upgrades durchführen. Dies kann sich auf die Zuverlässigkeit Ihrer Anwendung auswirken.
Auf dieser Seite finden Sie Informationen zur Fehlerbehebung bei häufigen Problemen mit Knotenpools. Hier finden Sie Anleitungen dazu, wie Sie feststellen können, ob Sie nicht genügend Ressourcen haben, wie Sie Funktionen wie die Bereitstellung nach dem Best-Effort-Prinzip verwenden, um Knoten zu erstellen, und wie Sie Ihre Arbeitslasten sicher migrieren, ohne Unterbrechungen zu verursachen.
Diese Informationen sind wichtig für Plattformadministratoren und ‑betreiber, die für die Verwaltung der Clusterinfrastruktur verantwortlich sind. Es kann auch für Anwendungsentwickler nützlich sein, die wissen müssen, wie sich Knotenpoolbeschränkungen auf ihre Anwendungsbereitstellungen auswirken können. Weitere Informationen zu den gängigen Rollen und Beispielaufgaben, auf die wir in Google Cloud -Inhalten verweisen, finden Sie unter Häufig verwendete GKE-Nutzerrollen und ‑Aufgaben.
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 andereGoogle 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 \
--location=CONTROL_PLANE_LOCATION \
--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.CONTROL_PLANE_LOCATION
: Der Compute Engine-Standort der Steuerungsebene des Clusters. Geben Sie für regionale Cluster eine Region und für zonale Cluster eine Zone an.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 \
--location=us-central1 \
--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 „instance-template“-Metadaten
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 Knotenpool 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:
Knoten im vorhandenen Knotenpool sperren: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.
Knoten im vorhandenen Knotenpool leeren:Mit diesem Vorgang werden die Arbeitslasten entfernt, die auf den Knoten des vorhandenen Knotenpools ausgeführt werden.
Durch diese Schritte, die für jeden Knoten einzeln ausgeführt werden, 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 \ --location=CONTROL_PLANE_LOCATION
Ersetzen Sie Folgendes:
CLUSTER_NAME
ist der Name des Clusters.CONTROL_PLANE_LOCATION
: Der Compute Engine-Standort der Steuerungsebene des Clusters. Geben Sie für regionale Cluster eine Region und für zonale Cluster eine Zone an.
Wenn Autoscaling für den vorhandenen Knotenpool aktiviert ist, können Sie es mit dem folgenden Befehl deaktivieren:
gcloud container clusters update CLUSTER_NAME --location=CONTROL_PLANE_LOCATION \ --no-enable-autoscaling \ --node-pool=EXISTING_NODE_POOL_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 alle 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.Prüfen Sie mit dem folgenden Befehl, ob 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 \ --location=CONTROL_PLANE_LOCATION
Nächste Schritte
Wenn Sie in der Dokumentation keine Lösung für Ihr Problem finden, lesen Sie den Abschnitt Support erhalten. Dort finden Sie weitere Hilfe, z. B. zu den folgenden Themen:
- Sie können eine Supportanfrage erstellen, indem Sie sich an den Cloud Customer Care wenden.
- Support von der Community erhalten, indem Sie Fragen auf Stack Overflow stellen und mit dem Tag
google-kubernetes-engine
nach ähnlichen Problemen suchen. Sie können auch dem#kubernetes-engine
-Slack-Kanal beitreten, um weiteren Community-Support zu erhalten. - Sie können Fehler melden oder Funktionsanfragen stellen, indem Sie die öffentliche Problemverfolgung verwenden.