Auf dieser Seite erfahren Sie, wie Sie 400-, 401-, 403- und 404-Fehler beheben, die bei der Verwendung der Google Kubernetes Engine (GKE) auftreten können.
Problem: Authentifizierungs- und Autorisierungsfehler
Wenn Sie eine Verbindung zu GKE-Clustern herstellen, kann ein Authentifizierungs- und Autorisierungsfehler mit dem HTTP-Statuscode 401 (Unauthorized)
auftreten. Dieses Problem kann auftreten, wenn Sie versuchen, einen kubectl
-Befehl in Ihrem GKE-Cluster aus einer lokalen Umgebung auszuführen.
Mögliche Ursachen:
- Das
gke-gcloud-auth-plugin
-Authentifizierungs-Plug-in ist nicht richtig installiert oder konfiguriert. - Sie sind nicht berechtigt, eine Verbindung zum Cluster API-Server herzustellen und
kubectl
-Befehle auszuführen.
Führen Sie die Schritte in den folgenden Abschnitten aus, um die Ursache zu ermitteln:
Verbindung zum Cluster über curl
herstellen
Um die Ursache des Authentifizierungs- und Autorisierungsfehlers zu ermitteln, stellen Sie über curl
eine Verbindung zum Cluster her. Wenn Sie curl
verwenden, werden das kubectl
-Befehlszeilentool und das gke-gcloud-auth-plugin
-Plug-in umgangen.
Legen Sie Umgebungsvariablen fest:
APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION --format "value(endpoint)") TOKEN=$(gcloud auth print-access-token)
Prüfen Sie, ob Ihr Zugriffstoken gültig ist:
curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
Wenn Sie ein gültiges Zugriffstoken haben, sendet dieser Befehl eine Anfrage an den OAuth 2.0-Server von Google. Der Server antwortet mit Informationen zum Token.
Versuchen Sie, eine Verbindung zum API-Endpunkt der API herzustellen:
# Get cluster CA certificate gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --format "value(masterAuth.clusterCaCertificate)" | \ base64 -d > /tmp/ca.crt # Make API call with authentication and CA certificate curl -s -X GET "${APISERVER}/api/v1/namespaces" \ --header "Authorization: Bearer $TOKEN" \ --cacert /tmp/ca.crt
Wenn der Befehl
curl
erfolgreich ist, wird eine Liste der Namespaces angezeigt. Prüfen Sie mithilfe der Schritte im Abschnitt Plug-in in der kubeconfig-Datei konfigurieren, ob das Plug-in die Ursache ist.Wenn der Befehl
curl
mit einer Ausgabe wie der folgenden fehlschlägt, haben Sie nicht die erforderlichen Berechtigungen für den Zugriff auf den Cluster:{ "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }
Wenden Sie sich an Ihren Administrator, um die richtigen Berechtigungen für den Zugriff auf den Cluster zu erhalten.
Verwendung des Plug-ins in der kubeconfig konfigurieren
Wenn Sie beim Verbinden mit Ihren Clustern Authentifizierungs- und Autorisierungsfehler erhalten, aber mit curl
eine Verbindung zum Cluster herstellen konnten, prüfen Sie, ob Sie auf Ihren Cluster zugreifen können, ohne das gke-gcloud-auth-plugin
-Plug-in zu benötigen.
Um dieses Problem zu beheben, konfigurieren Sie Ihre lokale Umgebung so, dass die gke-gcloud-auth-plugin
-Binärdatei bei der Authentifizierung beim Cluster ignoriert wird. In Kubernetes-Clients mit Version 1.25 und höher ist das gke-gcloud-auth-plugin
-Binärprogramm erforderlich. Sie müssen daher Version 1.24 oder niedriger für das kubectl
-Befehlszeilentool verwenden.
So greifen Sie ohne das Plug-in auf Ihren Cluster zu:
Installieren Sie das
kubectl
-Befehlszeilentool mit Version 1.24 oder niedriger mitcurl
. Im folgenden Beispiel wird das Tool mit Version 1.24 installiert:curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
Öffnen Sie die Datei des Shell-Startscripts in einem Texteditor. Öffnen Sie beispielsweise
.bashrc
für die Bash-Shell:vi ~/.bashrc
Wenn Sie macOS verwenden, ersetzen Sie in dieser Anleitung
.bashrc
durch~/.bash_profile
.Fügen Sie der Startskriptdatei die folgende Zeile hinzu und speichern Sie sie:
export USE_GKE_GCLOUD_AUTH_PLUGIN=False
Führen Sie das Startskript aus:
source ~/.bashrc
Rufen Sie Anmeldedaten für Ihren Cluster ab, um die
.kube/config
-Datei einzurichten:gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION
Ersetzen Sie Folgendes:
CLUSTER_NAME
ist der Name des Clusters.COMPUTE_LOCATION
: der Compute Engine-Standort.
Führen Sie einen
kubectl
-Befehl aus. Beispiel:kubectl cluster-info
Wenn Sie nach Ausführung dieser Befehle einen 401-Fehler oder einen ähnlichen Autorisierungsfehler erhalten, prüfen Sie, ob Sie die richtigen Berechtigungen haben, und führen Sie den Schritt, bei dem der Fehler zurückgegeben wurde, noch einmal aus.
Fehler 400: Knotenpool muss neu erstellt werden
Der folgende Fehler kann auftreten, wenn Sie versuchen, eine Aktion auszuführen, bei der die Steuerungsebene und die Knoten neu erstellt werden:
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
Dieser Fehler kann beispielsweise auftreten, wenn Sie eine laufende Passwortrotation abschließen.
Im Backend werden Knotenpools für die Neuerstellung markiert. Die eigentliche Neuerstellung kann jedoch einige Zeit dauern. Daher schlägt der Vorgang fehl, da GKE noch keinen oder mehrere Knotenpools in Ihrem Cluster neu erstellt hat.
Wählen Sie eine der folgenden Lösungen aus, um dieses Problem zu beheben:
- Warten Sie, bis die Neukreation abgeschlossen ist. Je nach Faktoren wie vorhandenen Wartungsfenstern und Ausschlüssen kann dies Stunden, Tage oder Wochen dauern.
Starten Sie die Neuerstellung der betroffenen Knotenpools manuell, indem Sie ein Versionsupgrade auf dieselbe Version wie die Steuerungsebene starten.
Führen Sie den folgenden Befehl aus, um eine Neuausrichtung zu starten:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=POOL_NAME
Wiederholen Sie den Vorgang nach Abschluss des Upgrades.
Fehler 401: Nicht autorisiert
GKE verwendet IAM-Dienstkonten, die an Ihre Knoten angehängt sind, um Systemaufgaben wie Logging und Monitoring auszuführen. Diese Knotendienstkonten müssen in Ihrem Projekt mindestens die Rolle Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount
) haben. Standardmäßig verwendet GKE das Compute Engine-Standarddienstkonto, das automatisch in Ihrem Projekt erstellt wird, als Knotendienstkonto.
Wenn Ihre Organisation die Einschränkung der Organisationsrichtlinie iam.automaticIamGrantsForDefaultServiceAccounts
erzwingt, erhält das Compute Engine-Standarddienstkonto in Ihrem Projekt möglicherweise nicht automatisch die erforderlichen Berechtigungen für GKE.
-
So finden Sie den Namen des Dienstkontos, das Ihre Knoten verwenden:
Console
- Rufen Sie die Seite Kubernetes-Cluster auf:
- Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie prüfen möchten.
- Führen Sie je nach Betriebsmodus des Clusters einen der folgenden Schritte aus:
- Suchen Sie bei Clustern im Autopilot-Modus im Abschnitt Sicherheit nach dem Feld Dienstkonto.
- Führen Sie für Cluster im Standardmodus die folgenden Schritte aus:
- Klicken Sie auf den Tab Knoten.
- Klicken Sie in der Tabelle Knotenpools auf den Namen eines Knotenpools. Die Seite Knotenpooldetails wird geöffnet.
- Suchen Sie im Abschnitt Sicherheit nach dem Feld Dienstkonto.
Wenn der Wert im Feld Dienstkonto
default
ist, verwenden Ihre Knoten das Compute Engine-Standarddienstkonto. Wenn der Wert in diesem Felddefault
nicht ist, verwenden Ihre Knoten ein benutzerdefiniertes Dienstkonto. Eine Anleitung zum Zuweisen der erforderlichen Rolle zu einem benutzerdefinierten Dienstkonto finden Sie unter IAM-Dienstkonten mit geringsten Berechtigungen verwenden.gcloud
Führen Sie für Cluster im Autopilot-Modus den folgenden Befehl aus:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccountFühren Sie für Cluster im Standardmodus den folgenden Befehl aus:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --format="table(nodePools.name,nodePools.config.serviceAccount)"Wenn die Ausgabe
default
ist, verwenden Ihre Knoten das Compute Engine-Standarddienstkonto. Wenn die Ausgabedefault
nicht ist, verwenden Ihre Knoten ein benutzerdefiniertes Dienstkonto. Eine Anleitung zum Zuweisen der erforderlichen Rolle zu einem benutzerdefinierten Dienstkonto finden Sie unter IAM-Dienstkonten mit geringsten Berechtigungen verwenden. -
So weisen Sie dem Compute Engine-Standarddienstkonto die Rolle
roles/container.defaultNodeServiceAccount
zu:Console
- Rufen Sie die Begrüßungsseite auf:
- Klicken Sie im Feld Projektnummer auf In Zwischenablage kopieren.
- Rufen Sie die IAM-Seite auf.
- Klicken Sie auf Zugriff erlauben.
- Geben Sie im Feld Neue Hauptkonten den folgenden Wert an:
Ersetzen SiePROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
durch die kopierte Projektnummer. - Wählen Sie im Menü Rolle auswählen die Rolle Kubernetes Engine Default Node Service Account aus.
- Klicken Sie auf Speichern.
gcloud
- So finden Sie Ihre Google Cloud -Projektnummer:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
Ersetzen Sie
PROJECT_ID
durch Ihre Projekt-ID.Die Ausgabe sieht in etwa so aus:
12345678901
- Weisen Sie dem Compute Engine-Standarddienstkonto die Rolle
roles/container.defaultNodeServiceAccount
zu:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
Ersetzen Sie
PROJECT_NUMBER
durch die Projektnummer aus dem vorherigen Schritt.
Fehler 403: Unzureichende Berechtigungen
Der folgende Fehler tritt auf, wenn Sie versuchen, mit gcloud container clusters get-credentials
eine Verbindung zu einem GKE-Cluster herzustellen, das Konto aber keine Berechtigung zum Zugriff auf den Kubernetes API-Server hat:
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/<your-project>/locations/<region>/clusters/<your-cluster>".
So beheben Sie das Problem:
Identifizieren Sie das Konto, bei dem das Zugriffsproblem auftritt:
gcloud auth list
Gewähren Sie dem Konto den erforderlichen Zugriff. Folgen Sie dazu der Anleitung unter Beim Kubernetes API-Server authentifizieren.
Fehler 403: Wiederholbudget aufgebraucht
Wenn Sie versuchen, einen GKE-Cluster zu erstellen, kann der folgende Fehler auftreten:
Error: googleapi: Error 403: Retry budget exhausted: Google Compute Engine:
Required permission 'PERMISSION_NAME' for 'RESOURCE_NAME'.
In dieser Fehlermeldung gelten die folgenden Variablen:
PERMISSION_NAME
: der Name einer Berechtigung, z. B.compute.regions.get
.RESOURCE_NAME
: der Pfad zu der Google Cloud-Ressource, auf die Sie zugreifen wollten, z. B. eine Compute Engine-Region.
Dieser Fehler tritt auf, wenn das mit dem Cluster verknüpfte IAM-Dienstkonto nicht die erforderlichen Mindestberechtigungen zum Erstellen des Clusters hat.
So beheben Sie das Problem:
- Erstellen oder ändern Sie ein IAM-Dienstkonto, damit es alle erforderlichen Berechtigungen zum Ausführen eines GKE-Cluster hat. Eine Anleitung finden Sie unter IAM-Dienstkonten mit geringsten Berechtigungen verwenden.
- Geben Sie das aktualisierte IAM-Dienstkonto in Ihrem Befehl zum Erstellen des Clusters mithilfe des Flags
--service-account
an. Eine Anleitung finden Sie unter Autopilot-Cluster erstellen.
Alternativ können Sie das Flag --service-account
weglassen, damit GKE das Compute Engine-Standarddienstkonto im Projekt verwendet, das standardmäßig die erforderlichen Berechtigungen hat.
Fehler 404: Ressource nicht gefunden
Wenn beim Aufrufen von gcloud container
-Befehlen der Fehler 404 (Ressource nicht gefunden) auftritt, können Sie das Problem beheben, indem Sie sich noch einmal in der Google Cloud CLI authentifizieren:
gcloud auth login
Fehler 400/403: Dem Konto fehlen Bearbeitungsberechtigungen
Wenn der Fehler „Dem Konto fehlen Bearbeitungsberechtigungen“ (Fehler 400 oder 403) auftritt, wurde eine der folgenden Elemente manuell gelöscht oder bearbeitet:
- Ihr Compute Engine-Standarddienstkonto.
- Der Google APIs-Dienst-Agent
- Das mit GKE verknüpfte Dienstkonto.
Wenn Sie die Compute Engine API oder die Kubernetes Engine API aktivieren,werden in Google Clouddie folgenden Dienstkonten und ‑agenten erstellt:
- Compute Engine-Standarddienstkonto in Ihrem Projekt. GKE ordnet dieses Dienstkonto standardmäßig Knoten für Systemaufgaben wie Logging und Monitoring zu.
- Google APIs-Dienst-Agent in einem von Google verwalteten Projekt mit Bearbeitungsberechtigungen für Ihr Projekt.
- Google Kubernetes Engine-Dienst-Agent in einem von Google verwalteten Projekt mit der Rolle Kubernetes Engine-Dienst-Agent für Ihr Projekt
Das Erstellen des Clusters und die gesamte Verwaltung schlagen fehl, wenn jemand diese Berechtigungen bearbeitet, die Rollenbindungen für das Projekt entfernt, das Dienstkonto vollständig entfernt oder die API deaktiviert.
Berechtigungen für den GKE-Dienst-Agent prüfen
So prüfen Sie, ob dem Google Kubernetes Engine-Dienstkonto die Rolle Kubernetes Engine-Dienst-Agent für das Projekt zugewiesen ist:
Ermitteln Sie den Namen Ihres Google Kubernetes Engine-Dienstkontos. Alle Dienstkonten haben folgendes Format:
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Ersetzen Sie
PROJECT_NUMBER
mit Ihrer Projekt-ID.Prüfen Sie, ob Ihrem Google Kubernetes Engine-Dienstkonto nicht die Rolle Kubernetes Engine-Dienst-Agent für das Projekt zugewiesen ist:
gcloud projects get-iam-policy PROJECT_ID
Ersetzen Sie
PROJECT_ID
durch Ihre Projekt-ID.
Falls jemand die Rolle Kubernetes Engine-Dienst-Agent aus Ihrem Google Kubernetes Engine-Dienstkonto entfernt hat, fügen Sie sie wieder hinzu, um das Problem zu beheben. Andernfalls können Sie die Kubernetes Engine API mit der folgenden Anleitung wieder aktivieren, um Ihre Dienstkonten und Berechtigungen wiederherzustellen:
Console
Rufen Sie in der Google Cloud -Konsole die Seite APIs & Dienste auf.
Wählen Sie Ihr Projekt aus.
Klicken Sie auf APIs und Dienste aktivieren.
Suchen Sie "Kubernetes" und wählen Sie anschließend in den Suchergebnissen die API aus.
Klicken Sie auf Aktivieren. Wenn Sie die API bereits aktiviert hatten, deaktivieren Sie sie und aktivieren Sie sie dann noch einmal. Es kann einige Minuten dauern, bis die API und zugehörige Dienste aktiviert werden.
gcloud
Führen Sie die folgenden Befehle in der gcloud CLI aus:
PROJECT_NUMBER=$(gcloud projects describe "PROJECT_ID"
--format 'get(projectNumber)')
gcloud projects add-iam-policy-binding PROJECT_ID \
--member "serviceAccount:service-${PROJECT_NUMBER?}@container-engine-robot.iam.gserviceaccount.com" \
--role roles/container.serviceAgent
Nächste Schritte
Wenn Sie weitere Unterstützung benötigen, wenden Sie sich an den Cloud Customer Care.