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 Résoudre les problèmes liés à 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 obtenir 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 Kubernetes Engine à partir d'une VM Compute Engine qui ne possède pas le champ d'application cloud-platform
.
Pour résoudre cette erreur, accordez le champ d'application cloud-platform
manquant. 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 \ --region=COMPUTE_REGION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCOMPUTE_REGION
: région Compute Engine du cluster. Pour les clusters zonaux, utilisez--zone=COMPUTE_ZONE
.
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 \ --region=COMPUTE_REGION
Remplacez les éléments suivants :
CLUSTER_NAME
: nom du clusterCOMPUTE_REGION
: région Compute Engine du cluster. Pour les clusters zonaux, utilisez--zone=COMPUTE_ZONE
.
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 la 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
Remplacez CLUSTER_NAME
par le nom de votre cluster. Si vous ne savez pas quoi indiquer pour le nom 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=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 a été créé.
Si le cluster est un cluster GKE privé, assurez-vous que sa liste de 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, augmentez la probabilité d'accès à votre plan de contrôle de cluster en implémentant l'une des configurations d'accès aux points de terminaison du cluster. Pour en savoir plus, consultez la section Accès aux points de terminaison du cluster.
- Si vous vous connectez depuis Cloud Shell, suivez les instructions de la section Accéder à un cluster privé via Cloud Shell.
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 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 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 la balise présente sur tous les nœuds du cluster, puis ajoutez à nouveau une règle de pare-feu permettant d'accéder aux VM avec cette balise à 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 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 de
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
Les paramètres suivants peuvent entraîner des problèmes avec le proxy Konnectivity :
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 l'entrée 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
Étape suivante
Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.