TP optionnel - Écrire un chart pour notre application monsterstack
Récupérez la correction du dernier TP sur le déploiement de la monsterstack avec la commande:
git clone -b tp_monsterstack_final https://github.com/Uptime-Formation/corrections_tp.git tp_monsterchart
.Ouvrez le dans VSCode
Pour démarrer le développement d'un chart on peut utiliser une commande helm d'initialisation qui va générer un chart d'exemple :
helm create monsterchart
git clone -b tp_monsterstack_final https://github.com/Uptime-Formation/corrections_tp.git tp_monsterchart Observons un peu le contenu de notre Chart d'exemple :Un dossier
templates
avec tous les fichiers resources à trou qui seront templatés par helm et quelques snippet utilitaires de templating dans _helpers.tplLe fichier
values.yaml
avec les valeurs par défaut pour l'installation, qu'on va pouvoir surcharger pour installer le chartUn fichier NOTES.txt contenant le texte d'aide qui s'affichera pour l'utilisateur à la fin de l'installation
Un fichier
Chart.yaml
contenant des informations/paramètres caractérisant le chart lui même comme son nom, sa version et la version nde l'application installée correspondante.
Ce chart d'exemple est déjà installable en l'état et créé un déploiement de nginx, un service et un ingress pour pouvoir afficher la page d'accueil de Nginx.
Nous avons un soucis pour étudier ce chart : la syntaxe lourdement chargée de templating est assez illisible en l'état. Étudier le déploiement concret implique de réaliser le templating pour visualiser résultat final. Deux méthodes plutôt sont possibles :
helm template releasename --values=valuefile.yaml ./chart_folder > result.yaml
helm install releasename --dry-run --debug --values=valuefile.yaml ./chart_folder > debug-chart.yaml
La seconde a l'avantage d'afficher des informations de debug comme les informations de la release et la liste des valeurs calculées pour le templating.
- Utilisez la deuxième commande pour faire une évaluation de ce qui serait installé avec le chart par défaut
Une version statique de notre chart
Nous allons dans un premier temps remplacer les templates (à trou) par les fichiers statiques de notre déploiement du TP précédent, puis nous ajouterons quelques paramètres.
- Dupliquez le dossier
templates
entemplates_backup
puis supprimez les fichiers template yaml et le dossiers test du dossier templates - Ajoutez vos fichiers d'installation copiés depuis
k8s-deploy-dev
. - Testez le templating avec la commande utilisée précédemment.
Ce chart statique a plusieurs soucis mais notamment il ne permet par d'être installé plusieurs fois. Nous allons corriger quelques aspects en le variabilisant.
Ajouter des paramètres simples
Nous allons paramétrer à minima nos templates pour pouvoir modifier:
- les images utilisées pour l'installation des services
- le nom des resources pour éviter les conflits
- la configuration du ingress
Pour ce faire:
- Déplacez le fichier
values.yaml
existant dans le dossiertemplates_backup
. - Ajoutez à un nouveau fichier
values.yaml
avec le code suivant :
frontend:
image:
name: frontend
tag: latest
service:
port: 5000
imagebackend:
image:
name: amouat/dnmonster
tag: "1.0"
redis:
image:
name: redis
tag: latest
- Remplacez ensuite dans nos trois fichiers template la valeur image du conteneur par ces valeurs dynamique avec un emplacement de variable de la forme
{{ .Values.imagebackend.image.name }}:{{ .Values.imagebackend.image.tag }}
Passons maintenant à la gestion dynamique du nom pour pouvoir installer notre chart plusieurs fois. Pour cela nous allons utiliser le helper monsterchart.fullname
disponible dans le chart d'exemple.
- Observez et commentons ce helper qui génère automatiquement un nom compatible pour notre release
- Observez dans le chart d'exemple (
templates_backup
) comment est utilisé ce helper par exemple dans le template du déploiement. - Remplacez pour les 3 services (redis, frontend et imagebackend) toutes les occurences de
<nomservice>
dans le nom des ressources et les labelspartie:
en ajoutant-{{ include "monsterchart.fullname" . }}
comme suffixe. - Testez avec la commande d'installation dry run précédente.
Enfin nous allons ajouter la gestion dynamique du ingress en copiant celle du chart d'exemple.
Supprimez le template
monsterstack-ingress.yaml
Copiez le template
ingress.yaml
du backupCopiez la section
ingress
depuis levalues.yaml
déplacé danstemplates_backup
vers levalues.yaml
principal et complétez la avec le nom de domaine de votre choix et activez le ingress avecenabled: true
:Modifiez le template ingress pour qu'il pointe vers la bonne ressource service à savoir
frontend-{{ include "monsterchart.fullname" . }}
(il y a deux valeurs à modifier service: name: et serviceName: plus bas.`)Dans le même fichier, modifiez enfin la variable port pour l'adapter à notre cas
{{- $svcPort := .Values.service.port -}}
=>{{- $svcPort := .Values.frontend.service.port -}}
Testez le résultat et s'il vous semble bon, essayez de déployer votre chart pour de vrai (sans dry-run) et avec
tecpi/monstericon
du dockerhub comme image frontend.Vous pouvez essayer d'installer une autre release pour confirmer que tout fonctionne.
Idées d'amélioration
- Paramétrer les labels comme dans le chart exemple.
- Fixer le bug de connexion à redis et imagebackend en ajoutant un parametrage par variable d'environnement du nom de domaine des services dans app.py.
- Ensuite, s'inspirant du dump du chart wordpress, utilisez une configmap pour générer la variable d'environnement du domaine de chaque service.
- Utiliser pour l'installation de redis une dépendance à un autre chart comme par exemple ce lui de Bitnami (voir sur https://artifacthub.io) et la documentation ici : https://helm.sh/docs/helm/helm_dependency/
- Essayer de packager et héberger le chart comme expliqué ici : https://docs.bitnami.com/tutorials/create-your-first-helm-chart/
Solution
Le dépôt Git de la correction de ce TP est accessible ici : git clone -b tp_monsterchart https://github.com/Uptime-Formation/corrections_tp.git