Aller au contenu principal

Un cluster K8S en quelques minutes avec kind

· 5 minutes de lecture
Stéphane ROBERT

logo kubernetes

Kind est un projet open source qui permet d'installer des clusters multi-nodes rapidement en utilisant Docker. C'est donc un parfait candidat pour se préparer aux certifications CKA. En effet, kind intègre tous les composants contrairement à d'autres solutions comme minikube ou k3s.

Installation de Kind

En prérequis, il faut juste docker

Pour installer kind rien de plus simple avec asdf :

asdf plugin add kind
asdf install kind latest
asdf global kind latest

kind version
kind v0.18.0 go1.20.2 linux/amd64

Création d'un cluster single-node avec kind

Pour créer un cluster single-node avec kind, il faut utiliser la commande create :

kind create cluster --name cluster-1

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

kubectl cluster-info --context kind-cluster-1

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

L'option --name permet de donner un nom à votre cluster. Car on peut en installer plusieurs. Merci Docker. Le fichier de config est créé directement dans le fichier ~/.kube/config. Donc attention si vous déjà un fichier avec le même nom !

Création d'un cluster multi-nodes avec kind

Pour installer un cluster multi-nodes, il faut créer un fichier de configuration

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

Il est possible de créer un cluster avec 3 master-nodes en les définissant en control-plane.

Créons le cluster :

kind create cluster --name cluster-2 --config=cluster.yaml

✓ Ensuring node image (kindest/node:v1.21.1) 🖼
✓ Preparing nodes 📦 📦 📦 📦
✓ Writing configuration 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
✓ Joining worker nodes 🚜
Set kubectl context to "kind-cluster-2"
You can now use your cluster with:

kubectl cluster-info --context kind-cluster-2

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

Vous remarquerez que l'on voit bien l'ajout des nodes.

kubectl get nodes

NAME STATUS ROLES AGE VERSION
cluster-2-control-plane Ready control-plane,master 5m32s v1.21.1
cluster-2-worker Ready <none> 4m57s v1.21.1
cluster-2-worker2 Ready <none> 4m57s v1.21.1
cluster-2-worker3 Ready <none> 4m57s v1.21.1

Si vous déployez plusieurs clusters kind ajoute les suivants dans le même fichier de configuration ~/.kube/config.

Pour changer de context :

kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kind-cluster-1 kind-cluster-1 kind-cluster-1
* kind-cluster-2 kind-cluster-2 kind-cluster-2

kubectl config use-context kind-cluster-1
kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-1-control-plane Ready control-plane,master 14m v1.21.1

Utiliser la dernière version de kubernetes avec kind

Vous avez remarqué qu'avec la dernière version de kind on utilise kubernetes 1.21.1. Il est possible d'utiliser d'autres versions. Il faut installer golang puis cloner le repo de kubernetes en pointant sur la release désiré. Par exemple pour la version 1.23.1 (Il faut 10 Gb d'espace disque disponible) :

sudo dnf install golang
Package golang-1.16.12-1.module+el8.5.0+720+c057d5cf.x86_64 is installed.

mkdir -p ~/src/k8s.io
cd ~/src/k8s.io
export export GOPATH=~
git clone --recurse-submodules --branch=v1.23.1 --depth=1 https://github.com/kubernetes/kubernetes

Maintenant on peut builder l'image :

kind build node-image
Starting to build Kubernetes
--- [1231 07:49:20] Verifying Prerequisites....
--- [1231 07:49:21] Building Docker image kube-build:build-bcb251db86-5-v1.23.0-go1.17.5-bullseye.0

--- [1231 07:55:44] Docker builds done
Finished building Kubernetes
Building node image ...
Building in kind-build-1640937346-402805967
sha256:58e0f6e9166b52cd2a2bec8a1a60ff283574f66c9ddda0ab743811c676fedeb8
Image build completed.

Après 5/6 minuates le build se termine. On vérifie que nous avons bien l'image :

docker images
kindest/node latest 58e0f6e9166b 10 minutes ago 1.14GB

Lançons un nouveau cluster single-node avec cette image :

kind create cluster --name cluster-3 --image kindest/node:latest
...

kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
kind-cluster-1 kind-cluster-1 kind-cluster-1
kind-cluster-2 kind-cluster-2 kind-cluster-2
* kind-cluster-3 kind-cluster-3 kind-cluster-3
❯ kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-3-control-plane Ready control-plane,master 30s v1.23.1

Cool on a bien une version 1.23.1.

Destruction d'un cluster

On a déjà instancié 3 clusters kubernetes. Il serait temps d'en détruire un non ?

kind get clusters

cluster-1
cluster-2
cluster-3

kind delete cluster --name cluster-1
Deleting cluster "cluster-1" ...

kind get clusters

cluster-2
cluster-3

Vraiment rapide.

Remplacer le CNI par cilium

Vous voulez tester cilium sur kind. Dans le fichier de config du cluster il faut désactiver le CNI par défaut :

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
# the default CNI will not be installed
disableDefaultCNI: true
nodes:
- role: control-plane
- role: worker

Lançons la construction :

kind create cluster --config=cluster.yaml --name cluster-4 --image kindest/node:latest

Maintenant installons cilium. Attention à bien indiquer le nom du cluster cluster.name=cluster-4 :

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

helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium --version 1.10.6 \
--namespace kube-system \
--set nodeinit.enabled=true \
--set kubeProxyReplacement=partial \
--set hostServices.enabled=false \
--set externalIPs.enabled=true \
--set nodePort.enabled=true \
--set hostPort.enabled=true \
--set cluster.name=cluster-4 \
--set cluster.id=4

Patientez quelques minutes et les nodes devrait passer au status ready :

kubectl get nodes
NAME STATUS ROLES AGE VERSION
cluster-4-control-plane Ready control-plane,master 12m v1.23.1
cluster-4-worker Ready <none> 12m v1.23.1

Lançons un petit test avec un pod nginx :

kubectl create deployment nginx --image=nginx

kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 30s

NAME READY STATUS RESTARTS AGE
nginx-85b98978db-nq4w8 1/1 Running 0 5m44s

Utiliser une registry docker privé

Je l'ai documenté dans ce billet.

Conclusion

Kind est le parfait candidat pour débuter avec kubernetes car très proche des clusters créés avec kubeadm ou kubespray sans à devoir créer des VM. On va pouvoir poursuivre notre exploration de Kubernetes.

Plus d'infos sur kind