Helm-Part VI les fonctions tpl, include et required dans la charte
Lors de la création de charts Helm pour Kubernetes, il est important de maîtriser certaines fonctions et pratiques afin de produire des charts robustes et réutilisables. Voici quelques conseils et astuces que vous pouvez utiliser pour optimiser vos développements.
Connaître les Fonctions de Template
Helm utilise des templates Go pour définir des ressources Kubernetes. Ces templates sont puissants grâce à une multitude de fonctions intégrées provenant de la bibliothèque Sprig, ainsi que des fonctions spéciales comme include, required et tpl.
1. Fonction tpl : Évaluation de Templates Dynamiques
La fonction tpl permet d’évaluer des chaînes de caractères comme des templates à l’intérieur d’un autre template. Cela permet de passer des chaînes de template ou de rendre des fichiers de configuration externes de manière flexible.
Exemple 1 : Imaginons que vous souhaitez passer une chaîne template à un autre chart :
# values.yaml
template: "{{ .Values.name }}"
name: "Tom"
# Template principal
{{ tpl .Values.template . }}
Sortie : Tom
Cela vous permet de transmettre des valeurs dynamiques entre les charts ou de référencer des fichiers de configuration externes.
Exemple 2 : Rendre un fichier de configuration externe
Vous pouvez inclure un fichier externe, comme conf/app.conf, et le rendre dynamique :
# Fichier de configuration conf/app.conf
firstName={{ .Values.firstName }}
lastName={{ .Values.lastName }}
# values.yaml
firstName: Peter
lastName: Parker
# Template principal
{{ tpl (.Files.Get "conf/app.conf") . }}
Sortie :
firstName=Peter
lastName=Parker
Cela est particulièrement utile lorsque vous devez inclure des configurations externes dans votre chart.
2. Fonction include : Inclusion de Templates
La fonction include permet d'inclure un autre template dans votre fichier et de traiter le résultat à l'aide de fonctions supplémentaires. Cette méthode est particulièrement utile pour séparer les parties de votre chart et les rendre réutilisables.
# Exemple d'utilisation de `include`
value: {{ include "mytpl" . | lower | quote }}
Dans cet exemple, le template mytpl est inclus, puis le texte est mis en minuscules et enveloppé dans des guillemets.
3. Fonction required : Validation de Valeurs
La fonction required permet de forcer la présence de valeurs dans le fichier values.yaml. Si une valeur est manquante, Helm échoue et renvoie un message d'erreur personnalisé.
# Exemple d'utilisation de `required`
value: {{ required "A valid .Values.who entry required!" .Values.who }}
Cela garantit que certaines valeurs nécessaires soient définies avant d'exécuter le template, évitant ainsi des erreurs lors de la création des ressources Kubernetes.
Meilleures Pratiques dans les Templates
Citer les chaînes de caractères, ne pas citer les entiers
Lorsque vous travaillez avec des chaînes de caractères dans vos templates, il est recommandé de toujours les entourer de guillemets :
# Exemple avec une chaîne de caractères
name: {{ .Values.MyName | quote }}
Cela garantit que les valeurs seront traitées correctement comme des chaînes. Par contre, les entiers ne doivent pas être cités :
# Exemple avec un entier
port: {{ .Values.Port }}
Cette règle s’applique aux variables d’environnement, qui doivent être traitées comme des chaînes, même si elles représentent des entiers :
env:
- name: HOST
value: "http://host"
- name: PORT
value: "1234"
Fonction sha256sum pour Forcer un Redémarrage des Pods
Lorsque vous mettez à jour un ConfigMap ou un Secret et que vous voulez garantir un redémarrage automatique des pods, vous pouvez utiliser la fonction sha256sum pour déclencher une mise à jour si le fichier de configuration change.
kind: Deployment
spec:
template:
metadata:
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
Cela calcule un hachage de votre fichier et met à jour l'annotation dans le manifeste du déploiement, ce qui forcera Kubernetes à redémarrer les pods si le fichier de configuration change.
Utilisation du Fichier _helpers.tpl
Les charts Helm peuvent rapidement devenir complexes, en particulier lorsqu'ils intègrent plusieurs ressources et sous-charts. Pour faciliter la gestion de votre code, il est recommandé de placer les templates d'assistance dans un fichier _helpers.tpl. Ce fichier est un excellent endroit pour définir des fonctions réutilisables, comme des secrets d'accès aux registres Docker ou des configurations externes.
Voici un exemple de définition de fonction dans le fichier _helpers.tpl pour créer un secret pour les informations d'identification Docker :
# _helpers.tpl
{{- define "imagePullSecret" }}
{{- with .Values.imageCredentials }}
{{- printf "{\"auths\":{\"%s\":{\"username\":\"%s\",\"password\":\"%s\",\"email\":\"%s\",\"auth\":\"%s\"}}}" .registry .username .password .email (printf "%s:%s" .username .password | b64enc) | b64enc }}
{{- end }}
{{- end }}
# Utilisation dans un template
apiVersion: v1
kind: Secret
metadata:
name: myregistrykey
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: {{ template "imagePullSecret" . }}
Cette approche permet de centraliser la gestion des secrets et d’autres configurations complexes dans un fichier dédié, améliorant ainsi la lisibilité et la réutilisabilité.
Eviter la Suppression Accidentelle de Ressources
Parfois, certaines ressources doivent être conservées même lorsqu'un chart est désinstallé. Vous pouvez utiliser l'annotation helm.sh/resource-policy: keep pour éviter la suppression automatique d'une ressource lors de la désinstallation du chart.
kind: Secret
metadata:
annotations:
helm.sh/resource-policy: keep
Cela indique à Helm de ne pas supprimer cette ressource lors de l'exécution des commandes helm uninstall, helm upgrade ou helm rollback.
Maîtriser les fonctions de template telles que tpl, include et required ainsi que les bonnes pratiques pour structurer vos charts Helm (comme l’utilisation des fichiers _helpers.tpl et l’utilisation de sha256sum pour forcer des redémarrages) vous permet de créer des charts plus robustes, réutilisables et faciles à maintenir. L’utilisation de ces outils vous aidera à construire des charts Kubernetes plus flexibles et fiables, adaptés aux environnements de production.
En intégrant ces bonnes pratiques dans votre développement Helm, vous pourrez gérer des configurations complexes de manière propre et efficace.