Kubernetes - Un cluster en quelques minutes avec kind
Publié le : 31 décembre 2021 | Mis à jour le : 27 juin 2023Kind 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