Packager son application avec Helm
Objectifs du chapitre et prérequis
Jusqu’à maintenant, vous avez vu comment gérer un cluster ou déployer une application dans le cluster en vous appuyant sur des fichiers statiques.
La notion d’espace de noms peut permettre de séparer plusieurs versions d’une même application. Toutefois, certains objets ont besoin d’être différenciés, comme l’adresse de publication (Ingress).
Ce chapitre vous présente la gestion de ces différences à l’aide de Helm. Ce logiciel rend ainsi le déploiement d’une application le plus transparent possible. Une présentation sera également donnée du langage Go template utilisé par Helm pour fonctionner.
Helm
1. Origine du besoin
Même dans le cas d’une application simple comme Mailpit, le déploiement réclame un certain nombre de déclarations :
-
un déploiement (deployment) ;
-
une déclaration de service (service) ;
-
une demande de volume persistant (persistent volume claim) ;
-
une règle de publication (ingress).
Malheureusement, dans le cas où l’on ne souhaiterait pas publier l’application sur l’extérieur ou ajouter de volume persistant, il n’y a pas d’autre solution que d’éditer les fichiers à la main avant de les soumettre au cluster ou de n’envoyer qu’une partie des fichiers vers l’API de Kubernetes.
Afin d’éviter ces opérations manuelles, il est possible de faire appel à des préprocesseurs qui prendront ces fichiers en entrée et y appliqueront des modifications avant de les soumettre à l’API de Kubernetes.
Dans le cas de Helm, ce travail de préparation des fichiers se fait à l’aide du moteur de template du langage Go.
2. Création d’un chart
La création d’un package se fait à l’aide de la commande helm suivie des options suivantes :
-
le mot-clé create ;
-
le nom du chart à créer.
Pour créer un chart pour l’application Mailpit, lancez la commande suivante :
$ helm create mailpit
3. Contenu d’un package
a. Structure d’un package
Par défaut, cette commande réalise les opérations suivantes :
-
création d’un répertoire mailpit ;
-
dépôt d’un ensemble de fichiers par défaut.
Ce répertoire contient les éléments suivants :
-
fichier .helmignore : liste de fichiers à ignorer ;
-
fichier Chart.yaml : descriptif du chart ;
-
fichier values.yaml : contient les valeurs par défaut du chart ;
-
répertoire charts/ : contient les dépendances réclamées par ce chart ;
-
répertoire templates/ : contient les fichiers YAML à templatiser ;
-
répertoire templates/tests/ : contient les fichiers YAML permettant de réaliser des tests en fin de déploiement.
b. Variables .Values, .Chart et .Release
Le contenu des variables par défaut du fichier values.yaml est disponible...
Template Go
1. Principe de fonctionnement
Le mécanisme de template du langage Go part d’une représentation textuelle (un fichier YAML, par exemple) dans laquelle certaines parties sont rendues dynamiques à l’aide des mécanismes suivants :
-
soit à l’aide de variables ;
-
soit à l’aide de structures de contrôle pour afficher ou non une section (à l’aide d’instructions if/else) ou pour les répéter.
De ce point de vue, la syntaxe de base est assez proche de moteurs existants comme Jinja pour Python (utilisé notamment par Ansible) ou du moteur de template de Puppet.
Toutes les opérations réalisées par le moteur utilisent des moustaches avec une partie ouvrante ({{) et une partie fermante (}}).
2. Substitution du contenu d’une variable
Pour afficher le contenu de la variable version déclarée dans le fichier values.yaml, l’appel se fera de la manière suivante :
version contient la valeur suivante : {{ .Values.version }}
Dans le cas où la variable contient la valeur 1.0, le moteur produira la sortie suivante :
La variable version contient la valeur suivante : 1.0
3. Blocs conditionnels
Le langage supporte les blocs if/then/else. Il est possible d’afficher le contenu d’un bloc en fonction d’une condition.
Ci-dessous un exemple de bloc de conditions :
{{ if .Values.beauTemps }}
Je sors sans mon parapluie.
{{ else }}
Je prends mon parapluie.
{{ end }}
Dans le cas où la condition beauTemps est vraie, le moteur renverra le texte suivant :
Je sors sans mon parapluie.
Dans le cas où beauTemps est faux, le moteur renverra alors le résultat suivant :
Je prends mon parapluie.
4. Gestion des conditions
a. Les valeurs de vrai ou faux
En Go template, les valeurs suivantes prendront la valeur fausse :
-
variable non déclarée (ex. : .Values.nonDeclaree) ;
-
variable contenant une structure vide (chaîne de caractères vide, tableau ou tableau de hachage) ;
-
variable contenant la valeur false, 0 ou nul (valeur nil en Go).
Toutes les autres valeurs sont considérées comme vraies.
À noter que certaines conditions sont parfois imbriquées dans des sous-champs. Ainsi...