Aller au contenu

Les 10 commandes kubectl essentielles pour maîtriser Kubernetes

Si vous êtes développeur ou développeuse et que l'idée de taper les longues lignes de commandes de kubectl vous semble fastidieuse, cet article est fait pour vous ! Découvrez comment simplifier votre quotidien avec des astuces pratiques et efficaces.

Image with kubectl running on terminal
Lancement de l'exécutable kubectl

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.

Shared Knowledge
Partage de connaissances (sharing knowledge to someone else)

☸️ Kubernetes

En préambule, qu'est-ce que Kubernetes ?

Cluster Kubernetes
Kubernetes, l’orchestrateur

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.

kubectl communication
Communication entre Kubectl et le cluster Kubernetes

🔎 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 :
Kubernetes Pod
Liste des pods actives
      • 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.

NAME

READY

STATUS

RESTART

AGE

pod-1

1/1

Running

0

2m45

pod-2

1/1

Running

0

2m45

pod-3

1/1

Running

0

2m45

    • kubectl get service
      • Elle sert à quoi ? Permet de voir les services qui sont greffés au pod.
      • Schéma :
Kubernetes Service
Ajout d’un service pour application Java
      • 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).

NAME

TYPE

CLUSTER-IP

EXTERNAL_IP

PORT(S)

AGE

service-1

LoadBalancer

10.75.20.10

32.150.190.10

80:8080/TCP

31s

    • kubectl get namespace
      • Elle sert à quoi ? Permet de voir les différents espace de travail disponible dans le cluster.
      • Schéma :
Kubernetes Namespace
Travailler dans des environnements différents
      • Explication :

🎯 L’objectif de cette commande est de voir quels sont les environnements de travail disponibles dans le cluster.

NAME

STATUS

AGE

default

Active

10d

kube-system

Active

10d

sfeir-app

Active

9d

sfeir-app-v2

Active

3d

    • kubectl get deployment
      • Elle sert à quoi ? Permet de voir les différents déploiements disponibles dans le cluster.
      • Schéma :
Kubernetes Deployment
Réplication de la base de donnée
      • 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.

NAME

READY

UP-TO-DATE

AVAILABLE

AGE

deployment-db

2/2

1

1

2s

🪜 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 :
Kubernetes Scale Down
Scale la base de donnée (Down Pod)
Kubernetes Scale Up
Scaler la base de donnée (Up Pod)
      • 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.

NAME

READY

UP-TO-DATE

AVAILABLE

AGE

deployment-db

1/1

1

1

2s

    • kubectl delete pod <pod_name>
      • Elle sert à quoi ? Elle offre la possibilité de supprimer le pod renseigné.
      • Schéma :
Kubernetes Delete Pod
Suppression d'un pod
      • 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é).

NAME

READY

STATUS

RESTART

AGE

pod-1

1/1

Running

0

2m45

pod-2

1/1

Running

0

2m45

pod-3

1/1

Running

0

2m45

pod-4

0/1

ImagePullBackOff

0

5m45

pod-5

1/1

Running

0

2m45

👀 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 :
Kubernetes Logs
Visualiser le journal de log
      • 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 :
Kubernetes Secret
Crypter le mot de passe de la base de donnée
      • 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).

NAME

TYPE

DATA

AGE

secret-1

Opaque

2

51s

ℹ️ 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 :
Kubernetes Describe Pod
Récolter des informations sur pod en échec
      • 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.

  1. 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"
  1. 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

  1. Organiser correctement votre espace de travail pour lancer Kube
    1. 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
      • Le 2ème dossier, nommer le kubeconfig
        • Ajouter à l'intérieur la configuration récupérer depuis le cluster
    • 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
  1. On peut étendre les différentes touches (doskey), en rajoutant des commandes
  2. Lancer l'exécutable kube.bat
  3. Par exemple, on lance la touche l sur le pod-1 => l pod-1
  4. 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.

Dernier