Résoudre les erreurs 4xx


Cette page vous aide à résoudre les erreurs 400, 401, 403 et 404 que vous pouvez rencontrer lorsque vous utilisez Google Kubernetes Engine (GKE).

Problème: erreurs d'authentification et d'autorisation

Lorsque vous vous connectez à des clusters GKE, vous pouvez recevoir une erreur d'authentification et d'autorisation avec le code d'état HTTP 401 (Unauthorized). Ce problème peut se produire lorsque vous essayez d'exécuter une commande kubectl dans votre cluster GKE à partir d'un environnement local.

La cause de ce problème peut être l'une des suivantes:

  • Le plug-in d'authentification gke-gcloud-auth-plugin n'est pas correctement installé ou configuré.
  • Vous ne disposez pas des autorisations nécessaires pour vous connecter au serveur d'API du cluster et exécuter des commandes kubectl.

Pour diagnostiquer la cause, procédez comme suit:

  1. Se connecter au cluster à l'aide de curl
  2. Configurer le plug-in dans kubeconfig

Se connecter au cluster à l'aide de curl

Pour diagnostiquer la cause de l'erreur d'authentification et d'autorisation, connectez-vous au cluster à l'aide de curl. L'utilisation de curl contourne l'outil de ligne de commande kubectl et le plug-in gke-gcloud-auth-plugin.

  1. Définissez les variables d'environnement :

    APISERVER=https://$(gcloud container clusters describe CLUSTER_NAME \
        --location=COMPUTE_LOCATION --format "value(endpoint)")
    TOKEN=$(gcloud auth print-access-token)
    
  2. Vérifiez que votre jeton d'accès est valide:

    curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
    

    Lorsque vous disposez d'un jeton d'accès valide, cette commande envoie une requête au serveur OAuth 2.0 de Google, qui répond avec des informations sur le jeton.

  3. Essayez de vous connecter au point de terminaison de l'API principale sur le serveur d'API :

    # 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
    

    Si la commande curl aboutit, une liste d'espaces de noms s'affiche. Vérifiez si le plug-in est à l'origine du problème en suivant les étapes de la section Configurer le plug-in dans kubeconfig.

    Si la commande curl échoue et affiche un résultat semblable au résultat suivant, cela signifie que vous ne disposez pas des autorisations appropriées pour accéder au cluster :

    {
    "kind": "Status",
    "apiVersion": "v1",
    "metadata": {},
    "status": "Failure",
    "message": "Unauthorized",
    "reason": "Unauthorized",
    "code": 401
    }
    

    Pour résoudre ce problème, consultez votre administrateur pour obtenir les autorisations appropriées pour accéder au cluster.

Configurer l'utilisation du plug-in dans kubeconfig

Si vous recevez des erreurs d'authentification et d'autorisation lorsque vous vous connectez à vos clusters, mais que vous avez pu vous connecter au cluster à l'aide de curl, assurez-vous que vous pouvez accéder à votre cluster sans avoir besoin du plug-in gke-gcloud-auth-plugin.

Pour résoudre ce problème, configurez votre environnement local pour qu'il ignore le binaire gke-gcloud-auth-plugin lors de l'authentification auprès du cluster. Dans les clients Kubernetes exécutant la version 1.25 ou ultérieure, le binaire gke-gcloud-auth-plugin est obligatoire. Vous devez donc utiliser la version 1.24 ou antérieure de l'outil de ligne de commande kubectl.

Pour accéder à votre cluster sans avoir besoin du plug-in, procédez comme suit :

  1. Installez l'outil de ligne de commande kubectl version 1.24 ou antérieure à l'aide de curl. L'exemple suivant installe l'outil avec la version 1.24:

    curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
    
  2. Ouvrez votre fichier de script de démarrage shell dans un éditeur de texte. Par exemple, ouvrez .bashrc pour le shell Bash:

    vi ~/.bashrc
    

    Si vous utilisez macOS, utilisez ~/.bash_profile au lieu de .bashrc dans ces instructions.

  3. Ajoutez la ligne suivante au fichier de script de démarrage, puis enregistrez-le:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=False
    
  4. Exécutez le script de démarrage:

    source ~/.bashrc
    
  5. Obtenez les identifiants de votre cluster, qui configure votre fichier .kube/config:

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=COMPUTE_LOCATION
    

    Remplacez les éléments suivants :

  6. Exécutez une commande kubectl. Exemple :

    kubectl cluster-info
    

    Si vous obtenez une erreur 401 ou une erreur d'autorisation similaire après avoir exécuté ces commandes, assurez-vous de disposer des autorisations appropriées, puis exécutez à nouveau l'étape qui a renvoyé l'erreur.

Erreur 400: le pool de nœuds nécessite la recréation

L'erreur suivante peut se produire lorsque vous essayez d'effectuer une action qui recrée votre plan de contrôle et vos nœuds:

ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.

Par exemple, cette erreur peut se produire lorsque vous terminez une rotation des identifiants en cours.

Sur le backend, les pools de nœuds sont marqués pour recréation, mais l'opération de recréation réelle peut prendre un certain temps. Par conséquent, l'opération échoue, car GKE n'a pas encore recréé un ou plusieurs pools de nœuds dans votre cluster.

Pour résoudre ce problème, choisissez l'une des solutions suivantes:

  • Attendez que la recréation ait lieu. Cette opération peut prendre plusieurs heures, jours ou semaines, en fonction de facteurs tels que les intervalles de maintenance et les exclusions existants.
  • Démarrez manuellement une recréation des pools de nœuds concernés en démarrant une mise à niveau de version vers la même version que le plan de contrôle.

    Pour lancer une recréation, exécutez la commande suivante:

    gcloud container clusters upgrade CLUSTER_NAME \
        --node-pool=POOL_NAME
    

    Une fois la mise à niveau terminée, relancez l'opération.

Erreur 401 : "Unauthorized" (Opération non autorisée)

GKE utilise des comptes de service IAM associés à vos nœuds pour exécuter des tâches système telles que la journalisation et la surveillance. Ces comptes de service de nœud doivent au minimum disposer du rôle Compte de service de nœud par défaut Kubernetes Engine (roles/container.defaultNodeServiceAccount) sur votre projet. Par défaut, GKE utilise le compte de service Compute Engine par défaut, qui est créé automatiquement dans votre projet, comme compte de service de nœud.

Si votre organisation applique la contrainte de règle d'administration iam.automaticIamGrantsForDefaultServiceAccounts, le compte de service Compute Engine par défaut de votre projet risque de ne pas recevoir automatiquement les autorisations requises pour GKE.

  1. Recherchez le nom du compte de service utilisé par vos nœuds:

    Console

    1. Accédez à la page Clusters Kubernetes:

      Accéder à la page "Clusters Kubernetes"

    2. Dans la liste des clusters, cliquez sur le nom du cluster que vous souhaitez inspecter.
    3. Selon le mode de fonctionnement du cluster, effectuez l'une des opérations suivantes :
      • Pour les clusters en mode Autopilot, dans la section Sécurité, recherchez le champ Compte de service.
      • Pour les clusters en mode Standard, procédez comme suit :
        1. Cliquez sur l'onglet Nœuds.
        2. Dans le tableau Pools de nœuds, cliquez sur le nom d'un pool de nœuds. La page Détails du pool de nœuds s'ouvre.
        3. Dans la section Sécurité, recherchez le champ Compte de service.

    Si la valeur du champ Compte de service est default, vos nœuds utilisent le compte de service Compute Engine par défaut. Si la valeur de ce champ n'est pas default, vos nœuds utilisent un compte de service personnalisé. Pour attribuer le rôle requis à un compte de service personnalisé, consultez la section Utiliser le principe du moindre privilège pour les comptes de service IAM.

    gcloud

    Pour les clusters en mode Autopilot, exécutez la commande suivante:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccount

    Pour les clusters en mode Standard, exécutez la commande suivante:

    gcloud container clusters describe CLUSTER_NAME \
        --location=LOCATION \
        --format="table(nodePools.name,nodePools.config.serviceAccount)"

    Si la sortie est default, vos nœuds utilisent le compte de service Compute Engine par défaut. Si la sortie n'est pas default, vos nœuds utilisent un compte de service personnalisé. Pour attribuer le rôle requis à un compte de service personnalisé, consultez la section Utiliser le principe du moindre privilège pour les comptes de service IAM.

  2. Pour attribuer le rôle roles/container.defaultNodeServiceAccount au compte de service Compute Engine par défaut, procédez comme suit:

    Console

    1. Accédez à la page Bienvenue:

      Accéder à "Bienvenue"

    2. Dans le champ Numéro du projet, cliquez sur Copier dans le presse-papiers.
    3. Accédez à la page IAM :

      Accéder à IAM

    4. Cliquez sur Accorder l'accès.
    5. Dans le champ Nouveaux comptes principaux, spécifiez la valeur suivante:
      PROJECT_NUMBER-compute@developer.gserviceaccount.com
      Remplacez PROJECT_NUMBER par le numéro de projet que vous avez copié.
    6. Dans le menu Select a role (Sélectionner un rôle), sélectionnez le rôle Compte de service de nœud par défaut Kubernetes Engine.
    7. Cliquez sur Enregistrer.

    gcloud

    1. Recherchez votre numéro de projet Google Cloud :
      gcloud projects describe PROJECT_ID \
          --format="value(projectNumber)"

      Remplacez PROJECT_ID par l'ID du projet.

      Le résultat ressemble à ce qui suit :

      12345678901
      
    2. Attribuez le rôle roles/container.defaultNodeServiceAccount au compte de service Compute Engine par défaut:
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
          --role="roles/container.defaultNodeServiceAccount"

      Remplacez PROJECT_NUMBER par le numéro de projet de l'étape précédente.

Erreur 403: autorisations insuffisantes

L'erreur suivante se produit lorsque vous essayez de vous connecter à un cluster GKE à l'aide de gcloud container clusters get-credentials, mais que le compte n'est pas autorisé à accéder au serveur d'API Kubernetes:

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

Pour résoudre ce problème, procédez comme suit :

  1. Identifiez le compte présentant le problème d'accès:

    gcloud auth list
    
  2. Accordez l'accès requis au compte en suivant les instructions de la section S'authentifier auprès du serveur d'API Kubernetes.

Erreur 403 : budget de nouvelle tentative épuisé

L'erreur suivante peut se produire lorsque vous essayez de créer un cluster GKE:

Error: googleapi: Error 403: Retry budget exhausted: Google Compute Engine:
Required permission 'PERMISSION_NAME' for 'RESOURCE_NAME'.

Dans ce message d'erreur, les variables suivantes s'appliquent :

  • PERMISSION_NAME : nom d'une autorisation, comme compute.regions.get.
  • RESOURCE_NAME: chemin d'accès à la ressource Google Cloudà laquelle vous tentiez d'accéder, comme une région Compute Engine.

Cette erreur se produit si le compte de service IAM associé au cluster ne dispose pas des autorisations minimales requises pour créer le cluster.

Pour résoudre ce problème, procédez comme suit :

  1. Créez ou modifiez un compte de service IAM pour disposer de toutes les autorisations requises pour exécuter un cluster GKE. Pour obtenir des instructions, consultez la section Utiliser le principe du moindre privilège pour les comptes de service IAM.
  2. Spécifiez le compte de service IAM mis à jour dans la commande de création de votre cluster à l'aide de l'option --service-account. Pour obtenir des instructions, consultez la section Créer un cluster Autopilot.

Vous pouvez également omettre l'option --service-account pour permettre à GKE d'utiliser le compte de service Compute Engine par défaut dans le projet, qui dispose des autorisations requises par défaut.

Erreur 404: ressource introuvable

Si vous obtenez l'erreur 404 de type "Ressource introuvable" lorsque vous appelez des commandes gcloud container, résolvez le problème en vous authentifiant à nouveau auprès de Google Cloud CLI:

gcloud auth login

Erreur 400/403 : le compte n'est pas autorisé à apporter des modifications

L'erreur 400 ou 403 de type "Le compte n'est pas autorisé à apporter des modifications" indique que l'un des éléments suivants a été supprimé ou modifié manuellement :

Lorsque vous activez l'API Compute Engine ou Kubernetes Engine, Google Cloudcrée les comptes de service et les agents suivants:

  • Compte de service Compute Engine par défaut de votre projet. GKE associe ce compte de service aux nœuds par défaut pour les tâches système telles que la journalisation et la surveillance.
  • Agent de service des API Google dans un projet géré par Google, avec des autorisations de modification sur votre projet.
  • Agent de service Google Kubernetes Engine dans un projet géré par Google, avec le rôle Agent de service Kubernetes Engine sur votre projet.

La création du cluster et toute la gestion échouent si, à un moment donné, quelqu'un modifie ces autorisations, supprime les liaisons de rôles sur le projet, supprime entièrement le compte de service ou désactive l'API.

Vérifier les autorisations de l'agent de service GKE

Pour vérifier si le compte de service Google Kubernetes Engine dispose du rôle Agent de service Kubernetes Engine sur le projet, procédez comme suit:

  1. Identifiez le nom de votre compte de service Google Kubernetes Engine. Tous les comptes de service ont le format suivant:

    service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
    

    Remplacez PROJECT_NUMBER par votre numéro de projet.

  2. Vérifiez que le rôle Agent de service Kubernetes Engine n'est pas attribué à votre compte de service Google Kubernetes Engine sur le projet:

    gcloud projects get-iam-policy PROJECT_ID
    

    Remplacez PROJECT_ID par l'ID du projet.

Pour résoudre le problème, si quelqu'un a supprimé le rôle Agent de service Kubernetes Engine de votre compte de service Google Kubernetes Engine, ajoutez-le à nouveau. Sinon, suivez les instructions ci-dessous pour réactiver l'API Kubernetes Engine, qui restaurera vos comptes de service et vos autorisations:

Console

  1. Accédez à la page API et services de la console Google Cloud .

    Accéder aux API et services

  2. Sélectionnez votre projet.

  3. Cliquez sur Activer les API et les services.

  4. Recherchez Kubernetes, puis sélectionnez l'API dans les résultats de la recherche.

  5. Cliquez sur Activer. Si vous avez déjà activé l'API, vous devez d'abord la désactiver, puis la réactiver. L'activation de l'API et des services associés peut prendre plusieurs minutes.

gcloud

Exécutez les commandes suivantes dans gcloud CLI:

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

Étape suivante

Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.