Aller au contenu principal

Utiliser le gestionnaire de packages Helm

· 9 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Helm est le gestionnaire de paquets officiel de Kubernetes, écrit en Go, qui permet de gérer le cycle de vie d'une application au sein d'un cluster Kubernetes

Fonctionnement d'un gestionnaire de package

Pour rappel, un gestionnaire de package est un outil permettant gérer le cycle de vie des applications dans un système informatique. Ce cycle de vie comprend les phases d'installation, de mise à jour (upgrade), de retour arrière (downgrade) et de désinstallation d'une application. Helm est en quelque sorte le yum ou l'apt de Kubernetes.

Le fonctionnement d'un gestionnaire de paquets est simple. Tout d'abord, l'utilisateur passe le nom d'un progiciel en argument. Le gestionnaire de packages effectue une recherche dans un référentiel de packages pour voir si ce package existe. S'il est trouvé, le gestionnaire de packages installe l'application définie par le package et ses dépendances aux emplacements spécifiés sur le système.

Quelques définitions

Les Charts Helm

Un Chart est le package Helm. Il contient toutes les définitions des ressources nécessaires pour installer un objet à l'intérieur d'un cluster Kubernetes.

Un dépot Helm

Un dépot ou repository est l'endroit où les charts sont stockés et mis à disposition. Personnellement, je n'installe jamais une application via un dépôt public. J'utilise un gestionnaire de Repository, Nexus entre autre, car il permet de gérer la plupart des types de repository dont Helm.

Une release Helm

Une Release est une instance d'un chart Helm installé sur un cluster Kubernetes. Un chart Helm peut être installé à plusieurs reprises sur le même cluster Kubernetes, mais devra avoir un release name différent.

Installation de Helm

Bon maintenant que nous avons défini ces trois concepts, passons à l'installation de Helm. L'installation est assez simple si on utilise asdf :

asdf plugin add helm
asdf install helm latest
asdf global helm latest

Pour ceux qui veulent l'installer sans utiliser asdf :

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Je vous déconseille de l'installer avec le gestionnaire de package de votre système d'exploitation, car vous utiliseriez une vielle version d'Helm.

Afficher l'aide de Helm

La cli d'Helm est très bien documentée. Pour afficher l'aide il suffit d'ajouter --help. Ce fonctionne vaut pour toutes le commandes de Helm helm <commande> --help :

helm ls --help
This command lists all of the releases for a specified namespace (uses current namespace context if namespace not specified).

By default, it lists only releases that are deployed or failed. Flags like
'--uninstalled' and '--all' will alter this behavior. Such flags can be combined:
'--uninstalled --failed'.

...

Installation de Package Helm

Gérer les repositories Helm

Une fois Helm installé vous ne possédez aucun repository configurer sur votre session. Vous pouvez ajouter le premier repo avec la commande repo add :

helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories

Pour les repositories configuré sur votre session il suffit d'utiliser la commande suivante :

helm repo list
NAME    URL
stable  https://charts.helm.sh/stable

Pour trouver d'autres repos, par exemple celui fournissant l'ingress controller nginx, il suffit de se rendre sur le Hub Artifact.

Comme pour les repository de packages de systèmes d'exploitation il est possible de mettre à jour l'index. Cela permet de bénéficier des dernières versions de package :

helm repo update

Recherche de package Helm

Il existe deux commandes qui permettent de rechercher des packages Helm dans les repository public : helm search hub et helm search repo.

La première commande lance une recherche sur l'Artifact Hub qui regroupe un grand nombre de repositories :

helm search hub loki | grep 2.4.2
URL                                                     CHART VERSION   APP VERSION     DESCRIPTION
https://artifacthub.io/packages/helm/wenerme/loki       2.9.0           v2.4.2                  Loki: like Prometheus, but for logs.
https://artifacthub.io/packages/helm/grafana/loki       2.9.0           v2.4.2                  Loki: like Prometheus, but for logs.
https://artifacthub.io/packages/helm/wenerme/lo...      0.40.0          2.4.2                   Helm chart for Grafana Loki in microservices mode
https://artifacthub.io/packages/helm/grafana/lo...      0.40.0          2.4.2                   Helm chart for Grafana Loki in microservices mode
https://artifacthub.io/packages/helm/grafana/lo...      0.2.0           2.4.2                   Helm chart for Grafana Loki in simple, scalable...
https://artifacthub.io/packages/helm/grafana/pr...      3.10.0          2.4.2                   Promtail is an agent which ships the contents o...

La seconde commande recherche les charts dans les repos que vous avez configuré. La configuration d'Helm se trouve dans le répertoire $HOME/.config/helm.

helm search repo loki
NAME                            CHART VERSION   APP VERSION     DESCRIPTION
grafana/loki                    2.8.1           v2.4.1          Loki: like Prometheus, but for logs.
grafana/loki-canary             0.5.1           2.4.1           Helm chart for Grafana Loki Canary
grafana/loki-distributed        0.39.3          2.4.1           Helm chart for Grafana Loki in microservices mode
grafana/loki-stack              2.5.0           v2.1.0          Loki: like Prometheus, but for logs.
grafana/fluent-bit              2.3.0           v2.1.0          Uses fluent-bit Loki go plugin for gathering lo...
grafana/promtail                3.9.1           2.4.1           Promtail is an agent which ships the contents o...

Installation d'un package Helm directement

Pour installer un nouveau package, utilisez la commande helm install. Par exemple pour installer le chart nginx du repo bitnami:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search nginx
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
bitnami/nginx                           9.7.1           1.21.5          Chart for the nginx server
kubectl create ns nginx
kubectl config set-context --current --namespace=nginx
helm install my-nginx bitnami/nginx
NAME: my-nginx
LAST DEPLOYED: Sat Jan 15 15:01:57 2022
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 9.7.1
APP VERSION: 1.21.5

** Please be patient while the chart is being deployed **

NGINX can be accessed through the following DNS name from within your cluster:

    nginx.nginx.svc.cluster.local (port 80)

To access NGINX from outside the cluster, follow the steps below:

1. Get the NGINX URL by running these commands:

  NOTE: It may take a few minutes for the LoadBalancer IP to be available.
        Watch the status with: 'kubectl get svc --namespace nginx -w nginx-1-21-5'

    export SERVICE_PORT=$(kubectl get --namespace nginx -o jsonpath="{.spec.ports[0].port}" services nginx-1-21-5)
    export SERVICE_IP=$(kubectl get svc --namespace nginx nginx-1-21-5 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://${SERVICE_IP}:${SERVICE_PORT}"
kubectl get svc
kubectl get svc --namespace nginx my-nginx
NAME       TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
my-nginx   LoadBalancer   10.106.2.64   <pending>     80:30123/TCP   12s

Attention l'installation ci-dessus ne fonctionne que si vous l'utiliser chez un clouder car par défaut il utilise un type LoadBalancer. Nous verrons plus loin comment configurer notre Chart pour qu'il utilise d'autre type de services.

Lister les releases installer

Pour lister les releases installés dans le namespace actuel de votre cluster Kubernetes, il faut utiliser la commande list ou ls :

helm ls -A
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
my-nginx        nginx           1               2022-01-15 15:10:31.134375044 +0000 UTC deployed        nginx-9.7.1     1.21.5

La commande ls prends plein de paramètres permettant de les filtrer. Par exemple pour afficher toutes les releases installées sur tous les namespaces du cluster l'option -A sera parfaite.

Afficher le status d'une release

Maintenant que vous savez lister les releases présente au sein de votre cluster, vous pouvez demander à afficher le status de celui-ci :

helm status -n nginx my-nginx
NAME: my-nginx
LAST DEPLOYED: Sat Jan 15 15:10:31 2022
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 9.7.1
APP VERSION: 1.21.5

...

Vous avez remarqué qu'il s'agit de la même sortie de commande que celle lors de l'installation du chart Helm. On pourrait l'utiliser dans un programme en modifiant le type de sortie : helm status my-nginx -o json avec un petit jq derrière pour sortie une information en particulier.

Désinstallation d'une release

C'est assez simple il suffit d'utiliser la commande uninstall :

helm uninstall my-nginx
release "my-nginx" uninstalled

Personnaliser une Release

Par exemple, nous aimerions plutôt que le service de notre release my-nginx soit de Type NodePort. Pour cela il faut récupérer les values du chart et créer un fichier contenant ces valeurs :

helm show values bitnami/nginx > values-my-nginx.yaml

Éditez le et modifiez type: LoadBalancer en type: NodePort.

Nous allons installer à nouveau le chart mais en lui indiquant d'utiliser notre fichier de valeur :

helm install -f values-my-nginx.yaml my-nginx bitnami/nginx
NAME: my-nginx
LAST DEPLOYED: Sat Jan 15 15:40:48 2022
NAMESPACE: nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 9.7.1
APP VERSION: 1.21.5

Vérifions le service :

kubectl get svc my-nginx
NAME       TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
my-nginx   NodePort   10.98.52.185   <none>        80:30205/TCP   36s

Et voilà !

Upgrade d'une release

Nous allons changer la version de l'image nginx. Éditez le fichier et modifier la ligne tag :

image:
  registry: docker.io
  repository: bitnami/nginx
  tag: 1.21.5-debian-10-r3

en :

image:
  registry: docker.io
  repository: bitnami/nginx
  tag: 1.21.5-debian-10-r16

Appliquons nos modifications :

helm upgrade my-nginx bitnami/nginx -f values-my-nginx.yaml
Release "my-nginx" has been upgraded. Happy Helming!
NAME: my-nginx
LAST DEPLOYED: Sat Jan 15 15:47:31 2022
NAMESPACE: nginx
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
CHART NAME: nginx
CHART VERSION: 9.7.1
APP VERSION: 1.21.5

...

Vérifions la version de l'image du pod :

kubectl describe pod my-nginx-d6d8b459f-h4lcc | grep Image:
    Image:          docker.io/bitnami/nginx:1.21.5-debian-10-r16

Parfait !

Afficher l'historique

Pour afficher l'historique de nos modifications sur notre release, il sufffit d'utiliser la commande history :

helm history my-nginx
REVISION        UPDATED                         STATUS          CHART           APP VERSION     DESCRIPTION
1               Sat Jan 15 15:40:48 2022        superseded      nginx-9.7.1     1.21.5          Install complete
2               Sat Jan 15 15:46:40 2022        superseded      nginx-9.7.1     1.21.5          Upgrade complete
3               Sat Jan 15 15:47:31 2022        deployed        nginx-9.7.1     1.21.5          Upgrade complete

Rollback d'une release

Mince notre application ne fonctionne plus il faut vite restaurer la version précédente. Pour cela il suffit d'utiliser la commande rollback en indiquant la version désirée, l'index des versions (première colonne de la commande history) :

helm rollback my-nginx 1
Rollback was a success! Happy Helming!
kubectl describe pod my-nginx-7cffd85f5-njfc2 | grep Image:
    Image:          docker.io/bitnami/nginx:1.21.5-debian-10-r3

helm history
1               Sat Jan 15 15:40:48 2022        superseded      nginx-9.7.1     1.21.5          Install complete
2               Sat Jan 15 15:46:40 2022        superseded      nginx-9.7.1     1.21.5          Upgrade complete
3               Sat Jan 15 15:47:31 2022        superseded      nginx-9.7.1     1.21.5          Upgrade complete
4               Sat Jan 15 15:55:29 2022        deployed        nginx-9.7.1     1.21.5          Rollback to 1

Vous remarquez que cela a créé une nouvelle entrée dans l'historique !

Télécharger un chart

Je n'aime pas installer quelque chose sans en connaître le contenu. Pour récupérer le code d'un chart il faut utiliser la commande pull

helm pull bitnami/nginx --untar
ls
Chart.lock  charts  Chart.yaml  ci  README.md  templates  values.schema.json  values.yaml

Vous voyez nous avons récupéré le chart avec un fichier values.yaml. Pour instancier un chart depuis son code source :

helm install my-nginc --dry-run --debug ./ -f values.yaml

--dry-run accompagné de --debug permet de générer le manifest sans l'appliquer.

Cela va vous permettre de vous inspirer des charts existants pour écrire les votres. Vous pouvez aussi les stocker dans votre repository git.

Conclusion

Helm est vraiment plus qu'un outil de templating, c'est un vrai gestionnaire d'applications dédié aux cluster Kubernetes. Mais comment créer ses propres chart? C'est par là : Ecrire son premier chart Helm