Rechercher

k9s - Une IHM Kubernetes dans son terminal


10 Février 2021 | 16 mins Dimitri Fert

Logo k9s

Dans ce billet de blog je vous propose de découvrir k9s, un outil graphique en ligne de commande pour Kubernetes qui peut faciliter la gestion des ressources d’un cluster, donner pas mal de visibilité sur son état général, et accélérer vos opérations courantes.

En quelques mots, k9s propose différentes vues et raccourcis adaptés à chaque type de ressources. Ce mécanisme permet de facilement accéder aux logs d’un pod, d’attacher un shell à un conteneur, d’activer un port-fowarding, d’agrandir un replicaset, etc.

Croyez moi, c’est super pratique, mais la bête n’est pas si simple à dompter et c’est justement pour aider à sa prise en main que j’ai eu envie d’écrire ce billet aujourd’hui.

Installation

k9s est un projet écrit en Go et publié en tant que binaire exécutable. Pour l’installer, récupérez une version depuis le Github du projet et placez la dans le dossier de votre choix (/usr/bin/ par exemple). Assurez-vous que ce dossier est bien référencé dans votre PATH.

Pour interagir avec un cluster, k9s lit les informations du fichier ~/.kube/config. Si vous n’avez pas de cluster sous la main, je vous invite à en installer un localement avec des outils tels que kind ou minikube et à y créer quelques ressources. Sinon, il vous suffit de lancer k9s depuis votre terminal et ce dernier utilisera automatiquement votre contexte Kubernetes courant. Vous pouvez également spécifier le contexte et le namespace via les commandes respectives suivantes k9s --context <context> et k9s -n <namespace> (nous verrons comment changer de contexte et de namespace dans k9s à la fin de ce billet).

Enfin, vous pouvez lancer k9s en lecture seule avec l’argument --readonly. La liste complète des arguments est disponible dans l’aide k9s help.

Présentation de l’interface

Voici maintenant un aperçu de l’interface de k9s qui en résume les principales zones d’intérêt :

Main k9s

  • En haut à gauche, quelques informations globales données par k9s telles que le nom du cluster auquel vous êtes connecté, le contexte actuellement utilisé, votre userid, votre version de k9s, etc.
  • Juste à droite, vous trouverez une liste de raccourcis utiles pour interagir avec k9s. Gardez dans un coin de votre tête que son contenu change en fonction de la vue active, nous y reviendrons plus tard. Notez aussi que la touche ? ouvrira l’aide complète à tout moment.
  • Au milieu, on retrouve le panneau principal, c’est ici que se trouveront toutes les informations sur nos ressources. Son contenu changera lui aussi en fonction de la vue active et le nom de cette dernière vous sera rappelé dans le titre du panneau principal.
  • Enfin tout en bas à gauche, un fil d’Ariane (ou breadcrumbs) nous donne la hiérarchie de la vue active et indique vers quelle vue nous retournons lorsqu’on la quitte.

D’une manière générale, k9s reprend plusieurs principes de vim. La touche esc sert à revenir en arrière ou à annuler / fermer un prompt et on quitte le programme avec :q (ou ctrl + c).

Lorsque vous serez parfaitement à l’aise avec k9s, vous pourrez masquer le panneau principal en pressant ctrl + e afin d’économiser un peu de place, mais pour l’instant je vous invite à le laisser affiché.

Les différents modes

Le mode commande

La touche : ouvre un prompt chien (🐶>) au-dessus du panneau principal. C’est le mode de k9s qui permet d’exécuter des commandes. Il existe une commande par ressource kubernetes plus quelques autres spécifiques que nous verrons plus tard. Par exemple, :pod⏎ bascule dans la vue Pod et ce sont désormais les informations sur les pods qui sont affichées dans le panneau principal.

Le prompt du mode commande

k9s fait de l’autosuggestion pour le nom des commandes. Quand je tappe pod, il me propose la commande poddisruptionbudget.

  • Les touches 🔼 et 🔽 permettent de naviguer circulairement entre les différentes propositions
  • Les touches ➡ , tab ou ctrl + f permettent de compléter automatiquement la suggestion dans le prompt (autocomplétion), sans toutefois exécuter la commande
  • Les touches ctrl + u ou ctrl + w permettent d’effacer la ligne sans quitter le mode commande

Autosuggestion du mode commande

Pratique non ?

La liste complète des commandes est disponible par le raccourci ctrl + a ou avec :aliases.

Commande Aliases

On notera que toutes les commandes disposent d’un alias plus court qui permet d’accélérer la navigation (e.g. :a au lieu de :aliases)

Si vous entrez une commande qui n’existe pas k9s vous le fera savoir avec une cowsay qui malheureusement ne partira pas avec la touche esc. Pour sortir de cette vue, il faut rejouer une commande valide comme :pod⏎ par exemple.

Erreur cowsay

Voilà, vous savez désormais exécuter différentes commandes qui vous permettent de changer de vues. C’est déjà pas mal ! Vous êtes capables de lister les différentes ressources de votre cluster et de voir si elles sont OK ! Allons un peu plus loin maintenant.

Le mode filtre

La touche / ouvre un prompt caniche 🐩> qui permet d’appliquer un filtre sur la liste d’éléments affichés dans le panneau. C’est le mode filtre de k9s.

En reprenant notre exemple, si l’on est dans la vue pod (:pod) et que l’on tape /kops⏎ on n’affichera que les Pods qui contiennent kops dans leur nom. Ce prompt supporte Regex2 et on peut utiliser des syntaxes comme /toto|astronaute⏎ (toto ou astronaute dans le nom du pod) ou !tata (tous les noms de pods qui ne contiennent pas tata).

Filtre sur le nom

On peut aussi filtrer les ressources qui portent un label kubernetes avec la syntaxe /-l <nom_du_label>=<valeur_du_label>. Dans notre exemple /-l k8s-app=cilium liste tous les pods qui portent le label k8s-app=cilium (notez bien qu’on filtre uniquement sur l’existence de label ici et pas sur le nom des pods.)

Filtre sur les labels

Ce prompt fonctionne dans toutes les vues de k9s et applique le filtre sur tout ce qui est affiché dans le panneau principal. Il n’est pas réservé aux vues des ressources Kubernetes. Voyez un exemple dans la vue aliases.

Mode filtre dans la vue Aliases

Voilà, désormais vous savez comment retrouver toutes vos petites ressources. On va pouvoir découvrir maintenant comment interagir avec elles.

Le panneau des raccourcis

Intéressons-nous de plus près au panneau des raccourcis. Il contient tout ce qu’il vous faut pour vos opérations courantes. Rappelez-vous que son contenu change en fonction de la vue dans laquelle vous êtes, alors pensez à vous y référer régulièrement 💡. Voici par exemple le contenu des raccourcis pour la vue pod :

Raccourcis vue pod

Vous pouvez à tout moment appuyer sur la touche ? pour afficher l’aide complète.

Aide complète

Globalement, un raccourci s’applique à la ligne du panneau principal en surbrillance et vous pouvez changer de ligne en utilisant les flèches de votre clavier.

Selection de ligne

Les touches numériques affichées en magenta dans le panneau des raccourcis permettent de filtrer le contenu du panneau principal sur la base d’un paramètre qui change d’une vue à l’autre. Pour les pods par exemple, ces touches changent le namespace, mais pour les logs elles changent la plage temporelle à afficher. La valeur du paramètre est rappelée en magenta dans le titre du panneau principal

Changement de namespace vue pod touche numérique

Dans l’exemple ci-dessus, mon écran se vide lorsque je sélectionne le namespace default (<2>) car je n’ai pas de pod sur ce namespace. Pensez donc à vérifier régulièrement la valeur de ces paramètres.

Vous avez maintenant toutes les billes pour commencer à faire des opérations sur vos ressources. Voici celles que j’utilise le plus fréquemment.


Opérations courantes

Changer de contexte ou de namespace

Pour changer de contexte au sein de k9s, il suffit de taper :ctx <context>⏎. De même, pour changer de namespace vous pouvez utiliser :ns <namespace>⏎

Afficher des informations des ressources associées

Dans une vue de ressource, la touche permet d’afficher des informations sur les éléments associés à cette ressource. Depuis la vue :pod par exemple, appuyer sur affiche des informations sur les conteneurs du pod, et dans la vue :service on obtient des informations sur les pods associés au service.

Afficher les valeurs non chiffrées d’un secret Kubernetes

Depuis la vue :secrets appuyer sur x permet d’afficher toutes les valeurs du secret en clair.

Trier les ressources par colonne

Dans les différentes vue de ressources, on peut trier les éléments par colonnes. Dans la vue :pod par exemple on peut utiliser les raccourcis suivants :

  • Shift + p — tri par namespace
  • Shift + n — tri par nom
  • Shift + r — tri par nombre de conteneur ready
  • Shift + t — tri par nombre de redémarrage
  • Shift + s — tri par status
  • Shift + c — tri par consommation CPU
  • Shift + m — tri par consommation RAM
  • Shift + i — tri par adresse IP
  • Shift + o — tri par adresse du noeud
  • Shift + a — tri par age

Une petite flèche bleue se placera à coté de la colonne et indiquera le sens du tri. Appuyer plusieurs fois sur un même raccourci inverse l’ordre du tri.

Changement ordre tri

Les raccourcis de tri changent d’une vue à l’autre et la liste complète est donnée dans l’aide (touche ?)

Afficher des logs

Dans la vue :pod, la touche l permet d’afficher des logs du pod sélectionné. Lorsque qu’un pod n’écrit pas beaucoup de logs, on est généralement confronté au message Waiting for logs....

Message waiting for logs

Cette vue n’affiche en effet que les logs avec un timestamp vieux de maximum 1 minute et quand il n’y en a pas, elle attend alors qu’un log assez jeune arrive. Si vous cherchez des logs plus vieux, vous pouvez changer la plage temporelle avec les touches 0 à 5. La durée sélectionnée est rappelée dans le titre du panneau principal représenté par la flèche rouge dans l’image ci-dessous.

Menu log durée 1m

On peut naviguer dans les logs à l’aide des flèches ⇞ et ⇟, toutefois, l’autoscroll est activé par défaut et forcera l’affichage vers le bas dès qu’un nouveau log arrivera. On peut activer / désactiver cette fonction avec la touche s. Aussi, on peut afficher / masquer l’affichage des timestamps avec la touche t

N’oubliez pas également que 🐩> fonctionne ici également.

Menu filtre dans les logs

Ouvrir un shell dans un conteneur

Dans la vue :pod, la touche s permet d’attacher un shell à un conteneur s’exécutant au sein d’un pod. Si le pod contient plusieurs conteneurs, un prompt demandera de sélectionner celui auquel on souhaite attacher un shell.

Une fois le shell attaché, on peut le déconnecter en pressant ctrl + d.

Shell conteneur

Upscale / Downscale des ressources

Dans la vue :statefulset ou :replicaset, on peut modifier le nombre de réplica en appuyant sur la touche s.

Scaling replica

Retrouver qui utilise une ressource

Certaines vues permettent de lister les ressources qui sont consommées par d’autres ressources en utilisant la touche u (used by). Cela fonctionne pour la vue :secrets ou :configmap par exemple.

Détruire une ressource

ctrl + d permet de détruire une ressource. L’option cascade, activée par défaut, permet de supprimer en plus les ressources qui lui sont associées. Détruire un déploiement en mode cascade détruira également les pods associés à ce déploiement.

Détruire pod

Il est aussi possible de faire un kill avec ctrl +k pour les pods, mais faites attention, cette opération ne demande pas de confirmation ! 💣

Décrire / éditer une ressource

Il est parfois intéressant de lire la description d’une ressource pour vérifier sa liste de labels par exemple. Pour cela on peut soit utiliser la touche d qui retourne la description formatée par k9s, soit la touche y pour obtenir le fichier YAML brut. Dans ces vues, lorsque l’on utilise le mode filtre et qu’il correspond à plusieurs résultats, on pourra naviguer vers l’occurence suivante avec la touche n et l’occurence précédente avec shift+n (pensez bien à valider le filtre avec avant d’appuyer sur ces touches).

Navigation mode filtre

Il est également possible d’éditer le ficher YAML correspondant à une ressource en appuyant avec e. Cela ouvrira votre éditeur de texte par défaut et appliquera les modifications une fois le fichier sauvegardé.

Actions groupées

On peut “marquer” des ressources pour leur appliquer une action commune (e.g. supprimer 2 pods d’un coup). On marque la ressource en surbrillance en appuyant sur espace. La ressource change alors de couleur et on appuiera de nouveau sur espace pour retirer la marque.

Marquer une ressource

On peut également marquer une plage de ressource. Pour cela :

  • Mettre en surbrillance la première ressource de la plage
  • Marquer la ressource avec espace
  • Avec les flèches, selectionner la dernière ressource de la plage
  • Appuyer sur ctrl+espace.

Toutes les ressources de la plage sont maintenant marquées. On peut effacer toutes les marques d’un coup avec ctrl+\.

Marquer une plage de ressources

Dès que l’on pose une marque, les actions qui peuvent s’appliquer à un groupe de ressources s’appliqueront aux ressources marquées et non pas à la ligne en surbrillance. Dans l’exemple ci-dessous mon action killed (ctrl+k) s’applique à tous les ressources marquées et pas à la ressources en surbrillance.

Effacer tous les marqueurs


Vues spéciales

Pulses

Pulses est un dashboard global qui permet de voir l’état de santé de votre cluster. Il affiche le nombre de ressources OK / KO au cours du temps et permet via les touches numériques ou tab de passer rapidement dans la vue la plus pertinente pour surveiller un paramètre. On active sa vue avec :pulses

Vue Pulses

Xray

Xray est un outil qui permet de visualiser sour forme d’arborescence les dépendances entre les ressources. On active cette vue avec :xray <ressource>. En utilisant pod par exemple, Xray donne l’arbre de dépendance des pods par namespaces (leurs conteneurs, configmaps, tokens, etc.) C’est très pratique pour retrouver ses petits quand on commence à avoir un cluster assez gros.

Vue Xray

Dans cet exemple, mes pods sont répartis sur 5 namespaces différents (🗂), le namespace pplogs contient 32 pods (🚛), le pod elastic-client-6d7cdcd4fd-nrmtc contient 5 types de ressources différentes :

  • 1 service account (💳)
  • 1 secret (🔒)
  • 1 configmap (🗺)
  • 2 conteneurs (🐳)

Gif Xray

Popeye

Popeye est un outil qui permet de tester la conformité des ressources d’un cluster selon différents critères. Chaque type de ressources se voit attribué un score de conformité et la navigation permet d’accéder aux différentes erreurs et warnings rencontrés.

Animation Popeye


Customisation

Je ne détaillerai pas cette partie dans ce billet mais sachez qu’il est possible de définir un fichier de configuration k9s et également de personnaliser différents aspects tel que son skin, ses plugins et des alias supplémentaires. Vous trouverez plus d’informations dans la documentation du projet.


Conclusion

Voila c’est tout pour cette fois ! J’espère vous avoir convaincu de la puissance de k9s et qu’il trouvera une place dans votre boîte à outil galactique. Malgré sa prise en main un peu exigeante, son utilisation ne devrait plus trop avoir de secret pour vous et je reste convaincu que l’investissement en vaut la chandelle. De mon côté, je ne peux plus m’en passer.

N’hésitez pas à me faire part de vos réactions dans les commentaires. 🚀 To infinity and beyond! 🚀

Crédits

J’ai utilisé les logiciels Sublime Text 3 pour la rédaction de cet article ; Peek, Screenkey et Key-Mon pour réaliser mes gifs. Un grand merci aux développeurs de ces projets.

Auteur(s)

Dimitri Fert

  • 🚭👨‍🚀+💻+🐋+☕+🐛🔥🔥🔥🔥
  • 🍽=🥬-(🍖🐟🐚⛔)
  • 📚+💟
  • 🥁+🎸+(💻🎶)
  • 🐈+💟+👋
  • 🏂+🧀+🍺
  • 🧗+🍔+🍺
  • 🎲,🎨+✏,👨‍🍳,…
  • 🇯🇵🇦🇷🇭🇷🇩🇪🇬🇧🇪🇸🇮🇹🇹🇷🇬🇷🇲🇽🇦🇺🇮🇸🇨🇭🇳🇱🇧🇪🇮🇳

Utilisation hors-ligne disponible