Introduction à Helm

Kubernetes devient incontournable en terme d'orchestration de conteneurs. On s'intéresse donc aujourd’hui au déploiement d’applications dans Kubernetes, et plus particulièrement comment simplifier cette tâche grâce à Helm.

Présentation

Dans Kubernetes la configuration de nos services / applications se fait généralement via des fichiers yaml. Quand on a une seule application en ligne, cela reste assez simple mais dès qu’on a plusieurs environnements, applications et services, on se retrouve très vite submergé de fichiers plus ou moins semblables.

C’est là que Helm intervient !

Helm est le package manager soutenu et recommandé par Kubernetes, il est aussi un des seuls sur le marché, son unique concurrent, KPM de CoreOS, n’est plus maintenu depuis juillet 2017.

Helm permet donc de déployer des applications / stacks complètes en utilisant un système de templating et de dépendances afin d’éviter la duplication et avoir ainsi une arborescence cohérente pour nos fichiers de configurations.

Mais Helm ce n’est pas que ca, il propose également la possibilité de gérer vos Charts avec la possibilité de les compresser et de les mettre dans un répertoire distant (Cdn, Git, disque local ou partagé…).
Il intègre aussi un système facilitant les Updates et Rollbacks de vos applications.

Fonctionnement

Quelques concepts sont importants avant d’aborder la suite :

  • Un package Kubernetes est appelé Charts dans Helm.
  • Un Chart contient un lot d’informations nécessaires pour créer une instance d’application Kubernetes.
  • La Config contient les informations dynamiques concernant la configuration d’un Chart
  • Une Release est une instance existante sur le cluster, combinée avec une Config spécifique.

L’architecture de Helm est la suivante :
Screen-Shot-2018-05-21-at-10.36.19

Lors de l’initialisation de Helm, le client installe Tiller sur un pod du cluster.
Tiller est le serveur qui communique avec le client Helm et l’API de Kubernetes pour gérer vos déploiements.

Quelques commandes utiles

Voici quelques commandes de bases pour Helm :

helm install my-chart

Permet d’installer le chart : my-chart avec comme nom de release aléatoire dans votre cluster kubernetes

helm upgrade my-release my-chart

Permet d’upgrade notre release avec une nouvelle version.

helm ls

Permet de lister les Charts installés sur votre Cluster

helm delete my-release

Permet de désinstaller la release my-release de kubernetes

Tutoriel

Prérequis

Avant de commencer avec Helm, il faut avoir accès à un cluster Kubernetes. Plusieurs solutions s’offrent à vous pour créer un cluster, mais nous n’allons pas les couvrir ici. Si vous n’en avez pas je vous conseille donc de démarrer un cluster via GKE qui est le service auto-managé de Google Cloud pour Kubernetes.
Une fois que votre cluster est démarré, vous pouvez installer Helm en suivant cette procédure.

Vous pouvez vérifier si l’installation du client Helm a bien fonctionné avec :
helm version

Une fois Helm présent sur votre machine, il faut désormais installer le Tiller serveur dans Kubernetes. Pour cela nous allons utiliser la commande :
helm init

⚠️ Si votre cluster a les RBAC d’activé il faut créer un rôle pour Tiller ⚠️

kubectl create serviceaccount --namespace kube-syx@stem 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"}}}}'`
helm init --service-account tiller --upgrade

Vérifions si l’installation est correcte avec :
helm init
Vous devriez obtenir ceci (la version peut être différente) :
Screen-Shot-2018-05-21-at-12.06.07

Helm est désormais présent sur votre machine (client) et dans le cluster Kubernetes (tiller) ! :thumb_up:

Serveur Minecraft

Attaquons-nous au vif du sujet : installer un serveur Minecraft avec Helm ! Pour cela, rien de bien compliqué.
En effet il existe un site qui référence tous les Charts entretenus par la communauté.

Vous pouvez aller y faire un tour, et regarder les applications qui y sont présentes.
Celle qui nous intéresse ici est Minecraft.

Pour créer un serveur Minecraft dans votre cluster, utilisez cette commande :

Remplacer my-release par le nom que vous voulez donner à votre release

helm install --name my-release \
    --set minecraftServer.eula=true,persistence.dataDir.enabled=false \
    stable/minecraft

Vous pouvez suivre le déploiement de votre pod :
kubectl get pods -w
Screen-Shot-2018-05-21-at-14.09.24

Une fois le STATUS du pod en Running attendez qu’une adresse IP externe lui soit attribuée :

Remplacer my-release par le nom que vous avez donné à votre release

kubectl get svc --namespace default -w my-release

Screen-Shot-2018-05-21-at-14.08.43

Le champ EXTERNAL-IP vous donnera l’IP publique de votre serveur Minecraft !

Lancez Minecraft, ajoutez un serveur avec l’IP publique récupérée ci-dessus et have fun ! 🎮

Screen-Shot-2018-05-21-at-14.10.02

Screen-Shot-2018-05-21-at-14.27.36

Aller plus loin

Nous allons faire quelques modifications sur notre serveur Minecraft pour comprendre un peu plus comment Helm fonctionne.

Le Chart utilisé ici est celui de Minecraft. Comme vous pouvez le voir dans le repo github, un Chart a la structure suivante :

  • un fichier Chart.yaml qui correspond à la description de notre application / projet
  • un fichier values.yaml qui contient les valeurs par défaut de notre application
  • un dossier templates qui va contenir toute la définition de notre application en .yaml et qui, combiné à nos values.yaml, générera un yaml valide pour Kubernetes

Screen-Shot-2018-05-31-at-14.39.02

Créez un fichier config.yaml sur votre machine contenant ces informations :

# Most of these map to environment variables. See Minecraft for details:
# https://hub.docker.com/r/itzg/minecraft-server/
minecraftServer:
  # This must be overridden, since we can't accept this for the user.
  eula: "TRUE"
  # One of: peaceful, easy, normal, and hard
  difficulty: normal
  # A comma-separated list of player names who should be admins.
  ops: Yourminecraftname
  gameMode: survival
  # Message of the Day
  motd: "Welcome to Poney World"

persistence:
  dataDir:
    # Set this to false if you don't care to persist state between restarts.
    enabled: false
    Size: 1Gi

Vous pouvez remplacer Yourminecraftname par votre nom, cela vous donnera les droits administrateur sur le serveur une fois connecté avec votre compte Minecraft.
Mettez le message que vous voulez pour le message du jour !

Sauvegardez votre fichier puis mettez à jour votre serveur via :

Remplacer my-release par le nom que vous avez donner à votre release

helm upgrade -f config.yaml my-release stable/minecraft

Ou bien créez un nouveau serveur:
helm install -f config.yaml new-release stable/minecraft

Helm va appliquer les dernières modifications dans votre Cluster Kubernetes.

Une fois la mise à jour faite, connectez-vous et amusez-vous, vous êtes Admin de votre serveur Minecraft ! N'hésitez pas à aller voir la liste des commandes disponibles.

Ceci n'était qu’une brève introduction de ce que Helm est capable de faire, la prochaine étape serait de créer vos propres Charts.

Pour aller encore plus loin:

Conclusion

Avec Helm, installer et gérer des applications dans Kubernetes devient aussi simple qu’utiliser un package manager (apt ou yum par exemple).
Have fun 🙂