Avant d’aborder le sujet qui nous intéresse, je voulais me présenter. Je m'appelle Ranushan RACHU et je suis développeur full-stack Angular/Java, avec une préférence back-end avec Java ☕ & Spring 🍃.
Cet article se concentrera principalement sur l'exécutable Kubernetes (kubectl) et avec les dix commandes que je trouve particulièrement utiles en tant que développeur.
☸️ Kubernetes
En préambule, qu'est-ce que Kubernetes ?
Kubernetes est un orchestrateur de conteneurs qui gère, déploie et met à l'échelle plusieurs applications conteneurisées (en isolant les applications dans des conteneurs). De plus, il nous fournit de nombreuses informations telles que la communication entre différentes applications, l’état de santé, la répartition de la charge, etc...
De plus, Kubernetes met à notre disposition un exécutable kubectl qui va communiquer avec le cluster Kubernetes en utilisant les API.
🔎 Un aperçu des éléments mis en route au sein du cluster Kubernetes
kubectl get pods
- À quoi sert-elle ? Permet de voir les pods actifs.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de voir la liste des applications qui sont mises en route et opérationnelles au niveau du cluster.
kubectl get service
- Elle sert à quoi ? Permet de voir les services qui sont greffés au pod.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de voir quelles sont les applications qui sont exposées à l’extérieur du conteneur. Par exemple, si on veut accéder aux API de l’application Java, nous avons juste à utiliser l’IP que Kubernetes nous a mis à disposition (ex : https://32.150.190.10/swagger-ui/index.html).
kubectl get namespace
- Elle sert à quoi ? Permet de voir les différents espace de travail disponible dans le cluster.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de voir quels sont les environnements de travail disponibles dans le cluster.
kubectl get deployment
- Elle sert à quoi ? Permet de voir les différents déploiements disponibles dans le cluster.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de voir quels sont les déploiements qui sont mis en route sur le cluster. Notamment, elle nous indiquera si la ressource utilisée est répliquée en plusieurs fois. Par exemple, dans l’illustration ci-dessus, nous pouvons voir qu’il y a deux pods avec la base de données MongoDB, au lieu d’envoyer toutes les requêtes à un seul pod (ex : pod-3), Kubernetes va faire en sorte de répartir les requêtes en les envoyant au pod-3 et au pod-4.
🪜 Mise à l'échelle, ❌ Extinction ou Suppression d'une application (un pod)
kubectl scale deployment <deployment_name> –- replicas=<nb_replicas>
- Elle sert à quoi ? Permet de gérer la façon dont le déploiement doit être mis en route.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de gérer le nombre de réplications (le même pod multiplié, dans le jargon de Kubernetes : replicat) nécessaire pour le bon fonctionnement de l’application. De plus, elle offre la possibilité d’augmenter ou de diminuer le nombre de ressources (pod) qui, par suite, permettra de répartir les charges entre les différents réplications. Par ailleurs, elle est utile lors de la mise en production de l'application (une nouvelle version de l'application), par exemple, le développeur va fermer le flux de la base de donnée durant la maintenance, pour éviter des données parasites, puis la rétablir une fois la maintenance terminée.
kubectl delete pod <pod_name>
- Elle sert à quoi ? Elle offre la possibilité de supprimer le pod renseigné.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est de supprimer le pod qui a été mis en paramètre de la commande. Utile lorsqu'on a certains pods qui sont tombés en échec lors de la mise en route, dû à une mauvaise configuration ou le pod n'a pas les ressources nécessaires pour bien fonctionner (manque de RAM, CPU ou l'image docker n'a pas été trouvé).
👀 Inspection de l’activité des applications (en cours d'exécution)
kubectl logs –tail=<nb_logs_lines> <pod_name>
- Elle sert à quoi ? Elle nous donne le journal de log de l'application.
- Schéma :
- Explication :
🎯 L’objectif de cette commande est d'observer le journal de log. Cette commande permet aux développeurs ou autres de voir le comportement de l'application directement dans le conteneur. D'autre part, elle est utile lors des phases de débogage (un comportement inhabituel de l'application) pour remonter la source du problème. Pour info, l'option tail
est une option modifiable, elle représente le nombre de ligne de log courante qu'on veut afficher (ex : -tail=20
, retourne les 20 dernières lignes de log de l'application).
🔐 Encryption & decryption des informations sensibles
kubectl create secret generic <name_secret> --from-literal=<key>=<value>
- Elle sert à quoi ? Elle nous crée des informations cryptées.
- Schéma :
- Explication :
🎯 L'objectif de cette commande est de crypter les informations sensibles. Notamment, les mots de passe pour se connecter à la base de donnée. Attention, il ne faut jamais exposer les données sensibles aux publics comme mettre les informations sur un dépôt public type GitHub ou GitLab. Il faut utiliser le concept de secret que Kubernetes nous propose et l'appliquer ce mécanisme au niveau de notre environnement. Pour information, les secrets sont encodés par défaut en base64 (système encodage/décodage).
ℹ️ Extra informations sur l'application
kubectl describe pod <pod_name>
- Elle sert à quoi ? Elle nous donnes des informations détaillées sur un pod ou autre.
- Schéma :
- Explication :
🎯 Sur le schéma ci-dessus, nous observons un dysfonctionnement d'un pod (pod-4). Pour connaitre les raisons de la mise en échec du pod, il faut inspecter le pod en réalisant la commande describe
. Celle-ci va nous décrire toutes les événements qui ont été produits sur le pod concerné et les raisons de la mise en échec.
🕵️ Spy un conteneur
kubectl exec -it <pod_name> –- /bin/bash
- Elle sert à quoi ? Elle offre la possibilité d'accéder au conteneur où l'application tourne.
- Schéma :
- Explication :
🎯 Cette commande est utile lorsque nous voulons inspecter les différents fichiers dans l'enceinte du conteneur. Par exemple, voir où sont stocker les journaux de log ou faire des traitements spécifiques dans le conteneur.
🔄 (Bonus) Transfère de fichier depuis une source vers une destination (vise-versa)
kubectl cp <pod_name>:<source_path_pod> <destination_local_system>
- Elle sert à quoi ? Elle permet de copier un fichier (pod ou local) et de coller à chemin défini (pod ou local)
- Schéma :
- Explication :
🎯 Cette commande m'a beaucoup servi pour inspecter les anciens logs. Je me suis retrouvé à copier des logs de la veille pour résoudre des problèmes inhabituels de l'application. Le fait de transférer des fichiers du conteneur jusqu'au système faciliter le travail, pas besoin d'aller dans le conteneur à moins de compresser tous les logs sous format Zip.
📝 Résumé des commandes
kubectl get pods
kubectl get service
kubectl get namespace
kubectl get deployment
kubectl scale deployment <deployment_name> –- replicas=<nb_replicas>
kubectl delete pod <pod_name>
kubectl logs –tail=<nb_logs_lines> <pod_name>
kubectl create secret generic <name_secret> --from-literal=<key>=<value>
kubectl describe pod <pod_name>
kubectl exec -it <pod_name> –- /bin/bash
kubectl cp <pod_name>:<source_path_pod> <destination_local_system>
📝 Créer son propre exécutable
Le but étant de créer un exécutable permettant de simplifier l'ensemble des commandes en interrogeant directement le cluster Kubernetes.
- Récupérer le fichier de configuration du cluster Kubernetes. Généralement, on peut le récupérer depuis le dashboard de Kubernetes ou Rancher.
apiVersion: v1
kind: Config
clusters:
- name: "kube-sandbox-dev"
cluster:
server: "https://rancher-dev.lab.ranushan.com/k8s/clusters/a-b-c12defgh"
users:
- name: "kube-sandbox-dev"
user:
token: "ranu-token"
contexts:
- context:
cluster: "kube-sandbox-dev"
user: "kube-sandbox-dev"
namespace: "Sfeir-App"
name: 'kube-sandbox-dev'
current-context: "kube-sandbox-dev"
- Téléchargement du client kubectl en lançant la commande curl depuis le terminal ou depuis le site : https://kubernetes.io/fr/docs/tasks/tools/install-kubectl
curl -LO
https://dl.k8s.io/release/v1.31.0/bin/windows/amd64/kubectl.exe
- Organiser correctement votre espace de travail pour lancer Kube
- Crée un dossier kube
- A l'intérieur créer deux dossiers
- Le 1er dossier, nommer le kubectl
- A l'intérieur créer un dossier avec la version de kubectl (ex : 1.31.0), cela permet de versionner l'exécutable
- Ajouter l'exécutable, télécharger précédemment
- A l'intérieur créer un dossier avec la version de kubectl (ex : 1.31.0), cela permet de versionner l'exécutable
- Le 2ème dossier, nommer le kubeconfig
- Ajouter à l'intérieur la configuration récupérer depuis le cluster
- Le 1er dossier, nommer le kubectl
- A la racine, du dossier kube
- Créer un fichier exécutable, dans l'exemple, je crée un fichier kube.bat.
set PATH=C:\dev\01_Installation\kube\kubectl\1.31.0;%PATH%
set KUBECONFIG=C:\dev\01_Installation\kube\kubeconfig\kube-sandbox-dev
doskey k=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe $*
doskey p=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe get pods
doskey up=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe scale deployment $* –- replicas=1
doskey down=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe scale deployment $* –- replicas=0
doskey delete=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe delete pod $*
doskey l=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe logs –tail=20 $*
doskey shinpod=C:\dev\01_Installation\kube\kubectl\1.31.0\kubectl.exe exec -it $* –- /bin/bash
kubectl config use-context kube-sandbox-dev
cmd /k kubectl get pods
- On peut étendre les différentes touches (doskey), en rajoutant des commandes
- Lancer l'exécutable kube.bat
- Par exemple, on lance la touche l sur le pod-1 =>
l pod-1
- Il nous affiche les logs courantes
🏁 Pour terminer...
En conclusion, j'espère que vous avez apprécié de lire mon article 📖 (1st time) et d'en apprendre davantage sur les commandes de kubectl.
Pour ma part 👨🏾💻, cet article m'a donné l'opportunité de partager mon savoir à travers ce contenu et de le rendre le plus accessible possible (vulgarisation).
Et encore un grand merci 🙏 SFEIR 🙏 pour m'avoir donné l'occasion de réaliser cet article.