Écriture d’un helm chart

É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 NodePort sur le port 32070.

  1. Fichier Chart.yaml

    apiVersion: 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"
    
  2. values.yaml

    env:
      DEMOK8S: "Bonjour depuis Helm!"
    
  3. templates/pod.yaml

    apiVersion: 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 env contenant 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 variable env.DEMOK8S du fichier values.yaml.

  4. templates/service.yaml

    apiVersion: 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.

  1. Test

    Depuis le dossier qui contient Chart.yaml et values.yaml:

    helm template .
    
  2. 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#

  1. Essayez de contacter votre service.

  2. 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é.

  3. Entrez dans le conteneur et affichez les variables d’environnement.

  4. Expérimentez !