Introduction

Utiliser Kubernetes en local avec Kind sur Windows, une alternative à Minikube expliqué dans cet article. Découvrez comment démarrer avec Kind dans cet article pour monter un cluster Kubernetes en local dans votre WSL2.

L’article abordera les thématiques suivantes :

Si vous êtes nouveau avec Kubernetes et que vous ne savez pas par où commencer, vous pouvez consulter l’article suivant qui présente Kubernetes ainsi que les concepts essentiels pour démarrer.

Windows & le WSL2

Depuis avril 2020, le WSL2 est disponible et offre comme avantage notable à son petit frère (version 1 du WSL) la conteneurisation avec Docker.

Ne cherchez pas les commandes systemctl, elles ne sont pas disponibles à l’heure actuelle. Il faut se contenter du bon vieux service.

Avec le WSL2, vous pouvez installer Docker comme sur n’importe quelle machine Linux.

Si vous démarrez sur le WSL2, vous pouvez commencer par cet article qui vous guide pour bien démarrer sur le WSL2 sous Windows 10.

Le site officiel de kind propose d’installer Docker for Windows. Etant donné que nous utilisons le WSL2, je vous déconseille de suivre cette procédure.

Kind

Version 0.11.1

Documentation officielle : https://kind.sigs.k8s.io/

Les Concepts

Kind offre la possibilité d’exécuter un cluser Kubernetes dans un environnement minimaliste : Docker.

Le mode de fonctionnement peut dérouter au premier abord : inception des couches virtuelles. Ce procédé est de plus en plus exploité par les grandes firmes pour offrir une souplesse de provisioning et une réactivité inégalable. C’est ainsi VMware et Microsoft prennent le pas sur cette inception de conteneurs.

Docker utilise le système d’isolation, pas de virtualisation (type 1 ou 2). Par abus de langage, on parle de virtualisation applicative.

Le serveur Hôte exécute docker, c’est le point de démarrage de l’inception.

La création du cluster initie un conteneur qui exécute Docker. En réalité, ce conteneur a simplement accès au socle Docker de l’hôte en utilisant la socket. Ça veut tout de même dire qu’il le droit de vie et de mort sur l’ensemble des conteneurs Docker.

Tous les conteneurs de Kind se comportent de la même manière.

Quelques explications

La gestion des réseaux

On peut configurer la partie réseau au sein de Kind, et forcer l’utilisation de certaines configuration.

On peut notamment jouer sur :

  • Le type d’adressage IP autorisé dans le cluster
  • L’adresse du serveur API (point de contact du control-plane)
  • Les sous-réseaux attribués aux Pods
  • Les sous-réseaux attribués aux Services
  • L’utilisation du CNI natif à Kind
  • Le système de communication pour le proxy (kube-proxy)

Si vous rencontrez un conflit entre IPv4 et IPv6 en exécutant Kind, forcez l’utilisation de l’IPv4 dans la configuration :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
[...]
networking:
  ipFamily: ipv4

Les éléments du cluster

Le moteur de Kind propose une fonctionnalité intéressante pour la simulation d’environnement à grande échelle, la création d’un cluster de plusieurs machines.

On peut ajouter autant de machines qu’on le souhaite parmi les catégories suivantes :

  • control-plane : “serveur” de contrôle qui réceptionne les requêtes et concilie les ordres envoyés aux workers,
  • worker : “serveur” où sont exécutés les conteneurs.

Bien entendu, ce ne sont pas des serveurs mais bien des conteneurs qui sont exécutés.

Exemple de configuration (1 control-plane et 3 workers) :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
[...]
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Procédure d’installation

Se prémunir des erreurs

Bien que le WSL2 soit maintenant disponible comme mise à jour régulière sous Windows 10, des bugs sont toujours ouverts à l’heure actuelle concernant l’interaction entre Docker et WSL2 :

Ces bugs introduisent quelques comportement non attendus.
Pour se prémunir de ces futures potentielles erreurs, réalisez les actions qui suivent.

Activer et monter le sysfs
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd

Installer Docker

Installons Docker en suivant la documentation officielle : https://docs.docker.com/engine/install/ubuntu/

# Prérequis
sudo apt-get update
sudo apt-get remove -t docker docker-engine docker.io containerd runc
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# Installation
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Lançons docker à l’aide de son service :

sudo service docker start

Ajoutons les droits d’exécuter les commandes Docker à notre utilisateur :

sudo groupadd docker
sudo usermod -aG docker $USER

Vous devez vous déconnecter/reconnecter pour prendre en compte la modification des groupes et droits utilisateur.

Installer Kind

L’installation de Kind peut se faire en suivant la documentation officielle.
Nous allons install Kind depuis la page de releases sur GitHub :

wget -O kind https://github.com/kubernetes-sigs/kind/releases/download/v0.11.1/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/

Créons la configuration nécessaire à lancer le cluster, créons le fichier cluster-config.yaml :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: ipv4
nodes:
  - role: control-plane
    image: kindest/node:v1.20.0
    extraPortMappings:
      - containerPort: 30000
        hostPort: 30000
        protocol: TCP

A présent, nous pouvons démarrer le cluster local Kubernetes grâce à Kind (nom du cluster kind, configuration cluster-config.yaml et activation du debug -v 1)

Le fichier de configuration cluster-config.yaml doit être accessible en chemin relatif. Il est impossible d’utiliser le chemin absolu dans la commande de création.

kind create cluster --config=cluster-config.yaml --name=local -v 1
Creating cluster "local" ...
 ✓ Ensuring node image (kindest/node:v1.20.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-local"
You can now use your cluster with:

kubectl cluster-info --context kind-local

Have a question, bug, or feature request? Let us know! https://kind.sigs.k8s.io/#community 🙂

La création du cluster kind renseigne automatiquement le fichier de contextes Kubernetes : ~/.kube/config. Ce qui facilite la configuration du client pour accéder au cluster.

Kubectl

Kind se comporte comme un cluster autonome et il devient accessible avec le client kubectl classique.
Vous pouvez télécharger la version du binaire sur la page officielle.

kubectl cluster-info --context kind-local
Kubernetes master is running at https://127.0.0.1:39731
 KubeDNS is running at https://127.0.0.1:39731/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
 To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Supprimer le cluster

Si vous souhaitez supprimer le cluster, pas de prise de tête, choisissez votre cible et shootez-le !
Nom du cluster kind : cluster

kind delete clusters local
Deleted clusters: ["local"]

Conclusion

La création d’un cluster Kind est chose facile, sauf parfois sous le WL2 (merci Microsoft !). Avec ces premiers pas, vous pouvez utiliser le cluster et manipuler les objets Kubernetes à souhait.

Kind est une alternative sérieuse à Minikube pour l’utilisation de Kubernetes en local. Il est plus stable que Minikube et offre la possibilité de simuler un cluster multi-noeuds avec Docker.

Bibliographie