kapp-controller est une extension de
kapp qui
permet d’installer et de mettre à jour vos applications et packages sur vos
clusters Kubernetes. Il fait partie de la suite Carvel.
kapp-controller vous laisse le choix de vos outils de configuration et de vos
sources de configuration : configurations YAML simples, graphiques Helm, modèles
ytt, modèles jsonnet, … chargé depuis un référentiel Git, une archive sur
HTTP, un référentiel Helm, etc
Fonctionnement de kapp-controller
On retrouve le même principe de fonctionnement que les systèmes de packages
Linux (apt, yum, …). En effet, kapp-controller décompose l’installation d’un
package d’une application en trois étapes :
Fetch : récupération des définitions des sources de l’application depuis le
package repository.
Template: applications des valeurs fournies par l’utilisateur pour
personnaliser le logiciel en utilisant des templates ytt, helm, …
Deploy : création ou mise à jour des ressources sur le cluster
kapp-controller utilise des images crées avec l’outil de la suite Carvel
répondant au nom de imgpkg. Nous en verrons l’utilisation plus bas dans le
tutoriel.
Installation de kapp-controller sur votre cluster
Pour notre tutoriel je vais avoir besoin d’une registry docker. Je la crée en
locale :
L’installation de kapp-controller se fait simplement avec kapp. Pour ce
tutoriel j’ai utilisé un cluster créé avec
kind.
Un pti coup d’inspect :
On voit tout ce qui a été déployé pour kapp-controller :
des CRD : internalpackagemetadatas.internal.packaging.carvel.dev,
internalpackages.internal.packaging.carvel.dev,
packageinstalls.packaging.carvel.dev, apps.kappctrl.k14s.io et
packagerepositories.packaging.carvel.dev
une API : v1alpha1.data.packaging.carvel.dev
un namespace : kapp-controller
un Service Account : kapp-controller-sa
un deployment : kapp-controller
Déployer une application avec kapp-controller
Je reprends les mêmes exemples fournis sur le projet de
kapp ↗.
Notre exemple se trouve dans le répertoire config-step-2-template où on y
retrouve deux fichiers au format ytt, c’est-à-dire un template :
config.yaml : qui définit un service et un deployment
values.yml : qui contient les valeurs qui seront appliquées par ytt
Pour ceux qui ne connaissent pas le langage de template ytt je vous renvoie à
mon billet.
Création du package de l’application avec imgpkg
Nous allons utiliser imgpgk pour construire notre package d’application et
pour le pousser dans la registry locale.
Nous allons créer la structure qui contiendra notre package d’application et y
déposer les fichiers nécessaires :
imgpkg utilise d’un répertoire .imgpkg pour y déposer ses définitions. On
peut y retrouver deux fichiers : bundle.yml qui contient des métadatas
(optionnel) et images.yml qui référence les images utilisées dans le package.
Pour construire ces images, nous allons utiliser kbld qui offre cette
fonctionnalité. Pour rappel,
kbld scrute les metadatas d’une
ressource kubernetes pour y retrouver les images utilisées par les pods pour les
rendre immutable en lui accolant un SHA. Ici ce SHA existe déjà, regardez le
contenu du fichier config.yml. Supprimez le avant et vous verrez il l’ajoutera.
Que contient ce fichier images.yml :
Maintenant poussons l’image dans la registry avec imgpkg :
Vérifions ce que contient notre registry locale :
On a bien notre image.
Création des définitions de notre application
Pour déployer notre application avec kapp-controller nous devons définir deux
objets : un Package et un PackageMetadata.
Commençons par le PackageMetadata :
Il ne contient comme attendu que des metadatas qui sera utilisé par
kapp-controller lors du fetch.
Ensuite créons la déclaration du Package. Nous allons utiliser ytt comme système
de template et donc nous allons devoir créer une ressource de type schema au
format openAPI :
Vérifions ce qu’il contient :
Créons maintenant le package :
Vous allez me dire “outch” bien difficile à comprendre. Attendez ça va s’éclaircir
par la suite. Ça me rappelle la première fois ou j’ai du créer un package yum.
Création du Package Repository
Pour rappel, Un Package Repository est l’endroit où nous allons déposer nos
applications et ses metadatas et dans lequel kapp-controller vient puiser pour
les déployer.
Commençons par créer les répertoires nécessaires :
Lançons la création du package avec ytt en indiquant la version que nous voulons
créer :
Un petit coup de kbld pour créer notre image de repo :
Normalement on doit retrouver le fichier images.yml dans le répertoire .imgpkg
Poussons notre repository dans la registry :
Déploiement du repository sur le cluster
Pour le moment nous avons préparé le terrain en créant toutes les images : celle
du package de l’application et celle du repository. Maintenant il faut créer le
repository physiquement au sein du cluster. Pour cela il faut utiliser la CRD
PackageRepository :
Pour le déployer nous allons utiliser kapp qui va nous permettre de voir ce qui
se passe :
On en sort avec succès. Mais que se passe-t-il ? Nous application est-elle déjà
déployée ? Non, car nous avons juste créé le repository.
Utilisons la commande kubectl pour voir ce que nous affiche la ressource
PackageRepository que nous venons de créer :
Maintenant vérifions ce que contient notre repository :
On y trouve notre application. Maintenant quelle version de l’application
disposons-nous ?
Notre version 1.0.0. Mais que contient-elle ?
Tout simplement toutes les informations nécessaires à son déploiement : les
phases : fetch, template et deploy.
Déploiement de l’application sur le cluster
Maintenant que nous avons notre repository d’applications contenant notre
application, voyons comment la déployer. Comme pour les autres phases un yaml
est nécessaire (IAC bien) :
On y retrouve l’appel à la référence CRD packageinstalls qui utilise une spec de
type packageRef qui indique le nom du package (refname) et sa version à utiliser
:
Vous avez certainement remarqué la création d’un secret qui vient définir le
fichier “values.yml” utilisé par le package et d’un service account qu’il faut
déployer avant.
Déployons maintenant notre application :
Si comme moi la première fois vous avez des erreurs la commande kapp inspect
avec l’option --status vous indiquera la cause :
Une fois corrigé, dans mon cas, j’avais oublié le fichier de config dans le
package de l’application on peut vérifier que notre application est bien
déployé.
Notre application est bien déployée et fonctionne.
Conclusion
Franchement j’en sors content, car j’ai bien compris le principe. Mais je me pose
quelques questions comme :
Est-il possible d’utiliser des repos externes ? Car tout mettre dans le même
cluster n’est pas dans mes principes.
Le debug de la partie déploiement est-il facile ? Là, je m’en suis sorti, mais
dans des cas plus complexes ???
Comment industrialiser tout ça ?
Comment l’utiliser avec une démarche GitOps ? Car pour le moment je n’ai pas
vu trace d’utilisation de repository git.
Voilà ça demande encore un peu de travail pour l’adopter comme gestionnaire
d’applications. Et vous donnez moi en commentaires vos réflexions.