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 :
- 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.
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
Pratique non ?
La liste complète des commandes est disponible par le raccourci ctrl + a
ou avec :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.
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
).
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.)
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
.
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 :
Vous pouvez à tout moment appuyer sur la touche ?
pour afficher l'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.
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
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>⏎
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.
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...
.
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.
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.
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
.
Upscale / Downscale des ressources
Dans la vue :statefulset
ou :replicaset
, on peut modifier le nombre de réplica en appuyant sur la touche s
.
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.
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).
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.
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+\
.
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.
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
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.
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 (🐳)
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.
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.