Cette page explique comment résoudre les problèmes liés à l'outil de ligne de commande kubectl
lorsque vous travaillez dans Google Kubernetes Engine (GKE).
Pour obtenir des conseils plus généraux, consultez la section Dépannage de kubectl dans la documentation Kubernetes.
Erreurs d'authentification et d'autorisation
Si vous rencontrez des erreurs liées à l'authentification et à l'autorisation lorsque vous utilisez les commandes de l'outil de ligne de commande kubectl
, consultez les sections suivantes pour obtenir des conseils.
Erreur : 401 (Opération non autorisée)
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. Pour en savoir plus, consultez la section Problème : erreurs d'authentification et d'autorisation.
Erreur : champs d'application d'authentification insuffisants
Lorsque vous exécutez gcloud container clusters get-credentials
, vous pouvez recevoir l'erreur suivante :
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Request had insufficient authentication scopes.
Cette erreur se produit car vous tentez d'accéder à l'API GKE à partir d'une VM Compute Engine qui ne possède pas le champ d'application cloud-platform
.
Pour résoudre cette erreur, accordez l'étendue cloud-platform
manquante. Pour savoir comment modifier les champs d'application sur votre instance de VM Compute Engine, consultez la section Créer et activer des comptes de service pour les instances dans la documentation Compute Engine.
Erreur : l'exécutable gke-gcloud-auth-plugin est introuvable
Des messages d'erreur semblables à ceux-ci peuvent s'afficher lorsque vous essayez d'exécuter des commandes kubectl
ou des clients personnalisés qui interagissent avec GKE :
Unable to connect to the server: getting credentials: exec: executable gke-gcloud-auth-plugin not found
It looks like you are trying to use a client-go credential plugin that is not installed.
To learn more about this feature, consult the documentation available at:
https://kubernetes.io/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
Visit cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin to install gke-gcloud-auth-plugin.
Unable to connect to the server: getting credentials: exec: fork/exec /usr/lib/google-cloud-sdk/bin/gke-gcloud-auth-plugin: no such file or directory
Pour résoudre le problème, installez gke-gcloud-auth-plugin
comme décrit dans la section Installer les plug-ins requis.
Erreur : Aucun fournisseur d'authentification trouvé
L'erreur suivante se produit si kubectl
ou des clients Kubernetes personnalisés ont été créés avec Kubernetes client-go
version 1.26 ou ultérieure :
no Auth Provider found for name "gcp"
Pour résoudre ce problème, procédez comme suit :
Installez
gke-gcloud-auth-plugin
comme décrit dans la section Installer les plug-ins requis.Effectuez la mise à jour vers la dernière version de gcloud CLI :
gcloud components update
Mettez à jour le fichier
kubeconfig
:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCONTROL_PLANE_LOCATION
: emplacement Compute Engine du plan de contrôle de votre cluster. Indiquez une région pour les clusters régionaux ou une zone pour les clusters zonaux.
Erreur : Le plug-in d'authentification gcp est obsolète. Utilisez plutôt gcloud
Vous pouvez voir le message d'avertissement suivant après avoir installé gke-gcloud-auth-plugin
et exécuté une commande kubectl
sur un cluster GKE :
WARNING: the gcp auth plugin is deprecated in v1.22+, unavailable in v1.25+; use gcloud instead.
Ce message s'affiche si votre version du client est antérieure à la version 1.26.
Pour résoudre ce problème, demandez à votre client d'utiliser le plug-in d'authentification gke-gcloud-auth-plugin
à la place :
Ouvrez votre script de connexion shell dans un éditeur de texte :
Bash
vi ~/.bashrc
Zsh
vi ~/.zshrc
Si vous utilisez PowerShell, ignorez cette étape.
Définissez la variable d'environnement suivante :
Bash
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
Zsh
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
PowerShell
[Environment]::SetEnvironmentVariable('USE_GKE_GCLOUD_AUTH_PLUGIN', True, 'Machine')
Appliquez la variable dans votre environnement :
Bash
source ~/.bashrc
Zsh
source ~/.zshrc
PowerShell
Quittez le terminal et ouvrez une nouvelle session de terminal.
Mettre à jour gcloud CLI :
gcloud components update
S'authentifier sur votre cluster :
gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCONTROL_PLANE_LOCATION
: emplacement Compute Engine du plan de contrôle de votre cluster. Indiquez une région pour les clusters régionaux ou une zone pour les clusters zonaux.
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
:gcloud components update kubectl
Lorsque le programme d'installation vous invite à modifier votre variable d'environnement
$PATH
, saisissezy
pour continuer. 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 \
--location=CONTROL_PLANE_LOCATION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCONTROL_PLANE_LOCATION
: emplacement Compute Engine du plan de contrôle de votre cluster. Indiquez une région pour les clusters régionaux ou une zone pour les clusters zonaux.
Si vous ne savez pas quoi indiquer pour le nom ou l'emplacement du cluster, utilisez la commande suivante pour lister 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 une commande kubectl
sur le cluster, mais que la commande kubectl
a expiré, un message d'erreur semblable au suivant s'affiche :
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 et 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=CONTROL_PLANE_LOCATION \ --project=PROJECT_ID
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCONTROL_PLANE_LOCATION
: emplacement Compute Engine du plan de contrôle de votre cluster. Indiquez une région pour les clusters régionaux ou une zone pour les clusters zonaux.PROJECT_ID
: ID du projet dans lequel le cluster a été créé.
Si vous avez activé les réseaux autorisés dans le cluster, 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=CONTROL_PLANE_LOCATION \ --project=PROJECT_ID \ --format "flattened(controlPlaneEndpointsConfig.ipEndpointsConfig.authorizedNetwork sConfig.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 sans point de terminaison externe.
- Si vous vous connectez depuis Cloud Shell, suivez les instructions de la section Utiliser Cloud Shell pour accéder à un cluster avec le point de terminaison externe désactivé.
Erreur : les commandes kubectl
renvoient une erreur d'échec de négociation d'une version d'API
Si les commandes kubectl
renvoient une erreur failed to negotiate an API version
, vous devez vous assurer que kubectl
dispose des identifiants d'authentification :
gcloud auth application-default login
Problème : la commande kubectl
logs
, attach
, exec
ou port-forward
ne répond plus
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 votre 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 service :
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 paramètres suivants peuvent entraîner des problèmes de communication SSH :
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 des métadonnées du projet nommée
ssh-keys
est proche de sa 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
ssh-keys
. Vous pouvez voir les métadonnées de votre projet en exécutant la commande suivante, en incluant éventuellement l'indicateur--project
:gcloud compute project-info describe [--project=PROJECT_ID]
Pour résoudre ce problème, supprimez des 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 ce 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
Si votre cluster utilise le proxy Konnectivity, le résultat ressemble à ce qui suit:
NAME READY UP-TO-DATE AVAILABLE AGE
konnectivity-agent 3/3 3 3 18d
Une fois que vous avez vérifié que vous utilisez le proxy Konnectivity, assurez-vous que les agents Konnectivity disposent de l'accès au pare-feu requis et que vos règles réseau sont configurées correctement.
Autoriser l'accès au pare-feu requis
Vérifiez que les règles de pare-feu de votre réseau autorisent l'accès aux ports suivants:
- Port du plan de contrôle: lors de la création du cluster, les agents Konnectivity établissent des connexions au plan de contrôle sur le port 8132. Lorsque vous exécutez une commande
kubectl
, le serveur d'API utilise cette connexion pour communiquer avec le cluster. Assurez-vous d'autoriser le trafic de sortie vers le plan de contrôle du cluster sur le port 8132 (par exemple, le serveur d'API utilise le port 443). Si vous avez des règles qui refusent l'accès sortant, vous devrez peut-être les modifier ou créer des exceptions. Port
kubelet
: étant donné que les agents Konnectivity sont des pods système déployés sur les nœuds de votre cluster, assurez-vous que vos règles de pare-feu autorisent les types de trafic suivants:- Trafic entrant vers vos charges de travail sur le port 10250 à partir de vos plages de pods.
- Trafic sortant de vos plages de pods.
Si vos règles de pare-feu n'autorisent pas ce type de trafic, modifiez-les.
Ajuster la règle de réseau
Le proxy Konnectivity peut rencontrer des problèmes si la règle de réseau de votre cluster:
- Bloque l'entrée depuis l'espace de noms
kube-system
vers l'espace de nomsworkload
. - Bloque la sortie vers le plan de contrôle du cluster sur le port 8132.
Lorsque l'entrée est bloquée par la stratégie réseau des pods de charge de travail, les journaux konnectivity-agent
incluent un message d'erreur semblable à celui-ci:
"error dialing backend" error="dial tcp POD_IP_ADDRESS:PORT: i/o timeout"
Dans le message d'erreur, POD_IP_ADDRESS
correspond à l'adresse IP du pod de la charge de travail.
Lorsque la sortie est bloquée par une règle réseau, les journaux konnectivity-agent
incluent un message d'erreur semblable à celui-ci:
"cannot connect once" err="rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing: dial tcp CP_IP_ADDRESS:8132: i/o timeout
Dans l'erreur, CP_IP_ADDRESS
correspond à l'adresse IP du plan de contrôle du cluster.
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 les règles d'entrée ou de sortie des règles de réseau sont à l'origine 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 le problème lié à la stratégie d'entrée, ajoutez le code suivant au champ spec.ingress
des règles réseau:
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
podSelector:
matchLabels:
k8s-app: konnectivity-agent
Pour résoudre le problème lié à la règle de sortie, ajoutez le code suivant au champ spec.egress
des règles réseau:
egress:
- to:
- ipBlock:
cidr: CP_IP_ADDRESS/32
ports:
- protocol: TCP
port: 8132
Si votre stratégie réseau utilise une combinaison de règles d'entrée et de sortie, envisagez d'ajuster les deux.
Ajuster l'agent de masquage d'adresses IP
Le plan de contrôle du cluster accepte le trafic des agents Konnectivity si l'adresse IP source se trouve dans les plages d'adresses IP des pods. Si vous modifiez la configuration de ip-masq-agent pour masquer l'adresse IP source du trafic vers le plan de contrôle du cluster, les agents Konnectivity peuvent rencontrer des erreurs de connectivité.
Pour résoudre le problème et vous assurer que le trafic des agents Konnectivity vers le plan de contrôle du cluster n'est pas masqué en tant qu'adresse IP du nœud, ajoutez l'adresse IP du plan de contrôle à la liste nonMasqueradeCIDRs
dans le ConfigMap ip-masq-agent
:
nonMasqueradeCIDRs:
- CONTROL_PLANE_IP_ADDRESS/32
Pour en savoir plus sur cette configuration, consultez la section Agent de masquage d'adresses IP.
Étapes suivantes
Si vous ne trouvez pas de solution à votre problème dans la documentation, consultez la section Obtenir de l'aide pour obtenir une aide supplémentaire, y compris des conseils sur les sujets suivants:
- En ouvrant une demande d'assistance en contactant l'assistance client Cloud.
- Obtenir de l'aide de la communauté en posant des questions sur StackOverflow et en utilisant la balise
google-kubernetes-engine
pour rechercher des problèmes similaires. Vous pouvez également rejoindre le canal Slack#kubernetes-engine
pour obtenir plus d'aide de la communauté. - Signaler des bugs ou des demandes de fonctionnalités à l'aide de l'outil public de suivi des problèmes