Cette page explique comment résoudre les problèmes liés à l'utilisation de Google Kubernetes Engine (GKE).
Si vous avez besoin d'aide supplémentaire, contactez l'assistance Cloud Customer Care.Déboguer des ressources Kubernetes
Pour les ressources Kubernetes, si vous rencontrez un problème avec :
Votre cluster : consultez la section Dépannage des clusters dans la documentation de Kubernetes.
Votre application, ses pods ou son objet contrôleur : consultez la section Dépannage des applications.
Résoudre les problèmes liés à la commande kubectl
Cette section contient les étapes de dépannage pour plusieurs types de problèmes liés à la commande kubectl
.
Problème : la commande kubectl
est introuvable
Si vous recevez un message indiquant que la commande kubectl
est introuvable, réinstallez le binaire kubectl
et définissez votre variable d'environnement $PATH
:
Installez le binaire
kubectl
en exécutant la commande suivante :gcloud components update kubectl
Répondez "Oui" lorsque le programme d'installation vous invite à modifier votre variable d'environnement
$PATH
. La modification de cette variable vous permet d'utiliser les commandeskubectl
sans avoir à saisir leur chemin d'accès complet.Vous pouvez également ajouter la ligne suivante à l'emplacement où votre interface système stocke les variables d'environnement, par exemple
~/.bashrc
(ou~/.bash_profile
sous macOS) :export PATH=$PATH:/usr/local/share/google/google-cloud-sdk/bin/
Exécutez la commande suivante pour charger votre fichier mis à jour. L'exemple suivant utilise
.bashrc
.source ~/.bashrc
Si vous utilisez macOS, utilisez
~/.bash_profile
au lieu de.bashrc
.
Problème : les commandes kubectl
renvoient une erreur de type "connexion refusée"
Si les commandes kubectl
renvoient une erreur de type "connexion refusée", vous devez définir le contexte de cluster à l'aide de la commande suivante :
gcloud container clusters get-credentials CLUSTER_NAME
Si vous ne savez pas quoi indiquer pour CLUSTER_NAME
, utilisez la commande suivante pour répertorier vos clusters :
gcloud container clusters list
Erreur : la commande kubectl
a expiré
Si vous avez créé un cluster et que vous avez tenté d'exécuter la commande kubectl
sur le cluster, mais que la commande kubectl
a expiré, un message d'erreur s'affiche, par exemple :
Unable to connect to the server: dial tcp IP_ADDRESS: connect: connection timed out
Unable to connect to the server: dial tcp IP_ADDRESS: i/o timeout
.
Ces erreurs indiquent que kubectl
ne parvient pas à communiquer avec le plan de contrôle du cluster.
Pour résoudre ce problème, vérifiez et définissez le contexte dans lequel le cluster est défini, puis assurez-vous de la connectivité au cluster :
Accédez à
$HOME/.kube/config
ou exécutez la commandekubectl config view
pour vérifier que le fichier de configuration contient le contexte du cluster et l'adresse IP externe du plan de contrôle.Définissez les identifiants du cluster:
gcloud container clusters get-credentials CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --project=PROJECT_ID
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCOMPUTE_LOCATION
: emplacement Compute Engine.PROJECT_ID
: ID du projet dans lequel le cluster GKE a été créé.
Si le cluster est un cluster GKE privé, assurez-vous que sa liste des réseaux autorisés existants inclut l'adresse IP sortante de la machine à partir de laquelle vous essayez de vous connecter. Les réseaux autorisés existants sont visibles dans la console ou au moyen de la commande suivante :
gcloud container clusters describe CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --project=PROJECT_ID \ --format "flattened(masterAuthorizedNetworksConfig.cidrBlocks[])"
Si l'adresse IP sortante de la machine ne figure pas dans la liste des réseaux autorisés à partir du résultat de la commande précédente, procédez comme suit :
- Si vous utilisez la console, suivez les instructions de la section Impossible d'atteindre le plan de contrôle d'un cluster privé.
- Si vous vous connectez depuis Cloud Shell, suivez les instructions de la section Utiliser Cloud Shell pour accéder à un cluster privé.
Erreur : les commandes kubectl
renvoient une erreur de type "échec de négociation d'une version d'API"
Si les commandes kubectl
renvoient une erreur "échec de négociation d'une version d'API", vous devez vous assurer que kubectl
dispose des identifiants d'authentification :
gcloud auth application-default login
Problème : les commandes kubectl
logs
, attach
, exec
et port-forward
cessent de répondre
Si les commandes kubectl
logs
, attach
, exec
ou port-forward
cessent de répondre, le serveur d'API est généralement incapable de communiquer avec les nœuds.
Tout d'abord, vérifiez si votre cluster comporte des nœuds. Si vous avez réduit à zéro le nombre de nœuds du cluster, les commandes ne fonctionnent pas. Pour résoudre ce problème, redimensionnez le cluster afin de disposer d'au moins un nœud.
Si votre cluster comporte au moins un nœud, vérifiez si vous utilisez des tunnels SSH ou proxy Konnectivity pour activer la communication sécurisée. Les sections suivantes décrivent les étapes de dépannage spécifiques à chaque approche :
Résoudre les problèmes liés à SSH
Si vous utilisez SSH, GKE enregistre un fichier de clé publique SSH dans les métadonnées de votre projet Compute Engine. Toutes les VM Compute Engine utilisant des images fournies par Google vérifient régulièrement les métadonnées communes de leur projet et celles de leur instance pour détecter les clés SSH à ajouter à la liste des utilisateurs autorisés de la VM. GKE ajoute également à votre réseau Compute Engine une règle de pare-feu qui autorise l'accès SSH à chaque nœud du cluster à partir de l'adresse IP du plan de contrôle.
Les problèmes liés à SSH peuvent être dus aux causes suivantes :
Les règles de pare-feu de votre réseau n'autorisent pas l'accès SSH depuis le plan de contrôle.
Tous les réseaux Compute Engine sont créés avec une règle de pare-feu appelée
default-allow-ssh
qui autorise l'accès SSH à partir de toutes les adresses IP (clé privée valide requise). GKE insère également une règle SSH pour chaque cluster public sous la formegke-CLUSTER_NAME-RANDOM_CHARACTERS-ssh
. Cette règle autorise l'accès SSH spécifiquement à partir de l'adresse IP du plan de contrôle vers les nœuds du cluster.Si aucune de ces règles n'existe, le plan de contrôle ne peut pas ouvrir les tunnels SSH.
Pour vérifier que c'est la cause du problème, vérifiez si votre configuration comporte ces règles.
Pour résoudre ce problème, identifiez le tag présent sur tous les nœuds du cluster, puis ajoutez à nouveau une règle de pare-feu permettant d'accéder aux VM avec ce tag à partir de l'adresse IP du plan de contrôle.
L'entrée des métadonnées communes de votre projet pour
ssh-keys
est saturée.Si l'entrée de métadonnées du projet nommée "ssh-keys" est proche de la limite de taille maximale, GKE ne peut pas ajouter sa propre clé SSH pour ouvrir des tunnels SSH.
Pour vérifier qu'il s'agit bien du problème, vérifiez la longueur de la liste des clés SSH. Vous pouvez voir les métadonnées de votre projet en exécutant la commande suivante, en incluant éventuellement l'option
--project
:gcloud compute project-info describe [--project=PROJECT_ID]
Pour résoudre ce problème, supprimez les clés SSH dont vous n'avez plus besoin.
Vous avez défini un champ de métadonnées avec la clé "ssh-keys" sur les VM du cluster.
L'agent de nœud sur les VM utilise préférentiellement les clés SSH propres à une instance plutôt que celles définies à l'échelle du projet. Par conséquent, si vous avez défini des clés SSH spécifiquement sur les nœuds du cluster, la clé SSH du plan de contrôle dans les métadonnées du projet n'est pas respectée par les nœuds.
Pour vérifier qu'il s'agit bien du problème, exécutez
gcloud compute instances describe VM_NAME
et recherchez un champssh-keys
dans les métadonnées.Pour résoudre le problème, supprimez les clés SSH par instance des métadonnées de l'instance.
Résoudre les problèmes liés au proxy Konnectivity
Vous pouvez déterminer si votre cluster utilise le proxy Konnectivity en vérifiant le déploiement système suivant :
kubectl get deployments konnectivity-agent --namespace kube-system
Les problèmes liés au proxy Konnectivity peuvent être dus aux causes suivantes :
Les règles de pare-feu de votre réseau n'autorisent pas l'agent Konnectivity à accéder au plan de contrôle.
Lors de la création du cluster, les pods de l'agent Konnectivity établissent et maintiennent une connexion au plan de contrôle sur le port
8132
. Lorsque l'une des commandeskubectl
est exécutée, le serveur d'API utilise cette connexion pour communiquer avec le cluster.Si les règles de pare-feu de votre réseau contiennent une ou plusieurs règles de refus du trafic sortant, l'agent peut empêcher la connexion.
Pour vérifier que c'est la cause du problème, vérifiez les règles de pare-feu de votre réseau afin de voir si elles contiennent une ou plusieurs règles de refus du trafic sortant.
Pour résoudre ce problème, autorisez le trafic de sortie vers le plan de contrôle du cluster sur le port 8132. (Par exemple, le serveur d'API utilise 443.)
La règle de réseau de votre cluster bloque le trafic entrant depuis l'espace de noms
kube-system
vers l'espace de nomsworkload
.Ces fonctionnalités ne sont pas nécessaires au bon fonctionnement du cluster. Si vous préférez empêcher tout accès extérieur au réseau de votre cluster, sachez que ces fonctionnalités ne sont pas opérationnelles.
Pour vérifier que c'est la cause du problème, recherchez les règles de réseau dans l'espace de noms concerné en exécutant la commande suivante :
kubectl get networkpolicy --namespace AFFECTED_NAMESPACE
Pour résoudre ce problème, ajoutez le code suivant au champ
spec.ingress
des règles réseau :- from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: konnectivity-agent
Résoudre les problèmes d'erreur 4xx
Les sections suivantes vous aident à résoudre les erreurs 400, 401, 403 et 404, ainsi que les erreurs d'authentification et d'autorisation associées.
Problème : erreurs d'authentification et d'autorisation lors de la connexion aux clusters GKE
Lorsque vous vous connectez à des clusters GKE, vous pouvez recevoir une erreur d'authentification et d'autorisation avec le code d'état HTTP 401 (Accès non autorisé). 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, suivez les étapes décrites dans les sections suivantes :
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 la CLI kubectl
et le plug-in gke-gcloud-auth-plugin
.
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)
Vérifiez que votre jeton d'accès est valide:
curl https://oauth2.googleapis.com/tokeninfo?access_token=$TOKEN
Essayez de vous connecter au point de terminaison de l'API principale sur le serveur d'API :
gcloud container clusters describe CLUSTER_NAME --location=COMPUTE_LOCATION --format "value(masterAuth.clusterCaCertificate)" | base64 -d > /tmp/ca.crt curl -s -X GET "${APISERVER}/api/v1/namespaces" --header "Authorization: Bearer $TOKEN" --cacert /tmp/ca.crt
Si la commande
curl
réussit, 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, obtenez 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 la CLI kubectl
.
Pour accéder à votre cluster sans avoir besoin du plug-in, procédez comme suit :
Installez la version 1.24 de la CLI
kubectl
à l'aide decurl
:curl -LO https://dl.k8s.io/release/v1.24.0/bin/linux/amd64/kubectl
Vous pouvez utiliser n'importe quelle version 1.24 de la CLI
kubectl
ou version antérieure.Ouvrez votre fichier de script de démarrage shell, tel que
.bashrc
pour l'interface système Bash, dans un éditeur de texte:vi ~/.bashrc
Si vous utilisez MacOS, utilisez
~/.bash_profile
au lieu de.bashrc
dans ces instructions.Ajoutez la ligne suivante au fichier et enregistrez-le:
export USE_GKE_GCLOUD_AUTH_PLUGIN=False
Exécutez le script de démarrage:
source ~/.bashrc
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 :
CLUSTER_NAME
: nom du cluster.COMPUTE_LOCATION
: emplacement Compute Engine.
Exécutez une commande
kubectl
:kubectl cluster-info
Si vous obtenez une erreur 401 ou une erreur d'autorisation similaire lors de l'exécution de 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
Une erreur 400 de type "le pool de nœuds nécessite la recréation" ressemble à ce qui suit :
ERROR: (gcloud.container.clusters.update) ResponseError: code=400, message=Node pool "test-pool-1" requires recreation.
Cette erreur se produit lorsque vous essayez d'effectuer une action qui recrée votre plan de contrôle et vos nœuds. 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. 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, effectuez l'une des opérations 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 403: autorisations insuffisantes
Une erreur 403 de type "autorisations insuffisantes" ressemble à ce qui suit :
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>".
Cette erreur 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.
Pour résoudre ce problème, procédez comme suit :
Identifiez le compte présentant le problème d'accès:
gcloud auth list
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 se produit 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, commecompute.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 :
- 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.
- 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 lors de l'appel des commandes gcloud container
Si vous obtenez l'erreur 403 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 :
- Votre compte de service Compute Engine par défaut.
- L'agent de service des API Google
- Le compte de service associé à GKE.
Lorsque vous activez l'API Compute Engine ou Kubernetes Engine, Google Cloud crée les comptes de service et les agents suivants:
- Compte de service Compute Engine par défaut : dispose de droits de modification sur votre projet.
- Agent de service des API Google avec des autorisations de modification sur votre projet.
- Compte de service Google Kubernetes Engine avec le rôle Agent de service Kubernetes Engine sur votre projet.
La création du cluster et toutes les fonctionnalités de 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.
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 :
Utilisez le modèle suivant pour calculer le nom de votre compte de service Google Kubernetes Engine :
service-PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
Remplacez
PROJECT_NUMBER
par votre numéro de projet.Vérifiez que le rôle Agent de service Kubernetes Engine n'est pas encore attribué à votre compte de service Google Kubernetes Engine sur le projet. Dans cette commande, remplacez
PROJECT_ID
par l'ID de votre projet :gcloud projects get-iam-policy PROJECT_ID
Pour résoudre ce 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 correctement vos comptes de service et vos autorisations.
Console
Accédez à la page API et services de la console Google Cloud.
Sélectionnez votre projet.
Cliquez sur Activer les API et les services.
Recherchez Kubernetes, puis sélectionnez l'API dans les résultats de la recherche.
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 la commande suivante 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
Résoudre les problèmes liés à la création de clusters GKE
Erreur CONDITION_NOT_MET: la contrainte constraints/compute.vmExternalIpAccess a été enfreinte
La contrainte de règle d'administration constraints/compute.vmExternalIpAccess est configurée sur Deny All
ou pour limiter les adresses IP externes à des instances de VM spécifiques au niveau de l'organisation, du dossier ou du projet dans lequel vous essayez de créer une cluster GKE public.
Lorsque vous créez des clusters GKE publics, des adresses IP externes sont attribuées aux VM Compute Engine sous-jacentes, qui constituent les nœuds de calcul de ce cluster. Si vous configurez la contrainte de règle d'administration constraints/compute.vmExternalIpAccess sur Deny All
ou pour limiter les adresses IP externes à des instances de VM spécifiques, la règle empêche les nœuds de calcul GKE d'obtenir des adresses IP externes, ce qui entraîne l'échec de la création du cluster.
Pour trouver les journaux de l'opération de création de cluster, vous pouvez consulter les journaux d'audit des opérations de cluster GKE à l'aide de l'explorateur de journaux avec une requête de recherche semblable à la suivante:
resource.type="gke_cluster"
logName="projects/test-last-gke-sa/logs/cloudaudit.googleapis.com%2Factivity"
protoPayload.methodName="google.container.v1beta1.ClusterManager.CreateCluster"
resource.labels.cluster_name="CLUSTER_NAME"
resource.labels.project_id="PROJECT_ID"
Pour résoudre ce problème, assurez-vous que la règle en vigueur pour la contrainte constraints/compute.vmExternalIpAccess
est Allow All
sur le projet dans lequel vous essayez de créer un cluster public GKE. Pour plus d'informations sur l'utilisation de cette contrainte, consultez la page Limiter les adresses IP externes à des instances de VM spécifiques. Après avoir défini cette contrainte sur Allow All
, supprimez le cluster défaillant et créez-en un autre. Cette étape est nécessaire, car il n'est pas possible de réparer le cluster défaillant.
Résoudre les problèmes liés aux charges de travail déployées
GKE renvoie une erreur en cas de problème avec les pods d'une charge de travail.
Vous pouvez vérifier l'état d'un pod à l'aide de l'outil de ligne de commande kubectl
ou de la console Google Cloud.
kubectl
Pour afficher tous les pods exécutés dans votre cluster, utilisez la commande suivante :
kubectl get pods
Résultat :
NAME READY STATUS RESTARTS AGE
POD_NAME 0/1 CrashLoopBackOff 23 8d
Pour obtenir plus d'informations sur un pod spécifique, exécutez la commande suivante :
kubectl describe pod POD_NAME
Remplacez POD_NAME
par le nom du pod souhaité.
Console
Procédez comme suit :
Accédez à la page Charges de travail dans la console Google Cloud.
Sélectionnez la charge de travail souhaitée. L'onglet Aperçu affiche l'état de la charge de travail.
Dans la section Pods gérés, cliquez sur le message d'état d'erreur.
Les sections suivantes expliquent certaines erreurs courantes renvoyées par les charges de travail et indiquent comment les corriger.
Erreur : CrashLoopBackOff
CrashLoopBackOff
indique qu'un conteneur plante de manière répétée après le redémarrage. Un conteneur peut planter pour plusieurs raisons. La consultation des journaux d'un pod peut aider à en identifier la cause.
Par défaut, les conteneurs qui ont planté redémarrent avec un délai exponentiel limité à cinq minutes. Vous pouvez modifier ce comportement en définissant la spécification de pod du déploiement de champ restartPolicy
sous spec: restartPolicy
. La valeur par défaut du champ est Always
.
Vous pouvez résoudre les erreurs CrashLoopBackOff
à l'aide de la console Google Cloud:
Accédez au playbook interactif sur le plantage en boucle des pods :
Pour
Cluster, saisissez le nom du cluster que vous souhaitez dépanner.Pour l'espace de noms
, saisissez l'espace de noms que vous souhaitez dépanner.(Facultatif) Créez une alerte pour être informé des futures erreurs de
CrashLoopBackOff
:- Dans la section Conseils d'atténuation futurs, sélectionnez Créer une alerte.
Journaux d'inspection
Vous pouvez déterminer la raison pour laquelle le conteneur de votre pod plante en utilisant l'outil de ligne de commande kubectl
ou la console Google Cloud.
kubectl
Pour afficher tous les pods exécutés dans votre cluster, utilisez la commande suivante :
kubectl get pods
Recherchez le pod avec l'erreur CrashLoopBackOff
.
Pour obtenir les journaux du pod, exécutez la commande suivante :
kubectl logs POD_NAME
Remplacez POD_NAME
par le nom du pod qui pose problème.
Vous pouvez également transmettre l'option -p
pour obtenir les journaux de l'instance précédente du conteneur d'un pod, si elle existe.
Console
Procédez comme suit :
Accédez à la page Charges de travail dans la console Google Cloud.
Sélectionnez la charge de travail souhaitée. L'onglet Aperçu affiche l'état de la charge de travail.
Dans la section Pods gérés, cliquez sur le pod qui pose problème.
Dans le menu du pod, cliquez sur l'onglet Journaux.
Vérifier le code de sortie du conteneur qui plante
Vous pouvez trouver le code de sortie en effectuant les tâches suivantes :
Exécutez la commande suivante :
kubectl describe pod POD_NAME
Remplacez
POD_NAME
par le nom du pod.Vérifiez la valeur du champ
containers: CONTAINER_NAME: last state: exit code
:- Si le code de sortie est 1, le conteneur a planté car l'application a planté.
- Si le code de sortie est 0, vérifiez la durée d'exécution de l'application.
Les conteneurs se ferment à la fin du processus principal de l'application. Si l'exécution de l'application se termine très rapidement, il arrive que le conteneur continue à redémarrer.
Se connecter à un conteneur en cours d'exécution
Ouvrez une interface système sur le pod :
kubectl exec -it POD_NAME -- /bin/bash
Si le pod comporte plusieurs conteneurs, ajoutez -c CONTAINER_NAME
.
Vous pouvez maintenant exécuter les commandes bash à partir du conteneur : vous pouvez tester le réseau, ou vérifier si vous avez accès aux fichiers ou aux bases de données qu'utilise votre application.
Erreurs ImagePullBackOff et ErrImagePull
ImagePullBackOff
et ErrImagePull
indiquent que l'image utilisée par un conteneur ne peut pas être chargée à partir du registre d'images.
Vous pouvez examiner ce problème à l'aide de la console Google Cloud ou de l'outil de ligne de commande kubectl
.
kubectl
Pour obtenir plus d'informations sur l'image de conteneur d'un pod, exécutez la commande suivante :
kubectl describe pod POD_NAME
Console
Procédez comme suit :
Accédez à la page Charges de travail dans la console Google Cloud.
Sélectionnez la charge de travail souhaitée. L'onglet Aperçu affiche l'état de la charge de travail.
Dans la section Pods gérés, cliquez sur le pod qui pose problème.
Dans le menu du pod, cliquez sur l'onglet Événements.
Problème : si l'image est introuvable
Si votre image est introuvable :
- Vérifiez que le nom de l'image est correct.
- Vérifiez que le tag de l'image est correct. (Essayez
:latest
ou aucun tag pour extraire la dernière image). - Si le chemin d'accès au registre de l'image est complet, vérifiez qu'il existe dans le registre Docker que vous utilisez. Si vous ne fournissez que le nom de l'image, vérifiez le registre Docker Hub.
Essayez d'extraire l'image Docker manuellement :
Connectez-vous en SSH sur le nœud :
Par exemple, pour vous connecter en SSH à une VM:
gcloud compute ssh VM_NAME --zone=ZONE_NAME
Remplacez les éléments suivants :
VM_NAME
: nom de la VM.ZONE_NAME
: une zone Compute Engine.
Exécutez
docker-credential-gcr configure-docker
. Cette commande génère un fichier de configuration dans/home/[USER]/.docker/config.json
. Assurez-vous que ce fichier inclut le registre de l'image dans le champcredHelpers
. Par exemple, le fichier suivant inclut des informations d'authentification pour les images hébergées dans les régions asia.gcr.io, eu.gcr.io, gcr.io, marketplace.gcr.io et us.gcr.io:{ "auths": {}, "credHelpers": { "asia.gcr.io": "gcr", "eu.gcr.io": "gcr", "gcr.io": "gcr", "marketplace.gcr.io": "gcr", "us.gcr.io": "gcr" } }
Exécutez
docker pull IMAGE_NAME
.
Si cette option fonctionne, vous devrez probablement spécifier ImagePullSecrets sur un pod. Les pods ne peuvent référencer que des codes secrets d'extraction d'image dans leur propre espace de noms. Ce processus doit donc être effectué une fois par espace de noms.
Erreur : Autorisation refusée
Si vous rencontrez une erreur "Autorisation refusée" ou "Aucun accès en extraction", vérifiez que vous êtes connecté et/ou que vous avez accès à l'image. Essayez l'une des méthodes suivantes en fonction du registre dans lequel vous hébergez vos images.
Artifact Registry
Si votre image se trouve dans Artifact Registry, le compte de service de votre pool de nœuds doit disposer d'un accès en lecture au dépôt contenant l'image.
Attribuez le rôle artifactregistry.reader
au compte de service :
gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
--location=REPOSITORY_LOCATION \
--member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
--role="roles/artifactregistry.reader"
Remplacez les éléments suivants :
REPOSITORY_NAME
: nom de votre dépôt Artifact RegistryREPOSITORY_LOCATION
: région de votre dépôt Artifact RegistrySERVICE_ACCOUNT_EMAIL
: adresse e-mail du compte de service IAM associé à votre pool de nœuds.
Container Registry
Si votre image se trouve dans Container Registry, le compte de service de votre pool de nœuds doit disposer d'un accès en lecture au bucket Cloud Storage contenant l'image.
Attribuez le rôle roles/storage.objectViewer
au compte de service afin qu'il puisse lire le contenu du bucket:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
--member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
--role=roles/storage.objectViewer
Remplacez les éléments suivants :
SERVICE_ACCOUNT_EMAIL
: adresse e-mail du compte de service associé à votre pool de nœuds. Vous pouvez répertorier tous les comptes de service de votre projet à l'aide degcloud iam service-accounts list
.BUCKET_NAME
: nom du bucket Cloud Storage contenant vos images. Vous pouvez répertorier tous les buckets de votre projet à l'aide de la commandegcloud storage ls
.
Si votre administrateur de registre a configuré des dépôts gcr.io dans Artifact Registry pour stocker des images pour le domaine gcr.io
au lieu de Container Registry, vous devez accorder un accès en lecture à Artifact Registry plutôt que Container Registry.
Registre privé
Si votre image se trouve dans un registre privé, vous devrez peut-être disposer de clés pour y accéder. Pour plus d'informations, consultez la page Utiliser des registres privés.
Erreur 401 Opération non autorisée : impossible d'extraire des images du dépôt de registre de conteneurs privé
Une erreur semblable à la suivante peut se produire lorsque vous extrayez une image d'un dépôt Container Registry privé:
gcr.io/PROJECT_ID/IMAGE:TAG: rpc error: code = Unknown desc = failed to pull and
unpack image gcr.io/PROJECT_ID/IMAGE:TAG: failed to resolve reference
gcr.io/PROJECT_ID/IMAGE]:TAG: unexpected status code [manifests 1.0]: 401 Unauthorized
Warning Failed 3m39s (x4 over 5m12s) kubelet Error: ErrImagePull
Warning Failed 3m9s (x6 over 5m12s) kubelet Error: ImagePullBackOff
Normal BackOff 2s (x18 over 5m12s) kubelet Back-off pulling image
Identifiez le nœud exécutant le pod:
kubectl describe pod POD_NAME | grep "Node:"
Vérifiez que le nœud dispose du champ d'application de stockage:
gcloud compute instances describe NODE_NAME \ --zone=COMPUTE_ZONE --format="flattened(serviceAccounts[].scopes)"
Le niveau d'accès du nœud doit contenir au moins l'un des éléments suivants:
serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/devstorage.read_only serviceAccounts[0].scopes[0]: https://www.googleapis.com/auth/cloud-platform
Recréez le pool de nœuds auquel le nœud appartient avec un champ d'application suffisant. Vous ne pouvez pas modifier les nœuds existants. Vous devez les recréer avec le champ d'application approprié.
Recommandé: Créez un pool de nœuds avec le champ d'application
gke-default
:gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --scopes="gke-default"
Créez un pool de nœuds avec uniquement un champ d'application de stockage:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --zone=COMPUTE_ZONE \ --scopes="https://www.googleapis.com/auth/devstorage.read_only"
Erreur : Pod non programmable
PodUnschedulable
indique que votre pod ne peut pas être planifié en raison de ressources insuffisantes ou d'une erreur de configuration.
Si vous avez configuré votre cluster GKE pour envoyer des métriques de serveur d'API Kubernetes et de programmeur Kubernetes à Cloud Monitoring, vous trouverez plus d'informations sur ces erreurs dans les sections métriques du programmeur et métriques du serveur d'API.
Vous pouvez résoudre les erreurs PodUnschedulable
à l'aide de la console Google Cloud:
Accédez au playbook interactif des pods non programmables:
Pour
Cluster, saisissez le nom du cluster que vous souhaitez dépanner.Pour l'espace de noms
, saisissez l'espace de noms que vous souhaitez dépanner.(Facultatif) Créez une alerte pour être informé des futures erreurs de
PodUnschedulable
:- Dans la section Conseils d'atténuation futurs, sélectionnez Créer une alerte.
Erreur : Ressources insuffisantes
Vous pouvez rencontrer une erreur indiquant un manque de ressources processeur, de mémoire ou autre. Par exemple : "Aucun nœud disponible ne correspond à tous les prédicats : processeur insuffisant (2)" indique que sur deux nœuds, le processeur disponible est insuffisant pour répondre aux requêtes d'un pod.
Si les demandes de ressources de pod dépassent celles d'un seul nœud d'un pool de nœuds éligibles, GKE ne programme pas le pod et ne déclenche pas non plus le scaling à la hausse pour ajouter un nœud. Pour que GKE planifie le pod, vous devez soit demander moins de ressources pour le pod, soit créer un pool de nœuds disposant de suffisamment de ressources.
Vous pouvez également activer le provisionnement automatique des nœuds afin que GKE puisse créer automatiquement des pools de nœuds avec des nœuds sur lesquels les pods non planifiés peuvent s'exécuter.
Le nombre de requêtes par défaut sur le processeur est de 100 millions ou 10 % d'un processeur (ou un cœur).
Si vous souhaitez demander plus ou moins de ressources, indiquez la valeur dans la spécification de pod sous spec: containers: resources: requests
.
Erreur : MatchNodeSelector
MatchNodeSelector
indique qu’aucun nœud ne correspond au sélecteur de libellés du pod.
Pour vous en assurer, vérifiez les libellés indiqués dans le champ nodeSelector
de la spécification de pod, sous spec: nodeSelector
.
Pour savoir comment les nœuds de votre cluster sont libellés, exécutez la commande suivante :
kubectl get nodes --show-labels
Pour associer un libellé à un nœud, exécutez la commande suivante :
kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE
Remplacez les éléments suivants :
NODE_NAME
: nœud souhaité.LABEL_KEY
: clé de libellé.LABEL_VALUE
: valeur du libellé.
Pour plus d'informations, reportez-vous à l'article Affecter des pods à des nœuds.
Erreur : PodToleratesNodeTaints
PodToleratesNodeTaints
indique que le pod ne peut pas être programmé sur un nœud, car aucun nœud ne tolère actuellement sa propriété de rejet.
Pour vous en assurer, exécutez la commande suivante :
kubectl describe nodes NODE_NAME
Dans le résultat, examinez le champ Taints
, qui répertorie les paires valeur/clé et les effets de planification.
Si l'effet indiqué est NoSchedule
, alors aucun pod ne peut être planifié sur ce nœud sans la tolérance correspondante.
Pour résoudre ce problème, vous pouvez supprimer la propriété de rejet. Par exemple, pour supprimer le rejet NoSchedule, exécutez la commande suivante :
kubectl taint nodes NODE_NAME key:NoSchedule-
Erreur : PodFitsHostPorts
PodFitsHostPorts
indique qu'un port qu'un nœud tente d'utiliser est déjà en cours d'utilisation.
Pour résoudre ce problème, vérifiez la valeur hostPort
de la spécification de pod sous spec: containers: ports: hostPort
. Vous devrez peut-être remplacer cette valeur par un autre port.
Erreur : Disponibilité minimale non présente
Si un nœud dispose de ressources suffisantes mais que vous obtenez toujours le message Does not have minimum availability
, vérifiez l'état du pod. Si l'état est SchedulingDisabled
ou Cordoned
, le nœud ne peut pas planifier de nouveaux pods. Vous pouvez vérifier l'état d'un nœud à l'aide de la console Google Cloud ou de l'outil de ligne de commande kubectl
.
kubectl
Pour obtenir l'état de vos nœuds, exécutez la commande suivante :
kubectl get nodes
Pour activer la planification sur le nœud, exécutez cette commande :
kubectl uncordon NODE_NAME
Console
Procédez comme suit :
Accédez à la page Google Kubernetes Engine dans Google Cloud Console.
Sélectionnez le cluster souhaité. L'onglet Nœuds affiche les nœuds et leur état.
Pour activer la planification sur le nœud, procédez comme suit :
Dans la liste, cliquez sur le nœud souhaité.
Dans les détails du nœud, cliquez sur le bouton Reprendre l'ordonnancement.
Erreur : Nombre maximal de pods par nœud atteint
Si la limite Nombre maximal de pods par nœud est atteinte par tous les nœuds du cluster, les pods sont bloqués dans l'état non programmable. Sous l'onglet Événements du pod, un message contenant l'expression Too many pods
s'affiche.
Vérifiez la configuration
Maximum pods per node
à partir de l'onglet "Nœuds" dans les détails du cluster GKE dans la console Google Cloud.Obtenez la liste des nœuds:
kubectl get nodes
Pour chaque nœud, vérifiez le nombre de pods en cours d'exécution sur le nœud:
kubectl get pods -o wide | grep NODE_NAME | wc -l
Si la limite est atteinte, ajoutez un pool de nœuds ou ajoutez des nœuds supplémentaires au pool de nœuds existant.
Problème : Taille maximale du pool de nœuds atteinte avec l'autoscaler de cluster activé
Si le pool de nœuds a atteint sa Taille maximale Selon sa configuration d'autoscaler de cluster, GKE ne déclenche pas de scaling à la hausse pour le pod qui serait autrement programmé avec ce pool de nœuds. Si vous souhaitez que le pod soit planifié sur ce pool de nœuds, modifiez la configuration de l'autoscaler de cluster.
Problème : Taille maximale du pool de nœuds atteinte avec l'autoscaler de cluster désactivé
Si le pool de nœuds a atteint son nombre maximal de nœuds et que l'autoscaler de cluster est désactivé, GKE ne peut pas planifier le pod avec le pool de nœuds. Augmentez la taille de votre pool de nœuds ou activez l'autoscaler de cluster pour que GKE redimensionne automatiquement votre cluster.
Erreur : PersistentVolumeClaims non liés
Unbound PersistentVolumeClaims
indique que le pod fait référence à un objet PersistantVolumeClaim non lié. Cette erreur peut se produire en cas d'échec du provisionnement du PersistentVolume. Vous pouvez vérifier si le provisionnement a échoué en récupérant les événements associés au PersistentVolumeClaim et en examinant s'ils signalent un échec.
Pour obtenir la liste des événements, exécutez la commande suivante :
kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0
Remplacez les éléments suivants :
STATEFULSET_NAME
: nom de l'objet StatefulSet.PVC_NAME
: nom de l'objet PersistentVolumeClaim.
Cette erreur peut également être causée par une erreur de configuration lors du provisionnement manuel préalable d'un PersistentVolume et de sa liaison à un PersistentVolumeClaim. Dans ce cas, vous pouvez essayer de préprovisionner le volume à nouveau.
Erreur : quota insuffisant
Vérifiez que votre projet dispose d'un quota Compute Engine suffisant pour que GKE puisse effectuer le scaling à la hausse de votre cluster. Si GKE tente d'ajouter un nœud à votre cluster pour planifier le pod et que le scaling à la hausse dépasse le quota disponible de votre projet, vous recevez le message d'erreur scale.up.error.quota.exceeded
.
Pour en savoir plus, consultez la section Erreurs liées au scaling à la hausse.
Problème : API obsolètes
Assurez-vous de ne pas utiliser d'API obsolètes qui sont supprimées dans la version mineure de votre cluster. Pour en savoir plus, consultez la page Abandons de GKE.
Erreur: "Échec de l'allocation pour la plage 0: aucune adresse IP dans la plage définie"
Les versions 1.18.17 et ultérieures de GKE ont résolu un problème où des événements de mémoire saturée (OOM, Out Of Memory) entraînent une éviction de pod incorrecte si le pod était supprimé avant le démarrage de ses conteneurs. Cette éviction incorrecte peut entraîner des pods orphelins qui ont continué à posséder des adresses IP réservées de la plage de nœuds allouée.
Au fil du temps, GKE a épuisé ses adresses IP pour allouer de nouveaux pods en raison de l'accumulation de pods orphelins. Cela a généré le message d'erreur failed
to allocate for range 0: no IP addresses in range set
, car la plage de nœuds allouée n'avait pas d'adresses IP disponibles à attribuer à de nouveaux pods.
Pour résoudre ce problème, mettez à niveau le cluster et les pools de nœuds vers GKE 1.18.17 ou une version ultérieure.
Pour éviter ce problème et le résoudre sur les clusters avec des versions de GKE antérieures à 1.18.17, augmentez vos limites de ressources pour éviter les événements OOM à l'avenir, puis récupérez les adresses IP en supprimant les pods orphelins.
Vous pouvez également consulter les insights sur l'utilisation des adresses IP GKE.
Supprimer les pods orphelins des nœuds concernés
Vous pouvez supprimer les pods orphelins en drainant le nœud, en mettant à niveau le pool de nœuds ou en déplaçant les répertoires concernés.
Drainer le nœud (recommandé)
Marquez le nœud comme non programmable pour empêcher que de nouveaux pods se programment sur celui-ci :
kubectl cordon NODE
Remplacez
NODE
par le nom du nœud que vous souhaitez drainer.Drainez le nœud. GKE reprogramme automatiquement les pods gérés par les déploiements sur d'autres nœuds. Utilisez l'option
--force
pour drainer les pods orphelins qui ne disposent pas d'une ressource de gestion.kubectl drain NODE --force
Marquez le nœud comme non programmable pour permettre à GKE de programmer de nouveaux pods sur celui-ci :
kubectl uncordon NODE
Déplacer des répertoires concernés
Vous pouvez identifier les répertoires de pods orphelins dans /var/lib/kubelet/pods
et les déplacer hors du répertoire principal pour permettre à GKE d'arrêter les pods.
Résoudre les problèmes liés à l'arrêt des ressources
Problème : espace de noms bloqué à l'état Terminating
## Debug GKE Cluster Austoscaler issues with gcpdiag
gcpdiag
is an open source tool. It is not an officially supported Google Cloud product.
You can use the gcpdiag
tool to help you identify and fix Google Cloud
project issues. For more information, see the
gcpdiag project on GitHub.
This gcpdiag runbook investigates potential causes for GKE
Cluster Autoscaler failures while performing scale up or scale down operations.
It looks for the following error message in logs:
<ul>
<li><strong>scale.up.error.out.of.resources</strong></li>
<li><strong>scale.up.error.quota.exceeded</strong></li>
<li><strong>scale.up.error.waiting.for.instances.timeout</strong></li>
<li><strong>scale.up.error.ip.space.exhausted</strong></li>
<li><strong>scale.up.error.service.account.deleted</strong></li>
<li><strong>scale.down.error.failed.to.evict.pods</strong></li>
<li><strong>no.scale.down.node.node.group.min.size.reached</strong></li>
</ul>
Google Cloud console
- Complete and then copy the following command.
gcpdiag runbook gke/cluster-autoscaler --project=<var>PROJECT_ID</var> \\
--parameter name=<var>CLUSTER_NAME</var> \\
--parameter location=<var>LOCATION</var>
gcpdiag
, qui télécharge l'image Docker gcpdiag
, puis effectue des vérifications de diagnostic. Le cas échéant, suivez les instructions de sortie pour corriger les échecs de vérification.
Docker
Vous pouvez exécuter gcpdiag
à l'aide d'un wrapper qui démarre gcpdiag
dans un conteneur Docker. Docker ou Podman doivent être installés.
- Copiez et exécutez la commande suivante sur votre station de travail locale :
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
- Exécutez la commande
gcpdiag
../gcpdiag runbook gke/cluster-autoscaler --project=<var>PROJECT_ID</var> \\ --parameter name=<var>CLUSTER_NAME</var> \\ --parameter location=<var>LOCATION</var>
Affichez les paramètres disponibles pour ce runbook.
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet contenant la ressource. <li><var>CLUSTER_NAME</var> : nom du cluster GKE cible dans votre projet.</li> <li><var>LOCATION</var> : emplacement du cluster GKE cible (zone pour le cluster zonal ou région pour le cluster régional).</li>
Options utiles :
--project
: L'PROJECT_ID--universe-domain
: le cas échéant, le domaine cloud souverain du partenaire de confiance hébergeant la ressource.--parameter
ou-p
: paramètres du runbook
Pour obtenir la liste et la description de toutes les options de l'outil gcpdiag
, consultez les instructions d'utilisation de gcpdiag
.