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, durch die 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
Cluster mit Knotendienstkonten identifizieren, denen wichtige Berechtigungen fehlen
Um Cluster mit Knotendienstkonten zu identifizieren, für die wichtige Berechtigungen fehlen, verwenden Sie die GKE-Empfehlungen vom NODE_SA_MISSING_PERMISSIONS
-Empfehlungsuntertyp:
- Google Cloud Console verwenden. Rufen Sie die Seite Kubernetes-Cluster auf und prüfen Sie in der Spalte Benachrichtigungen für bestimmte Cluster, ob die Empfehlung Wichtige Berechtigungen gewähren angezeigt wird.
Verwenden Sie die gcloud CLI oder die Recommender API und geben Sie den Untertyp
NODE_SA_MISSING_PERMISSIONS
für den Recommender an.Führen Sie den folgenden Befehl aus, um Empfehlungen abzufragen:
gcloud recommender recommendations list \ --recommender=google.container.DiagnosisRecommender \ --location LOCATION \ --project PROJECT_ID \ --format yaml \ --filter="recommenderSubtype:NODE_SA_MISSING_PERMISSIONS"
Es kann bis zu 24 Stunden dauern, bis die Empfehlung angezeigt wird. Eine ausführliche Anleitung finden Sie unter Insights und Empfehlungen ansehen.
Um diese Empfehlung umzusetzen, weisen Sie dem Dienstkonto des Knotens die Rolle roles/container.defaultNodeServiceAccount
zu.
Mit diesem Script können Sie alle Knotendienstkonten ermitteln, denen für Cluster im Standardmodus in einem Projekt wichtige Berechtigungen fehlen.
#!/bin/bash
# Set your project ID
project_id=PROJECT_ID
project_number=$(gcloud projects describe "$project_id" --format="value(projectNumber)")
declare -a all_service_accounts
declare -a sa_missing_permissions
# Function to check if a service account has a specific permission
# $1: project_id
# $2: service_account
# $3: permission
service_account_has_permission() {
local project_id="$1"
local service_account="$2"
local permission="$3"
local roles=$(gcloud projects get-iam-policy "$project_id" \
--flatten="bindings[].members" \
--format="table[no-heading](bindings.role)" \
--filter="bindings.members:\"$service_account\"")
for role in $roles; do
if role_has_permission "$role" "$permission"; then
echo "Yes" # Has permission
return
fi
done
echo "No" # Does not have permission
}
# Function to check if a role has the specific permission
# $1: role
# $2: permission
role_has_permission() {
local role="$1"
local permission="$2"
gcloud iam roles describe "$role" --format="json" | \
jq -r ".includedPermissions" | \
grep -q "$permission"
}
echo "--- 1. List all service accounts in all GKE node pools"
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" "service_account" "project_id" "cluster_name" "cluster_location" "nodepool_name"
while read cluster; do
cluster_name=$(echo "$cluster" | awk '{print $1}')
cluster_location=$(echo "$cluster" | awk '{print $2}')
while read nodepool; do
nodepool_name=$(echo "$nodepool" | awk '{print $1}')
while read nodepool_details; do
service_account=$(echo "$nodepool_details" | awk '{print $1}')
if [[ "$service_account" == "default" ]]; then
service_account="${project_number}-compute@developer.gserviceaccount.com"
fi
if [[ -n "$service_account" ]]; then
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" $service_account $project_id $cluster_name $cluster_location $nodepool_name
all_service_accounts+=( ${service_account} )
else
echo "cannot find service account" for node pool "$project_id\t$cluster_name\t$cluster_location\t$nodepool_details"
fi
done <<< "$(gcloud container node-pools describe "$nodepool_name" --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](config.serviceAccount)")"
done <<< "$(gcloud container node-pools list --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](name)")"
done <<< "$(gcloud container clusters list --project "$project_id" --format="value(name,location)")"
echo "--- 2. Check if service accounts have permissions"
unique_service_accounts=($(echo "${all_service_accounts[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
echo "Service accounts: ${unique_service_accounts[@]}"
printf "%-60s| %-40s| %-40s| %-20s\n" "service_account" "has_logging_permission" "has_monitoring_permission" "has_performance_hpa_metric_write_permission"
for sa in "${unique_service_accounts[@]}"; do
logging_permission=$(service_account_has_permission "$project_id" "$sa" "logging.logEntries.create")
monitoring_permission=$(service_account_has_permission "$project_id" "$sa" "monitoring.timeSeries.create")
performance_hpa_metric_write_permission=$(service_account_has_permission "$project_id" "$sa" "autoscaling.sites.writeMetrics")
printf "%-60s| %-40s| %-40s| %-20s\n" $sa $logging_permission $monitoring_permission $performance_hpa_metric_write_permission
if [[ "$logging_permission" == "No" || "$monitoring_permission" == "No" || "$performance_hpa_metric_write_permission" == "No" ]]; then
sa_missing_permissions+=( ${sa} )
fi
done
echo "--- 3. List all service accounts that don't have the above permissions"
if [[ "${#sa_missing_permissions[@]}" -gt 0 ]]; then
printf "Grant roles/container.defaultNodeServiceAccount to the following service accounts: %s\n" "${sa_missing_permissions[@]}"
else
echo "All service accounts have the above permissions"
fi
Knotendienstkonten mit fehlenden wichtigen Berechtigungen in einem Cluster identifizieren
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 Standard-Compute Engine-Dienstkonto 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 an ein benutzerdefiniertes 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 zur Ressource Google Cloud, 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 zum Erstellen des Clusters erforderlichen Mindestberechtigungen hat.
So beheben Sie das Problem:
- Erstellen oder ändern Sie ein IAM-Dienstkonto, damit es alle erforderlichen Berechtigungen zum Ausführen eines GKE-Clusters 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, Google Cloudwerden die 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 Console 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.