# 🇫🇷 Kit de survie Kubernetes pour les développeurs (avec K3S)

Découvrir Kubernetes avec K3S avec une vision de développeur

Nous allons voir comment créer un cluster K3S (voyez ça comme un "petit" kube - mais j'y reviens plus loin) et comment l'utiliser en tant que développeur (c'est à dire, comment déployer des applications dessus pour expérimenter avec un véritable cluster).

Tout ce qui va suivre est une compilation de ce que j'ai pu comprendre, demander, expérimenter, etc... Ne prenez pas ces textes pour argent comptant: tout ce que j'ai fait fonctionne (en tous les cas sur ma machine 😉) et j'ai réussi à faire ce que je voulais.

J'ajouterais des chapitres au fur et à mesure de mon apprentissage.

Bonne Lecture.

# Kube c'est dur! ... ou pas?

A chaque fois que j'ai essayé de me mettre à Kubernetes, j'ai rapidement abandonné car je n'arrivais pas à mettre en oeuvre mes workflows de développement habituels. J'ai souvent trouvé la documentation indigeste (est-ce que c'est parce que ça ne s'adresse pas à des développeurs? ... Ou que je suis vraiment mauvais?).

Je ne crois pas être le seul dans ce cas là. On entend souvent dire par des bien pensants de l'IT que "Kubernetes c'est de la 💩 en 🥫" et une solution pratique est de se réfugier derrière ce courant de pensées non argumentées mais bien pratique (ce que j'ai fait un moment).

Cependant (à travers mon métier, mes clients, des conférences, ...) j'ai rencontré (et rencontre encore) énormément de gens qui ont l'air d'apprécier énormément cette "chose en boîte", et qui ont même des projets qui fonctionnent bien. Il était donc temps de m'y remettre et de ne pas lâcher l'affaire.

Après une consommation excessive de livres (jamais terminés), de présentations dans des conférences, de tutos qui vous expliquent comment "monter" un cluster Kube mais c'est tout, ou d'autres comment déployer une 1ère fois votre application mais jamais comment le faire une deuxième fois, quelques trainings vidéos (dont certains plutôt pas mal), je suis arrivé aux conclusion suivantes:

  • Le principe de base d'orchestrateur ultime (une application qui fait tout) de containers avec la promesse de gommer le côté "vendor lockin" des Amazon, Google, Azure, ... c'est plutôt pas mal du tout (Horacio Gonzalez @lostinbrittany a fait un très bon talk sur le sujet Multicloud ou comment ne pas mettre tous les oeufs dans le même cloud (opens new window))
  • Kubernetes (managé ou pas) c'est bien d'avoir une équipe qui sait s'en servir
  • Ce n'est pas aux développeurs de gérer le cluster Kube (précision du point précédent)

Par contre en tant que développeur, j'aime bien comprendre le minimume vital pour avoir la garantie que mes applications vont se déployer correctement sur la plateforme cible (Kube donc). Donc sans pour autant devenir un spécialiste, je voudrais pouvoir être capable:

  • D'installer un "petit cluster" sur ma machine (et de savoir reproduire l'installation à volonté)
  • De jouer un peu avec (vous savez, cette impression d'être comme en prod, mais sans le risque de tout pêter)
  • De pouvoir déployer mes applications habituelles sur le cluster
  • De pouvoir jouer un workflow complet de "développement" à partir de mes projets:
    • je déploie une 1ère fois
    • je fais des modifications, et les déploie en production
    • je fais des modifications et je les déploie dans un environnement "bac à sable"
    • etc ...

J'ai eu la chance de tomber sur les bonnes personnes (1) (sachantes) qui ont eu la patience de répondre à mes questions, et à toutes mes questions (c'est à dire, sans me répondre: "mais pourquoi tu veux faire ça? C'est complètement con!"). J'ai pris des notes, j'ai expérimenté (dès fois tard), pour finalement avoir des résultats. Donc, l'objectif de ce long article (en plusieurs parties) est de vous expliquer étape par étape comment arriver au même résultat que moi.

Attention: mes expérimentations ne sont pas forcément faites pour aller en production (je le répète: Ce n'est pas aux développeurs de gérer le cluster Kube) faites donc bien valider par les experts. Ce que je vous offre c'est un terrain de jeux qui j'espère vous aidera à progresser.

Remarques:

(1) Remerciements pour diverses choses de valeurs qui ont contribuées fortement à mes explorations:

# Déployer son propre cluster Kube (avec plusieurs nodes) en local grâce à K3S

Pour ceux qui me connaissent, je suis partisan de tout faire en local quand c'est possible. L'objectif de cette partie et de vous expliquer comment créer un cluster Kube sur votre propre machine et ceci de la manière la plus simple possible. Et il faut que cela soit le plus reproductible possible (pourvoir se planter et recommencer rapidement facilite le cycle d'apprentissage). Je vous livre donc ma méthode (libre à vous de l'adapter, d'en choisr une autre, ...)

Pour mon cas personnel, j'ai choisi d'utiliser le projet K3S (opens new window) de chez Rancher qui est une distribution "allégée" de Kubernetes, mais complètement fonctionnelle et largement suffisante pour mes besoins (décrits en introduction). L'avantage de K3S, c'est qu'il ne demande que très peu de ressource, vous pourre donc l'utiliser même sur des machines peu puissantes (mais si vous avez 8Go de RAM c'est bien)

Je ferais "tourner" mon cluster dans une VM grâce à Multipass (opens new window) de chez Canonical qui est un orchestrateur de VM Ubuntu existant pour OSX, Windows 10 et certaines distributions Linux.

Le script shell que j'utilise n'a été testé que sur Mac, mais les étapes sont faciles à reproduire à la main pour Windows (j'accepte toute contribution d'utilisateur Windows bien sûr pour compléter cet article 😉)

# Pré-requis

Il faut installer Multipass (opens new window). Vous trouverez toutes les informations nécessaires ici:

  • Pour Linux: https://multipass.run/docs/installing-on-linux
  • Pour Mac: https://multipass.run/docs/installing-on-macos (la bersion la plus simple étant d'utiliser brew)
  • Pour Windows: https://multipass.run/docs/installing-on-windows

Vous devez aussi installer la CLI Kubernetes KubeCtl (opens new window) sur votre poste: https://cloud.google.com/kubernetes-engine/docs/quickstart

# Installation du Cluster

Je me suis largement inspiré de l'excellent article Local K3s Cluster Made Easy With Multipass (opens new window) de Luc Juggery (opens new window), donc je vous livre mon script (pour les explications détaillées, l'article de Luc est très bien)

Commencez par céer un répertoire, et dans ce répertoire, ajoutez un fichier de configuration cluster.config (c'est ma façon de faire, mais vous pouvez bien sûr faire autrement):

node1_name="basestar";
node2_name="raider-one";
node3_name="raider-two";

Et au même endroit, créez un fichier create.cluster.sh (et donnez lui les droits d'exécution: chmod +x create.cluster.sh):

#!/bin/sh
eval $(cat cluster.config)

multipass launch -n ${node1_name} --cpus 2 --mem 2G
multipass launch -n ${node2_name} --cpus 2 --mem 2G
multipass launch -n ${node3_name} --cpus 2 --mem 2G

# Initialize K3s on node1
echo "👋 Initialize 📦 K3s on ${node1_name}..."

multipass --verbose exec ${node1_name} -- sh -c "
  curl -sfL https://get.k3s.io | sh -
"

TOKEN=$(multipass exec ${node1_name} sudo cat /var/lib/rancher/k3s/server/node-token)
IP=$(multipass info ${node1_name} | grep IPv4 | awk '{print $2}')

echo "😃 📦 K3s initialized on ${node1_name} ✅"
echo "🤫 Token: ${TOKEN}"
echo "🖥 IP: ${IP}"

# Join node2 and node3 to the Cluster
echo "👋 Join ${node2_name} and ${node3_name} to the Cluster"

# Joining node2
multipass --verbose exec ${node2_name} -- sh -c "
  curl -sfL https://get.k3s.io | K3S_URL='https://$IP:6443' K3S_TOKEN='$TOKEN' sh -
"

echo "😃 ${node2_name} has joined the Cluster  ✅"

# Joining node3
multipass --verbose exec ${node3_name} -- sh -c "
  curl -sfL https://get.k3s.io | K3S_URL='https://$IP:6443' K3S_TOKEN='$TOKEN' sh -
"

echo "😃 ${node3_name} has joined the Cluster  ✅"


multipass exec ${node1_name} sudo cat /etc/rancher/k3s/k3s.yaml > k3s.yaml

sed -i '' "s/127.0.0.1/$IP/" k3s.yaml

Il ne vous reste plus qu'à lancer ./create.cluster.sh

🖐 Attention les 2 lignes ci-dessous du script:

multipass exec ${node1_name} sudo cat /etc/rancher/k3s/k3s.yaml > k3s.yaml

sed -i '' "s/127.0.0.1/$IP/" k3s.yaml

vont permettre de copier la configuration kubernetes de la VM vers votre poste ainsi que de modifier l'adresse IP avec la valeur de l'IP de de la VM. Ainsi lorsque de votre poste (donc à l'extérieur de la VM) vous voudrez passer des commandes avec KubeCtl vous devrez:

  • passez cette commande: export KUBECONFIG=$PWD/k3s.yaml (modifiez le chemin vers le fichier yaml si vous n'êtes pas dans le même répertoire)
  • puis vous pourrez passer votre commande kubectl comme par exemple kubectl top nodes

👋 Vous trouverez tous les scripts nécessaires ici: https://gitlab.com/learn-k3s/create-cluster

# Le cluster "tourne"

Si tout c'est bien passé (normalement, si votre connexion internet est bonne, vous en avez pour 3 à 5 minutes), vous devriez trouver le fichier de configuration de votre cluster à la racine de votre répertoire: k3s.yaml (qui va permettre à kubectl) de se connecter au cluster.

Et si vous n'avez pas oublié d'installer kubectl sur votre machine hôte, si vous tapez les commandes suivantes:

export KUBECONFIG=./k3s.yaml
kubectl top nodes

Vous allez obtenir la liste des nodes(noeuds) de votre cluster:

NAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
basestar     101m         2%     702Mi           8%        
raider-one   15m          0%     267Mi           6%        
raider-two   19m          0%     265Mi           6%      

Remarque: si vous obtenez le message error: metrics not available yet c'est que le cluster n'a pas fini de démarrer. Attendez 2,3 minutes avant de re-essayer.

Vous avez donc fait un grand pas, vous avec un (petit) cluster kube qui tourne sur votre machine

# Arrêter, Démarrer le cluster

Vous trouverez les scripts nécessaires dans ce repository: https://gitlab.com/learn-k3s/create-cluster

# Outillage: K9S

K3S n'embarque pas de dashboard (même s'il est possible de l'installer), mais pour la suite nous n'en n'aurons pas besoin. A la place nous allons utiliser un outil smilaire mais en mode texte, dont vous ne pourrez plus vous passer, je veux parler de K9S: https://github.com/derailed/k9s

K9S va vous permettre de vous "promener" dans votre cluster, de voir l'état de vos déploiements, et beaucoup d'autres choses. La procédure d'installation est simple (vous trouverez tout ce qu'il fauut dans le README du projet).

Tapez les commandes suivantes:

export KUBECONFIG=./k3s.yaml
k9s --all-namespaces 

Vous obtiendrez ceci:

alt k9s

Maintenant vous êtes prêts à déployer 🚀 des 🌍 webapps 😉

Last Articles