Dépannage de la connectivité Kubernetes : Utilisation efficace de exec et port-forward
Kubernetes, la plateforme leader d'orchestration de conteneurs, vous permet d'automatiser le déploiement, la mise à l'échelle et la gestion des applications conteneurisées. Bien que sa nature déclarative simplifie de nombreuses tâches opérationnelles, le dépannage de la connectivité et des problèmes internes aux applications peut encore présenter des défis. Lorsque un accès direct à vos applications ou à leur état interne est nécessaire, kubectl exec et kubectl port-forward sont des outils indispensables dans votre arsenal de débogage.
Cet article vous guidera dans l'application pratique de kubectl exec pour exécuter des commandes dans vos conteneurs et de kubectl port-forward pour établir un accès local sécurisé aux services. En maîtrisant ces commandes, vous pourrez obtenir des informations plus approfondies sur le comportement de vos applications, diagnostiquer les problèmes réseau et résoudre les problèmes de connectivité plus efficacement, améliorant ainsi la fiabilité et les performances de vos déploiements Kubernetes.
Comprendre kubectl exec
La commande kubectl exec vous permet d'exécuter des commandes à l'intérieur d'un conteneur en cours d'exécution dans un pod. Ceci est incroyablement utile pour inspecter les journaux, vérifier les configurations et exécuter des outils de diagnostic directement là où votre application réside.
Syntaxe de base
La syntaxe fondamentale de kubectl exec est la suivante :
kubectl exec <nom-du-pod> -- <commande> [arguments...]
<nom-du-pod>: Le nom du pod dans lequel vous souhaitez exécuter une commande.--: Ce séparateur est crucial. Il distingue les options dekubectlde la commande que vous souhaitez exécuter dans le conteneur.<commande>: La commande à exécuter dans le conteneur (par exemple,ls,cat,ping).[arguments...]: Tous les arguments pour la commande.
Accès shell interactif
L'une des utilisations les plus courantes de kubectl exec est d'obtenir un shell interactif (comme bash ou sh) à l'intérieur d'un conteneur. Cela vous permet d'explorer le système de fichiers du conteneur et d'exécuter plusieurs commandes.
Pour obtenir un shell interactif :
kubectl exec -it <nom-du-pod> -- /bin/bash
-i(ou--stdin) : Maintient l'entrée standard ouverte même si elle n'est pas attachée.-t(ou--tty) : Alloue un pseudo-TTY, nécessaire pour les sessions shell interactives.
Exemple : Accéder à un shell bash dans un pod nommé my-app-pod :
kubectl exec -it my-app-pod -- /bin/bash
Une fois à l'intérieur, vous pouvez utiliser les commandes Linux standard. Pour quitter le shell, tapez exit ou appuyez sur Ctrl+D.
Exécution d'une commande unique
Vous pouvez également exécuter une commande unique sans shell interactif. Ceci est utile pour des vérifications rapides ou des scripts.
Exemple : Vérifier les fichiers dans le répertoire /app de my-app-pod :
kubectl exec my-app-pod -- ls /app
Exemple : Afficher le contenu d'un fichier de configuration config.yaml :
kubectl exec my-app-pod -- cat /etc/my-app/config.yaml
Spécification d'un conteneur dans un pod
Si votre pod contient plusieurs conteneurs, vous devez spécifier dans quel conteneur exécuter la commande à l'aide de l'option -c.
kubectl exec <nom-du-pod> -c <nom-du-conteneur> -- <commande>
Exemple : Exécuter env dans le conteneur sidecar-container du pod multi-container-pod :
kubectl exec multi-container-pod -c sidecar-container -- env
Comprendre kubectl port-forward
La commande kubectl port-forward vous permet d'établir un tunnel sécurisé depuis votre machine locale vers un pod ou un service spécifique de votre cluster Kubernetes. Ceci est inestimable pour le débogage d'applications qui ne sont pas exposées extérieurement, l'accès aux bases de données ou le test d'API internes.
Syntaxe de base
La syntaxe générale est la suivante :
kubectl port-forward <nom-du-pod> <port-local>:<port-distant>
<nom-du-pod>: Le nom du pod auquel vous souhaitez vous connecter.<port-local>: Le port de votre machine locale qui écoutera les connexions.<port-distant>: Le port du pod qui recevra le trafic transféré.
Exemple : Transférer le port local 8080 vers le port 80 de my-app-pod :
kubectl port-forward my-app-pod 8080:80
Une fois cette commande en cours d'exécution, vous pouvez accéder à votre application en naviguant vers http://localhost:8080 dans votre navigateur web ou en utilisant des outils comme curl sur votre machine locale.
Transfert vers un service
Vous pouvez également transférer du trafic vers un Service Kubernetes au lieu d'un pod spécifique. kubectl sélectionnera automatiquement un pod supportant ce service.
kubectl port-forward service/<nom-du-service> <port-local>:<port-service>
Exemple : Transférer le port local 3000 vers le port 80 du service my-service :
kubectl port-forward service/my-service 3000:80
Transfert vers des déploiements ou des StatefulSets
De même, vous pouvez transférer vers des déploiements ou des StatefulSets. kubectl sélectionnera l'un des pods gérés par la ressource spécifiée.
kubectl port-forward deployment/<nom-du-deploiement> <port-local>:<port-conteneur>
kubectl port-forward statefulset/<nom-du-statefulset> <port-local>:<port-conteneur>
Liaison à une adresse spécifique
Par défaut, port-forward se lie à localhost. Vous pouvez spécifier une adresse locale différente à l'aide de l'option --address.
kubectl port-forward --address 127.0.0.1 <nom-du-pod> <port-local>:<port-distant>
Transfert de plusieurs ports
kubectl port-forward peut transférer plusieurs ports simultanément.
kubectl port-forward my-app-pod 8080:80 9090:90
Cette commande transfère le port local 8080 vers le port 80 du pod et le port local 9090 vers le port 90 du pod.
Scénarios de dépannage courants et solutions
Scénario 1 : L'application ne répond pas, mais le pod semble sain.
- Problème : Le pod est en cours d'exécution, mais les requêtes vers son service échouent ou expirent. L'application peut avoir des problèmes de configuration internes ou être bloquée.
- Solution avec
kubectl exec:- Obtenez un shell interactif dans le pod :
kubectl exec -it <nom-du-pod> -- /bin/bash - Dans le shell, vérifiez les journaux de l'application (par exemple,
tail -f /var/log/myapp.log). - Vérifiez les fichiers de configuration internes de l'application.
- Vérifiez la connectivité réseau depuis l'intérieur du pod vers d'autres services en utilisant
pingoucurl(s'ils sont installés).
- Obtenez un shell interactif dans le pod :
- Solution avec
kubectl port-forward:- Transférez un port vers le port d'écoute de l'application :
kubectl port-forward <nom-du-pod> 8080:<port-app> - Essayez d'accéder à l'application localement via
http://localhost:8080. Cela permet de déterminer si le problème vient de la découverte de service ou de l'ingress Kubernetes, ou si l'application elle-même ne répond pas.
- Transférez un port vers le port d'écoute de l'application :
Scénario 2 : Besoin de déboguer une base de données exécutée dans un pod.
- Problème : Vous devez connecter votre client de base de données local à une base de données exécutée dans un pod Kubernetes pour inspecter les données ou exécuter des requêtes.
- Solution avec
kubectl port-forward:- Identifiez le pod exécutant la base de données et son port (par exemple,
mysql-pod, port3306). - Transférez un port local vers le port de la base de données :
kubectl port-forward mysql-pod 3306:3306 - Configurez votre client de base de données local pour se connecter à
localhost:3306en utilisant les identifiants de base de données appropriés.
- Identifiez le pod exécutant la base de données et son port (par exemple,
Scénario 3 : Diagnostic des problèmes de résolution DNS dans un pod.
- Problème : Une application à l'intérieur d'un pod ne peut pas atteindre d'autres services par leurs noms de service, ce qui suggère un problème DNS.
- Solution avec
kubectl exec:- Obtenez un shell interactif dans le pod :
kubectl exec -it <nom-du-pod> -- /bin/bash - Dans le shell, essayez de résoudre un nom de service connu :
nslookup <nom-du-service>.<espace-de-noms>.svc.cluster.localoudig <nom-du-service>.<espace-de-noms>.svc.cluster.local. - Vérifiez le contenu de
/etc/resolv.confpour vous assurer que la configuration DNS du cluster est correcte dans le pod.
- Obtenez un shell interactif dans le pod :
Meilleures pratiques et astuces
- Maintenir
port-forwarden cours d'exécution :kubectl port-forwards'exécute au premier plan. Vous devrez garder la fenêtre du terminal ouverte. Pour l'exécuter en arrière-plan, vous pouvez utiliser des outils commenohupouscreen/tmux. - Utiliser des pods spécifiques pour le débogage : Bien que le transfert vers les services soit pratique, pour identifier précisément les problèmes d'une instance spécifique, le transfert vers un pod particulier en utilisant son nom est souvent plus efficace.
- Sécurité : Soyez conscient des ports que vous exposez. Évitez de transférer des ports sensibles sauf si cela est absolument nécessaire et assurez-vous que votre machine locale est sécurisée.
- Utilisation des ressources :
kubectl execpeut consommer des ressources. Utilisez-le judicieusement, en particulier sur les clusters de production. - Permissions : Assurez-vous que votre contexte
kubectldispose des autorisations nécessaires pour exécuter des commandes dans les pods ou pour transférer des ports.
Conclusion
kubectl exec et kubectl port-forward sont des outils puissants pour obtenir une visibilité sur vos applications Kubernetes et leur environnement réseau. exec vous permet d'interagir directement avec les conteneurs en cours d'exécution, permettant une inspection approfondie et l'exécution de commandes, tandis que port-forward comble le fossé entre votre machine locale et les services au sein du cluster, facilitant le débogage et les tests sans heurts. En intégrant ces commandes dans votre flux de travail de dépannage régulier, vous pouvez réduire considérablement le temps et les efforts nécessaires pour résoudre des problèmes complexes de connectivité et d'application, conduisant à des déploiements Kubernetes plus robustes et fiables.