kbld tag correctement les images de conteneurs
Nous le savons tous, l’un des principaux avantages de l’utilisation des images de conteneurs, c’est qu’elles sont immutables. Mais déclarons-nous les correctement dans nos manifests Kubernetes pour en tirer tout le bénéfice ?
Dans nos déclarations de déploiement kubernetes nous indiquons le plus souvent un tag pour identifier la version de l’image à utiliser. Mais est-ce suffisant pour garantir que cette version de l’image est bien celle que nous attendons ?
Si vous connaissez le principe de construction d’une image vous devriez répondre non. En effet, cette étiquette est apposée après la construction de l’image par son créateur (ou une chaine de CI). Donc rien n’empêche de taguer une image qui n’a rien à voir avec la précédente et de la pousser dans la registry. N’est-ce pas ?
Pourquoi garantir l’Immutabilité de vos images de containers ?
Une petite mise en scène :
Imaginons que dans un manifest de deployment kubernetes vous avez :
- Bien indiqué un tag versionné dans l’image à utiliser.
- Respecté la bonne pratique d’utiliser dans vos specs de containeurs
IfNotPresent
pourimagePullPolicy
Mais voila quelqu’un a poussé dans la registry une image avec le même tag avec un contenu ou juste une version d’un composant a changé.
Que se passe-t-il si lors d’un autoscale ou même lorsqu’un pod meurt suite à un bug et que le controller de deployment de Kubernetes décide de lancer le pod sur un node ou l’image n’est pas encore présente ? Bim votre système devient incohérent ! Cela peut conduire à des incidents ou l’analyse va être plus compliquée à mener.
Que faire pour garantir cette immutabilité ?
Nous pourrions utiliser lors du passage dans le pipeline l’ID SHA du commit git pour la rendre immutable.
Mais il y a plus simple pour rendre unique le tag d’une référence d’image dans un manifest. Il suffit d’utiliser une simple information présente dans toutes les images et qui est unique ! Tout simplement son ID. Pour le retrouver il suffit de lancer la commande docker image inspect :
Si vous vous rappelez cet ID est utilisé par le système de fichier de docker pour identifier un layer.
kbld tag les images avec l’id
kbld est un outil écrit par vmware, pour sa plateforme Tanzu ↗, qui fait partie de la suite qui répond au nom de Carvel ↗. Nous verrons d’autres outils de cette suite.
kbld, prononcé [kei·bild], qui prend en charge toutes les phases :
- de construction des images via docker, pack, …
- de pose des tags aux images
- d’envoi dans votre registry d’images de conteneurs
- d’appliquer ces id dans les manifests kubernetes ou tout autre outil comme Helm
Le mieux est de vous montrer son fonctionnement.
Installation de kbld
Comme pour beaucoup d’outils un wget est suffisant :
Utilisation de kbld
kbld utilise en entrée les manifests kubernetes pour y ajouter les ID des images de conteneur au spec de conteneur. Prenons ce simple fichier d’un déploiement que je nommerai deployment1.yml :
Lançons kbld dessus :
On voit qu’en sortie nous avons bien un manifest kubernetes dont l’image, qui au départ utilisait un tag de version, est devenu un id pioché dans la registry.
Whaouuu ! Mon code de CI va se simplifier.
Mais voyons plus loin en utilisant une image construite à partir d’un Dockerfile.
Il suffit d’ajouter quelques lignes au manifest de départ :
On ajoute un objet de type Config au manifest qui va indiquer la source de l’image (le dossier ou se trouve le Dockerfile) et la registry dans laquelle elle devra être poussée à la fin du build.
Créons un simple Dockerfile dans le dossier app1 :
Au passage vous avez vu j’utilise l’ID de l’image et nous la version comme image de base.
Si vous lancez la même commande qu’auparavant kbld construit l’image, la tag, la pousse dans la registry (il faudra s’identifier auparavant) et produit le manifest kubernetes. Il suffit soit :
- de rediriger la sortie pour produire le manifest dans un fichier
- de l’appliquer directement avec un simple
kubectl apply
Comment gérer le multi-environnement ? Il suffit de traiter la sortie d’un helm, d’un kustomize, ou d’un ytt (une autre pépite de la suite carvel que nous verrons une autre fois).
Cet outil possède toute une série de fonctionnalités qui poussent le concept encore plus loin. Tout est documenté ici ↗
Conclusion
Je qualifie cet outil de pépite, car elle résout une problématique tout en simplifiant mes scripts de pipeline CI-CD.
Je remercie David Delassus ↗ qui m’a fait découvrir la suite Carvel dans un commentaire d’un de mes posts sur Linkedin. D’ailleurs nous parlerons bientôt de son produit qui répond au nom de Kubirds ↗ que je présenterai dans les prochains jours.