Écriture d’un helm chart#
Précédemment vous avez installé un helm chart qui vous a été fourni. Ici on va créer notre propre “helm chart”. On va en profiter pour voir comment passer des variables d’environnement dans les pods.
Créez un projet dans gitlab, clonez le sur votre machine (il sera vide, mais cela permettra de “pusher” ensuite) , puis créez l’arborescence suivante :
monchart/
├── Chart.yaml
├── values.yaml
└── templates/
├── pod.yaml
└── service.yaml
Objectif du chart:
Déployer un Pod qui lance l’image
jrobert2/demok8senv:1.0.0.Passer la variable d’environnement
DEMOK8Sà l’application, afin qu’elle l’affiche.Exposer l’application via un Service en
NodePortsur le port 32070.
Fichier
Chart.yamlapiVersion: v2 name: exempleappk8s description: Un chart minimal pour déployer une app web qui affiche DEMOK8S type: application version: 0.1.0 appVersion: "1.0.0"
values.yamlenv: DEMOK8S: "Bonjour depuis Helm!"
templates/pod.yamlapiVersion: v1 kind: Pod metadata: name: exempleappk8s labels: app: exempleappk8s spec: containers: - name: exempleappk8s image: "jrobert2/demok8senv:1.0.0" imagePullPolicy: IfNotPresent ports: - containerPort: 5000 env: - name: DEMOK8S value: "{{ .Values.env.DEMOK8S }}"
Notez que dans ce fichier on a les lignes suivantes qui sont “nouvelles” :
env: - name: DEMOK8S value: "{{ .Values.env.DEMOK8S }}"
Ici on a utilisé le fait que l’objet “pod” peut être paramétré par un dictionnaire
envcontenant les valeurs de variables d’environnement. On a de plus utilisé le templating de helm pour que la variable DEMOK8S soit remplacée par la valeur de la variableenv.DEMOK8Sdu fichiervalues.yaml.templates/service.yamlapiVersion: v1 kind: Service metadata: name: exempleappk8s spec: type: NodePort selector: app: exempleappk8s ports: - name: http port: 80 targetPort: 5000 nodePort: 32070
Note
Ici vous déclarez un objet de type "Service"
Supposons que notre conteneur exempleappk8s serve une page sur son port 8080. Pour des raisons de montée en charge, on pourra demander plusieurs "réplicas" de ce conteneur, et on a donc plusieurs pods qui tournent et servent cette page, chacun ayant son adresse IP. Depuis un pod quelconque du cluster, on veut pouvoir accéder à cette page sans avoir à choisir quel pod contacter précisément. Pour cela, kubernetes donne la possibilité de créer une adresse IP virtuelle, telle que si on la contacte, on sera automatiquement dirigé vers l'un quelconque des pods (au hasard ou round robin ou autre).
Un objet de type service est un objet kubernetes qui permet de créer un couple (IP, port) au sein du cluster et de relier ce couple à un ensemble de pods sur un targetPort donné. Lorsqu’on contactera cette (IP,port) (par exemple via curl IP:port), on sera automatiquement mis en relation avec l’un quelconque des pods, au hasard, sur le port “targetPort”.
Ici, on ajoute “nodePort” qui permet de joindre ce service depuis l’extérieur du cluster via n’importe quel nœud sur son port 32070.
Test
Depuis le dossier qui contient
Chart.yamletvalues.yaml:helm template .
Installation
Commitez, pushez, puis allez sur argocd pour déployer votre application.
Avertissement
Attention, pour que cela fonctionne vous devrez mettre votre dépôt en public… nous verrons plus tard comment faire pour que cela fonctionne aussi avec des dépôts privés.
Expérimentations#
Essayez de contacter votre service.
Dans argocd, trouvez où modifier la valeur de la variable DEMOK8S dans les paramètres de l’application et modifiez la. Synchronisez. Constatez que cela a fonctionné.
Entrez dans le conteneur et affichez les variables d’environnement.
Expérimentez !