Helm c'est quoi ? un remake de la célèbre bataille du Seigneur des Anneaux "les deux tours" ??

125248118_small

Non ! En revanche Helm c'est assez simple si on comprends un tant soit peu l'anglais, peu de documentation en ligne traduite en français et il faut avouer que le package manager a pris toute son essence au sein de l'écosystème Kubernetes, assez complexe personne ne dira le contraire.

L’idée derrière Helm et les Charts ? Avoir un magasin en ligne d’applications multi-tiers déployables en une seule ligne de commande.

The package manager for Kubernetes

Il faut voir celà comme un magasin un peu sur la philosophie de Dockerhub (applications officielles ou fournies par la communauté), permettant de déployer sur notre cluster des applications potentiellement complexes et/ou multi-tiers de manière automatique (un peu comme un docker-compose mais pour Kubernetes).

Avant d’aller plus loin, un peu de terminologie :

  • Charts : Collection de fichiers YAML variabilisés décrivant des ressources qui, misent bout à bout, donnent une application déployable sur Kubernetes
  • Helm : Client permettant de récupérer des Charts et de les appliquer sur un cluster Kubernetes
  • Tiller : Partie serveur permettant à un client Helm donner des ordres au cluster Kubernetes visé

Installation - rappel

$ curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
$ chmod 700 get_helm.sh
$ ./get_helm.sh

Après ça on lance :

helm init

On peut vérifier la version installée sur notre serveur avec :

helm version

Pour mettre à jour la liste des repositories :

gabriel@vps560749:~$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈ 

Puis on va taper la commande suivante pour vérifier que le tiller est bien running :

kubectl get pods --namespace kube-system

Cela devrait donner ceci :

tiller-deploy-759cb9df9-l9qxg          1/1       Running   0          18h

ou bien

kubectl get pods --all-namespaces | grep tiller

Si vous obtenez une erreur lors de l'installation ou la recherche d'un chart dans les repositories de Helm du type :

Error: no available release name found

Il faudra alors appliquer ces commandes à votre cluster :

kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

Installer des charts

Un chart est un est un paquetage de Helm. Il contient toutes les définitions de ressources nécessaires pour exécuter une application, un outil ou un service dans un cluster Kubernetes. Voyez-le comme l'équivalent Kubernetes d'une formule Homebrew, d'un fichier Apt dpkg ou d'un fichier Yum RPM.

Un repository est l'endroit où les graphiques peuvent être collectés et partagés.

Une release est une instance d'un graphique s'exécutant dans un cluster Kubernetes. Un chart peut souvent être installé plusieurs fois dans le même cluster. Et chaque fois qu'il est installé, une nouvelle version est créée. Considérons un chart MySQL. Si vous souhaitez que deux bases de données s'exécutent dans votre cluster, vous pouvez installer ce chart deux fois. Chacun aura sa propre version, qui à son tour aura son propre nom de release.

Avec ces concepts en tête, nous pouvons maintenant expliquer Helm comme ceci:

Helm installe des charts dans Kubernetes, créant une nouvelle release pour chaque installation. Et pour trouver de nouveaux charts, vous pouvez rechercher des repositories de charts Helm.

Rechercher une application dans le store de Helm :

Lorsque vous installez Helm pour la première fois, il est préconfiguré pour communiquer avec le repository de charts officiel de Kubernetes. Ce référentiel contient un certain nombre de graphiques soigneusement organisés et gérés. Ce repository de charts est nommé stable par défaut.

Vous pouvez voir quels charts sont disponibles en exécutant la recherche de Helm :

$ helm search
NAME                 	VERSION 	DESCRIPTION
stable/drupal   	0.3.2   	One of the most versatile open source content m...
stable/jenkins  	0.1.0   	A Jenkins Helm chart for Kubernetes.
stable/mariadb  	0.5.1   	Chart for MariaDB
stable/mysql    	0.1.0   	Chart for MySQL
...

Ou plus précisèment :

$ helm search mysql
NAME               	VERSION	DESCRIPTION
stable/mysql  	0.1.0  	Chart for MySQL
stable/mariadb	0.5.1  	Chart for MariaDB

Encore la loupe :

$ helm inspect stable/mariadb
Fetched stable/mariadb to mariadb-0.5.1.tgz
description: Chart for MariaDB
engine: gotpl
home: https://mariadb.org
keywords:
- mariadb
- mysql
- database
- sql
...

Voici un example d'installation de mysql en passant par Helm :

helm install stable/mysql
  NAME:   silly-moose
  LAST DEPLOYED: Tue Dec  5 10:12:58 2017
  NAMESPACE: default
  STATUS: DEPLOYED

  RESOURCES:
  ==> v1/Secret
  NAME               TYPE    DATA  AGE
  silly-moose-mysql  Opaque  2     1m

  ==> v1/PersistentVolumeClaim
  NAME               STATUS   VOLUME  CAPACITY  ACCESS MODES  STORAGECLASS  AGE
  silly-moose-mysql  Pending  1m

  ==> v1/Service
  NAME               TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)   AGE
  silly-moose-mysql  ClusterIP  10.233.54.164         3306/TCP  1m

  ==> v1beta1/Deployment
  NAME               DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
  silly-moose-mysql  1        1        1           0          1m

  ==> v1/Pod(related)
  NAME                                READY  STATUS   RESTARTS  AGE
  silly-moose-mysql-3998799777-hk5fj  0/1    Pending  0         1m

Sans surprise on retrouve un Secret (le mot de passe de votre utilisateur), un PersistentVolumeClaim (pour stocker vos données), un Service de type ClusterIP pour accéder et un Deployment pour MySQL lui même.

A noter : par défaut, Kubernetes donne un petit nom aléatoire à nos composants pour les rendre uniques, car nous n’avons pas donné de nom en arguments.

On remarquera la délicate attention des gens qui ont écrit le Chart et qui affiche, une fois le déploiement terminé, les étapes suivantes pour vérifier que tout fonctionne et se connecter une première fois.

NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
silly-moose-mysql.default.svc.cluster.local

To get your root password run:
    kubectl get secret --namespace default silly-moose-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo

To connect to your database:

1. Run an Ubuntu pod that you can use as a client:
    kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il

2. Install the mysql client:
    $ apt-get update && apt-get install mysql-client -y

3. Connect using the mysql cli, then provide your password:
    $ mysql -h silly-moose-mysql -p

Et on nettoie tout : supprimer un Chart

Dans le cas où vous voudriez tout nettoyer d’un coup, vous pouvez utiliser Helm pour supprimer en même temps tous les composants que vous auriez déployés via un « helm install mon-chart ».

Ici, je peux supprimer l’ensemble des composants qui ont été créés dans cet exemple « silly-moose-mysql ».

helm delete silly-moose-mysql
release "silly-moose-mysql" deleted