Mise + Krew : vos plugins kubectl en mode déclaratif
Depuis que je travaille avec Kubernetes, j’utilise Krew pour installer mes plugins kubectl. C’est l’équivalent d’un apt ou d’un brew pour les extensions de kubectl. Très pratique pour les labs, mais avec un gros défaut : aucun moyen de versionner ou de déclarer ses plugins dans un fichier de configuration.
De l’autre côté, Mise est devenu mon gestionnaire d’outils de développement principal au travail. Il remplace krew, pip, parfois brew et propose une manière de gérer les paquets de ces derniers à un seul endroit. Tout est dans un mise.toml, c’est déclaratif, c’est reproductible, c’est ce que je veux.
Et si initialement je passe souvent par Nix, Mise a quand même des avantages que je ne retrouve pas dans l’utilitaire au logo de flocon.
Petite Mise en bouche 🥁
vous l’avez ? vous l’avez ?
Mise est un gestionnaire d’outils écrit en Rust que l’on peut installer sur Linux/MacOS. En résumé, il permet de :
- Gérer les versions de vos outils : Node.js, Python, Go, Tofu, kubectl, etc.
- Charger des variables d’environnement par répertoire (et encore mieux via direnv)
- Définir des tâches (l’équivalent d’un Makefile, mais intégré)
Le tout dans un seul fichier : .mise.toml.
[tools]
python = "3.12"
"aqua:kubectl" = "v1.35.0"
go = 1.26
[env]
KUBECONFIG = "./kubeconfig"
CLUSTER_NAME = "turing"
[tasks."cluster"]
description = "Apply changes to cluster ($CLUSTER_CONFIG)"
run = "go run main.go --cluster=$CLUSTER_NAME"
L’intérêt principal de Mise par rapport à ses concurrents (notamment asdf) : il supporte plusieurs backends pour récupérer les outils (aqua, github, cargo, npm, pipx…).
Dès qu’on entre dans un répertoire contenant un mise.toml, les versions déclarées sont automatiquement activées. C’est particulièrement pratique en équipe, où tout le monde utilise exactement les mêmes versions sans configuration manuelle.
Vous pouvez même gérer des releases privées dans votre organisation interne !
~ mise use github:cuistops/jmeter_fork
~ jmeter
There are updates (8.0.0-cuistops is installed):
Si vous voulez en savoir plus sur Mise, je vous redirige vers les articles/conférences des copains :
Après lecture/visionnage, vous aurez les informations nécessaires pour la suite de mon micro-article 😄 !
Qu’est-ce que Krew ?
Krew est le gestionnaire de plugins officiel pour kubectl. Il est maintenu par le SIG CLI de Kubernetes et fonctionne comme un dépôt centralisé regroupant une énorme quantité de plugins (et ils filtrent assez peu, ça permet à n’importe qui de mettre à disposition son propre plugin).
# Installer un plugin
kubectl krew install klock
# Mettre à jour tous les plugins
kubectl krew upgrade
# Chercher un plugin
kubectl krew search logs
Krew installe les plugins dans ~/.krew/bin/. Kubectl les découvre automatiquement en cherchant les exécutables préfixés kubectl- dans votre PATH.
Parmi les plugins les plus utiles au quotidien :
- stern : tail des logs sur plusieurs pods en simultané, avec filtrage et coloriage
- ctx / ns : changer de contexte ou de namespace sans retaper les commandes complètes
- klock : un équivalent du
--watchen plus lisible - … et les plugins en fonction de votre stack (kubevirt, volsync, rook-ceph…)
Le problème, c’est que Krew n’a pas de notion de versionnage. Il n’installe que la dernière version d’un plugin disponible sur le registre Krew. Impossible de déclarer dans un fichier “j’utilise volsync en version X” et de garantir que tout le monde l’ait (le détail est présent dans cette issue).
C’est là que Mise intervient et apporte une solution durable.
Le problème de l’outillage en équipe
Il est 3h du matin, l’astreinte se déclenche sur votre cluster Kubernetes (Talos of course) et vous avez une erreur sur Ceph. Vous n’avez pas mis à jour votre environnement local depuis un moment (mais peu importe), c’est la radosgw qui vous renvoie une 403 sur un utilisateur précis.
Vous souhaitez lancer la commande de votre documentation kubectl rook-ceph radosgw-admin user list mais … l’argument ne semble pas disponible car vous utilisez la version v0.9.0 qui ne possède pas les commandes liées à la RGW !!
Vous allez devoir mettre à jour votre binaire avant de continuer à debug le cluster, opération devant être réalisée avec le stress de l’astreinte. Imaginez d’autant plus si la dernière version disponible n’est pas celle attendue dans votre documentation.
En bref, il y a une multitude de problèmes à résoudre :
- Comment installer les outils nécessaires ?
- Quelles versions installer ?
- Comment valider les versions utilisées ?
Préciser les versions des outils en entête de la documentation et demander à l’opérateur (vous, à 3h) de l’installer en téléchargeant via les releases github, ce n’est pas catastrophique, mais c’est loin d’être le workflow ultra optimal qu’on cherche.
L’idéal serait de tout déclarer dans un mise.toml : les outils, les versions, et les plugins kubectl. Un seul mise install pour tout avoir.
C’est exactement ce que propose mise-krew.
mise-krew : le backend qui manquait
mise-krew est un plugin communautaire créé par @soupglasses. C’est un backend pour Mise qui permet d’installer des plugins kubectl directement, sans passer par krew et ses limitations.
Information
mise-krew est un projet communautaire. Il n’est pas inclus par défaut dans Mise et doit être enregistré manuellement dans votre configuration.
Concrètement, voilà ce qu’il fait :
- Récupère les manifestes des plugins depuis le dépôt
krew-index - Extrait l’historique des versions depuis les commits git (ce qui permet le versionnage — quelque chose que Krew seul ne sait pas faire)
- Télécharge les binaires depuis les sources upstream
- Vérifie les checksums SHA256
- Installe les fichiers dans les répertoires gérés par Mise, pas dans
~/.krew/bin/
Le tout géré par Mise, dans le PATH via les mécanismes habituels de Mise. Propre, sans effet de bord.
Configuration
Enregistrer le backend
La première étape est d’indiquer à Mise où trouver le backend krew. On ajoute une section [plugins] dans le mise.toml :
[plugins]
krew = "https://github.com/soupglasses/mise-krew"
# si vous voulez une configuration immutable, pointer vers un commit est possible :
krew = "https://github.com/soupglasses/mise-krew#49c405114856112d2d4cc1eb55eddee0249f5f51"
Ou via la CLI pour l’installer :
mise plugin install krew https://github.com/soupglasses/mise-krew
Information
Pour l’installer sur votre poste de manière “wide” (pas scopé à un projet), vous pouvez aussi bien mettre votre configuration dans ~/.config/mise/config.toml.
Déclarer ses plugins kubectl
Une fois le backend enregistré, on déclare ses plugins dans la section [tools] avec la syntaxe "krew:<plugin>" = "<version>" :
[plugins]
krew = "https://github.com/soupglasses/mise-krew"
[tools]
"aqua:kubectl" = "v1.36.0"
"krew:volsync" = "v0.10.0"
"krew:cnpg" = "latest"
"krew:get-all" = "latest"
Et c’est tout. Un simple mise install installe kubectl et tous les plugins.
On peut aisément switcher de version quand nécessaire pour être sûr d’avoir les mêmes versions que la documentation :
➜ mise use "krew:klock"
krew:klock@v0.9.0 ◜
mise ~/.config/mise/mise.toml tools: krew:klock@v0.9.0
➜ kubectl klock -v
kubectl-klock version 0.9.0
➜ mise use "krew:klock@v0.8.4"
krew:klock@v0.8.4 ◜
mise ~/.config/mise/mise.toml tools: krew:klock@v0.8.4
➜ kubectl klock -v
kubectl-klock version 0.8.4
Pour peu que ce fichier de configuration soit versionné et collaboratif, on peut aisément s’assurer qu’on possède les mêmes versions que les collègues et changer dès que nécessaire.
Conclusion
Avec mise-krew, les plugins kubectl se gèrent comme des versions de libs ou packages comme les autres dans le mise.toml. L’onboarding se résume à un mise install, et les mises à jour de plugins passent par les mêmes workflows que le reste du projet.
Ne vous détrompez pas : j’aime toujours autant Nix en perso, mais celui-ci est un écosystème complet et pas vraiment pratique pour le “simple” besoin de télécharger des binaires à la bonne version.
C’est une petite chose, mais c’est le genre de setup qui fait gagner du temps à long terme.
