4xx-Fehler beheben


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:

  1. Verbindung mit dem Cluster über curl herstellen
  2. Plug-in in der kubeconfig-Datei konfigurieren

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.

  1. Legen Sie Umgebungsvariablen fest:

    APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \
        --location=COMPUTE_LOCATION --format "value(endpoint)")
    TOKEN=$(gcloud auth print-access-token)
    
  2. 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.

  3. 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:

  1. Installieren Sie das kubectl-Befehlszeilentool mit Version 1.24 oder niedriger mit curl. 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
    
  2. Ö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.

  3. Fügen Sie der Startskriptdatei die folgende Zeile hinzu und speichern Sie sie:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=False
    
  4. Führen Sie das Startskript aus:

    source ~/.bashrc
    
  5. 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:

  6. 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.

  1. So finden Sie den Namen des Dienstkontos, das Ihre Knoten verwenden:

    Console

    1. Rufen Sie die Seite Kubernetes-Cluster auf:

      Zur Seite "Kubernetes-Cluster"

    2. Klicken Sie in der Clusterliste auf den Namen des Clusters, den Sie prüfen möchten.
    3. 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:
        1. Klicken Sie auf den Tab Knoten.
        2. Klicken Sie in der Tabelle Knotenpools auf den Namen eines Knotenpools. Die Seite Knotenpooldetails wird geöffnet.
        3. 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 Feld default 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.serviceAccount

    Fü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 Ausgabe default 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.

  2. So weisen Sie dem Compute Engine-Standarddienstkonto die Rolle roles/container.defaultNodeServiceAccount zu:

    Console

    1. Rufen Sie die Begrüßungsseite auf:

      Zur Begrüßungsseite

    2. Klicken Sie im Feld Projektnummer auf In Zwischenablage kopieren.
    3. Rufen Sie die IAM-Seite auf.

      IAM aufrufen

    4. Klicken Sie auf Zugriff erlauben.
    5. Geben Sie im Feld Neue Hauptkonten den folgenden Wert an:
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      Ersetzen Sie PROJECT_NUMBER durch die kopierte Projektnummer.
    6. Wählen Sie im Menü Rolle auswählen die Rolle Kubernetes Engine Default Node Service Account aus.
    7. Klicken Sie auf Speichern.

    gcloud

    1. 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
      
    2. 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:

  1. Identifizieren Sie das Konto, bei dem das Zugriffsproblem auftritt:

    gcloud auth list
    
  2. 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:

  1. 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.
  2. 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:

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:

  1. 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.

  2. 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

  1. Rufen Sie in der Google Cloud -Konsole die Seite APIs & Dienste auf.

    Rufen Sie "APIs & Dienste" auf.

  2. Wählen Sie Ihr Projekt aus.

  3. Klicken Sie auf APIs und Dienste aktivieren.

  4. Suchen Sie "Kubernetes" und wählen Sie anschließend in den Suchergebnissen die API aus.

  5. 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.