Aller au contenu
Conteneurs & Orchestration medium

K9s : Piloter Kubernetes depuis le terminal

16 min de lecture

logo k9s

Ce guide vous permet de piloter vos clusters Kubernetes depuis le terminal, sans enchaîner des kubectl get, describe, logs à la main. K9s offre une interface TUI (Text User Interface) qui affiche l’état de vos ressources en temps réel, avec navigation par touches, filtres, et actions contextuelles. Vous apprendrez à l’installer, naviguer efficacement, et le personnaliser. Prérequis : kubectl configuré et un cluster accessible.

Le problème : trop de commandes kubectl répétitives

Section intitulée « Le problème : trop de commandes kubectl répétitives »

Quand vous déboguez ou surveillez un cluster Kubernetes, vous enchaînez souvent :

Fenêtre de terminal
kubectl get pods -n monitoring
kubectl describe pod prometheus-0 -n monitoring
kubectl logs prometheus-0 -n monitoring -f
kubectl get events -n monitoring --sort-by='.lastTimestamp'

Problèmes concrets :

  • Beaucoup de frappe répétitive
  • Impossible de voir l’état en temps réel sans boucle watch
  • Changement de namespace/contexte fastidieux
  • Pas de vue d’ensemble “santé du cluster”

K9s est une interface TUI développée en Go qui s’exécute dans votre terminal. Elle offre :

FonctionnalitéCe que ça change
Rafraîchissement temps réelPlus besoin de relancer les commandes
Navigation par vues:pods, :deploy, :svc, :nodes
Actions contextuellesLogs, describe, shell, edit, delete en une touche
Filtres puissants/ pour chercher, -l pour labels
Vues diagnostiques:popeye (problèmes), :xray (dépendances), :pulse (santé)

Version actuelle : v0.50.18 (janvier 2026)

mise gère les versions d’outils de développement.

Fenêtre de terminal
mise install k9s@latest
mise use -g k9s@latest

Vérification :

Fenêtre de terminal
k9s version
Version: v0.50.18

Objectif : être opérationnel immédiatement, sans se noyer dans les options.

  1. Lancer K9s

    Fenêtre de terminal
    k9s

    K9s ouvre la vue pods du contexte courant. La barre d’état (en haut) affiche :

    • Contexte actif (ex: minikube)
    • Namespace courant (ex: default)
    • Version K9s et cluster
  2. Repérer les zones de l’écran

    ZoneContenu
    HautContexte, namespace, raccourcis actifs
    CentreListe des ressources (pods par défaut)
    BasBarre de commande (:) et filtres (/)
  3. Les 5 gestes de base

    GesteToucheEffet
    Ouvrir une vue: + nom:pods, :deploy, :svc
    Filtrer/ + texteRecherche instantanée
    Voir détailsEnterDrill-down dans la ressource
    RetourEscRevenir à la vue précédente
    Aide?Affiche tous les raccourcis
  4. Mini routine de découverte

    :pods → sélectionner un pod → l (logs) → Esc
    → d (describe) → Esc
    → y (yaml) → Esc
    → :events (voir les événements)
  5. Quitter

    Ctrl+C ou :quit

TP 5 minutes : explorer votre cluster
  1. Lancez k9s
  2. Tapez :ns et changez de namespace
  3. Tapez :pods et filtrez avec / suivi d’un nom de pod
  4. Sur un pod, appuyez sur l pour les logs, puis Esc
  5. Appuyez sur d pour describe, puis Esc
  6. Tapez :events pour voir les événements récents
  7. Quittez avec Ctrl+C

Résultat attendu : vous savez naviguer entre vues, filtrer, et inspecter un pod.

Objectif : naviguer plus vite qu’avec kubectl get … | grep.

VueCommandeAliasContenu
Pods:pods:poTous les pods du namespace
Déploiements:deployments:dpDéploiements et replicas
Services:services:svcServices et endpoints
Nodes:nodes:noÉtat des nœuds
Events:events:evÉvénements cluster
Namespaces:namespaces:nsChanger de namespace
Contextes:contexts:ctxChanger de cluster

Astuce : tapez 0 pour voir tous les namespaces d’un coup.

Type de filtreSyntaxeExemple
Texte simple/texte/nginx
Regex/regex/nginx-[0-9]+
Par label/-l key=value/-l app=frontend
Inverser/!texte/!kube-system
Fuzzy//texte//ngx

Actions contextuelles (sur une ressource sélectionnée)

Section intitulée « Actions contextuelles (sur une ressource sélectionnée) »
CatégorieActionTouche
ObserverLogsl
Described
YAMLy
Shells
AgirÉditere
SupprimerCtrl+D
Kill (restart)Ctrl+K
NaviguerRetourEsc
Aide?
VueCommandeUsage
Popeye:popeyeScan des problèmes de config (limites, probes, RBAC)
XRay:xray TYPEDépendances (ex: :xray deploy → rs → pods)
Pulse:pulseTableau de bord santé du cluster
TP 5 minutes : maîtriser les filtres
  1. Lancez k9s et tapez :pods
  2. Tapez / puis un nom partiel de pod → filtrage instantané
  3. Tapez Esc pour effacer le filtre
  4. Tapez /-l app= suivi d’un label existant
  5. Tapez 0 pour voir tous les namespaces
  6. Tapez :xray deploy pour voir les dépendances

Résultat attendu : vous filtrez en temps réel sans quitter K9s.

Objectif : transformer K9s en runbook interactif pour diagnostiquer un pod.

Quand un pod ne fonctionne pas, suivez cette séquence :

  1. Events du namespace:events

    Cherchez les erreurs récentes : FailedScheduling, ImagePullBackOff, CrashLoopBackOff, Unhealthy.

  2. État du pod:pods → sélectionner le pod problématique

    Regardez la colonne STATUS et RESTARTS.

  3. Describe — touche d

    Sections à vérifier :

    • Conditions : Ready, ContainersReady, PodScheduled
    • Events (en bas) : erreurs de scheduling, probes, volumes
  4. Logs — touche l

    • p pour logs précédents (si le conteneur a crashé)
    • w pour activer le wrap (lignes longues)
    • t pour afficher les timestamps
    • 0-9 pour sélectionner un conteneur (multi-conteneurs)
  5. YAML — touche y

    Vérifiez : image, resources, env, volumeMounts, livenessProbe, readinessProbe.

  6. Shell — touche s (si le pod tourne)

    Exécutez des commandes de diagnostic dans le conteneur.

SymptômeCause probableOù regarder
PendingPas de node disponible, PVC non lié:events, describe → Conditions
ImagePullBackOffImage introuvable, auth registry:events, describe → Events
CrashLoopBackOffErreur au démarrageLogs (l puis p pour previous)
OOMKilledMémoire insuffisanteDescribe → Last State, ajuster resources
UnhealthyProbe échoueDescribe → Events, vérifier livenessProbe
ErrorErreur applicativeLogs
TP 5 minutes : simuler un debug
  1. Lancez k9s et tapez :pods
  2. Sélectionnez un pod quelconque
  3. Appuyez sur d (describe) → repérez les Conditions et Events
  4. Appuyez sur Esc, puis l (logs)
  5. Appuyez sur t (timestamps), w (wrap)
  6. Si multi-conteneurs, appuyez sur 0, 1, etc. pour changer
  7. Appuyez sur Esc, puis y (YAML) → repérez resources, image, probes

Résultat attendu : vous savez où chercher selon le symptôme.

Objectif : passer du symptôme à la zone de panne sans enchaîner les commandes.

Tapez :pulse pour afficher un tableau de bord avec :

  • Nombre de pods par état (Running, Pending, Failed)
  • Utilisation CPU/Mem agrégée
  • Tendances et signaux faibles

Usage : repérer rapidement si le cluster est sain avant de creuser.

Tapez :xray TYPE pour visualiser la hiérarchie d’une ressource :

:xray deploy → Deployment → ReplicaSet → Pods
:xray svc → Service → Endpoints → Pods
:xray sts → StatefulSet → Pods → PVCs

Usage : identifier quel niveau de la chaîne pose problème (ex: un ReplicaSet qui ne crée pas de pods).

Tapez :popeye pour lancer un scan qui détecte :

  • Ressources sans limites CPU/Mem
  • Pods sans probes
  • Secrets non utilisés
  • Problèmes RBAC
Fenêtre de terminal
# Mode lecture seule (sécurité en prod)
k9s --readonly
# Démarrer sur un namespace spécifique
k9s -n monitoring
# Démarrer sur tous les namespaces
k9s -A
# Démarrer sur une vue spécifique
k9s -c deploy # Déploiements
k9s -c svc # Services
k9s -c popeye # Analyse de problèmes
# Modifier le taux de rafraîchissement (en secondes)
k9s --refresh 5
# Utiliser un kubeconfig spécifique
k9s --kubeconfig ~/.kube/prod-config
# Contexte spécifique
k9s --context prod-cluster
Toutes les options CLI
OptionDescription
--readonlyMode lecture seule
-n NAMESPACENamespace de départ
-ATous les namespaces
-c VIEWVue de départ (pods, deploy, svc, etc.)
--refresh NRafraîchissement en secondes
--kubeconfig PATHFichier kubeconfig
--context NAMEContexte Kubernetes
--headlessSans logo ni bannière
--logolessSans logo
--crumbslessSans fil d’Ariane
--writeForce le mode écriture même si readOnly: true

Pour toutes les options : k9s --help ou la documentation officielle.

K9s suit la convention XDG pour ses fichiers de configuration :

FichierEmplacement Linux/macOS
Config principale~/.config/k9s/config.yaml
Skins (thèmes)~/.config/k9s/skins/
Plugins~/.config/k9s/plugins.yaml
Hotkeys~/.config/k9s/hotkeys.yaml
Aliases~/.config/k9s/aliases.yaml
Logs~/.local/state/k9s/k9s.log
~/.config/k9s/config.yaml
k9s:
liveViewAutoRefresh: true
refreshRate: 2
maxConnRetry: 5
readOnly: false
noExitOnCtrlC: false
ui:
enableMouse: false
headless: false
logoless: false
crumbsless: false
noIcons: false
skipLatestRevCheck: false
disablePodCounting: false
shellPod:
image: busybox:1.36.1
namespace: default
limits:
cpu: 100m
memory: 100Mi
logger:
tail: 100
buffer: 5000
sinceSeconds: -1
fullScreenLogs: false
textWrap: false
showTime: false
thresholds:
cpu:
critical: 90
warn: 70
memory:
critical: 90
warn: 70

Créez ~/.config/k9s/hotkeys.yaml :

hotKeys:
shift-1:
shortCut: Shift-1
description: View deployments
command: dp
shift-2:
shortCut: Shift-2
description: View services
command: svc
shift-3:
shortCut: Shift-3
description: XRay deployments
command: xray deploy

K9s supporte les thèmes personnalisés. Placez vos fichiers dans ~/.config/k9s/skins/.

Exemple minimaliste :

~/.config/k9s/skins/dark.yaml
k9s:
body:
fgColor: white
bgColor: black
logoColor: blue
info:
fgColor: lightgray
sectionColor: steelblue

Puis dans config.yaml :

k9s:
ui:
skin:
name: dark

Des thèmes prédéfinis sont disponibles dans le dépôt officiel.

Les plugins permettent d’étendre K9s avec des commandes personnalisées.

Exemple : intégrer Dive pour analyser les images :

~/.config/k9s/plugins.yaml
plugins:
dive:
shortcut: Shift-D
confirm: false
description: Dive into container image
scopes:
- containers
command: dive
background: false
args:
- $COL-IMAGE
VariableDescription
$NAMESPACENamespace de la ressource
$NAMENom de la ressource
$CONTAINERConteneur actuel
$PODNom du pod
$CONTEXTContexte Kubernetes actif
$KUBECONFIGChemin du kubeconfig
$COL-<COLUMN>Valeur d’une colonne (ex: $COL-IMAGE)

Pour explorer un cluster de production sans risque de modification accidentelle :

Fenêtre de terminal
k9s --readonly

Ou dans config.yaml :

k9s:
readOnly: true

K9s gère les contextes, mais pour une navigation encore plus rapide :

Si vous travaillez en équipe, versionnez vos fichiers de configuration :

~/.config/k9s/
├── config.yaml
├── plugins.yaml
├── hotkeys.yaml
└── skins/
└── team-dark.yaml

Partagez via un dépôt dotfiles ou un outil de configuration management.

SymptômeCause probableSolution
no such file or directory au lancementConfig absenteNormal au premier lancement, K9s la crée
forbidden sur les ressourcesDroits RBAC insuffisantsVérifier vos permissions Kubernetes
Affichage décalé/casséTerminal trop petit ou incompatibleAgrandir la fenêtre, vérifier $TERM
Version Snap en retardPackage non mis à jourPasser à Homebrew ou binaire GitHub
Logs introuvablesEmplacement par défautk9s info pour voir le chemin des logs
  • K9s = TUI Kubernetes pour observer et agir vite, sans quitter le terminal
  • Version actuelle : v0.50.18 — vérifiez avec k9s version
  • Configuration via XDG (~/.config/k9s/), retrouvez les chemins avec k9s info
  • Installation recommandée : mise, Homebrew, binaires GitHub (Snap peut être en retard)
  • En production : utilisez --readonly pour éviter les accidents
  • Plugins et hotkeys font gagner du temps, mais restent à maîtriser (sécurité + cohérence équipe)

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.