K3d est un outils qui permet de déployer un cluster k3s de façon à ce que chacun des nodes du cluster tourne dans un container Docker. Pour utiliser K3d, il faudra simplement récupérer le binaire associé et le lancer dans un environnement sur lequel Docker est installé.

1. Installation de K3d

Pour installer K3d, il suffit de lancer la commande suivante:

$ curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash

Vérifiez ensuite la version de k3d ainsi que la version du cluster k3s qui sera installé:

$ k3d version
k3d version v4.2.0
k3s version v1.20.2-k3s1 (default)

2. Création d’un cluster

La commande suivante créé un cluster, nommé k3s, contenant 2 nodes worker (agent k3s) en plus du node master (server k3s)

$ k3d cluster create k3s --agents 2
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-k3s'
INFO[0000] Created volume 'k3d-k3s-images'
INFO[0001] Creating node 'k3d-k3s-server-0'
INFO[0003] Pulling image 'docker.io/rancher/k3s:v1.20.2-k3s1'
INFO[0010] Creating node 'k3d-k3s-agent-0'
INFO[0010] Creating node 'k3d-k3s-agent-1'
INFO[0010] Creating LoadBalancer 'k3d-k3s-serverlb'
INFO[0012] Pulling image 'docker.io/rancher/k3d-proxy:v4.2.0'
INFO[0015] Starting cluster 'k3s'
INFO[0015] Starting servers...
INFO[0015] Starting Node 'k3d-k3s-server-0'
INFO[0022] Starting agents...
INFO[0022] Starting Node 'k3d-k3s-agent-0'
INFO[0035] Starting Node 'k3d-k3s-agent-1'
INFO[0043] Starting helpers...
INFO[0043] Starting Node 'k3d-k3s-serverlb'
INFO[0045] (Optional) Trying to get IP of the docker host and inject it into the cluster as 'host.k3d.internal' for easy access
INFO[0051] Successfully added host record to /etc/hosts in 4/4 nodes and to the CoreDNS ConfigMap
INFO[0051] Cluster 'k3s' created successfully!
INFO[0051] --kubeconfig-update-default=false --> sets --kubeconfig-switch-context=false
INFO[0051] You can now use it like this:
kubectl config use-context k3d-k3s
kubectl cluster-info

De nombreuses options sont disponibles lors de la création d’un cluster. Celles-ci peuvent être visualisée avec la commande suivante:

$ k3d cluster create --help

Une fois le cluster créé, nous pouvons lister les différents containers qui ont été lancés:

$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED         STATUS         PORTS                             NAMES
74dbefe8f431   rancher/k3d-proxy:v4.2.0   "/bin/sh -c nginx-pr…"   3 minutes ago   Up 2 minutes   80/tcp, 0.0.0.0:56150->6443/tcp   k3d-k3s-serverlb
1042c00f61aa   rancher/k3s:v1.20.2-k3s1   "/bin/k3s agent"         3 minutes ago   Up 2 minutes                                     k3d-k3s-agent-1
dac6ab81c7f7   rancher/k3s:v1.20.2-k3s1   "/bin/k3s agent"         3 minutes ago   Up 2 minutes                                     k3d-k3s-agent-0
9fa407bacddd   rancher/k3s:v1.20.2-k3s1   "/bin/k3s server --t…"   3 minutes ago   Up 2 minutes                                     k3d-k3s-server-0

Note: un container basé sur l’image k3d-proxy a été créé en plus des containers nécessaires pour k3s. Celui-ci est utilisé en tant que loadbalancer pour accéder au cluster.

La commande suivante permet de lister les clusters créés avec k3d (un seul dans cet exemple):

$ k3d cluster list
NAME   SERVERS   AGENTS   LOADBALANCER
k3s    1/1       2/2      true

3. kubeconfig

Comme spécifié dans le résultat ci-dessus, la commande suivante permet de configurer kubectl pour qu’il communique avec le cluster:

$ kubectl config use-context k3d-k3s
Switched to context "k3d-k3s"

Nous pouvons alors lister les nodes du cluster:

$ kubectl get nodes
NAME               STATUS   ROLES                  AGE   VERSION
k3d-k3s-agent-0    Ready    <none>                 13m   v1.20.2+k3s1
k3d-k3s-agent-1    Ready    <none>                 13m   v1.20.2+k3s1
k3d-k3s-server-0   Ready    control-plane,master   13m   v1.20.2+k3s1

Le cluster est près à être utilisé.

4. Delete cluster

La commande suivante permet de supprimer le cluster que nous avons mis en place:

$ k3d cluster delete k3s
INFO[0000] Deleting cluster 'k3s'
INFO[0000] Deleted k3d-k3s-serverlb
INFO[0000] Deleted k3d-k3s-agent-1
INFO[0001] Deleted k3d-k3s-agent-0
INFO[0003] Deleted k3d-k3s-server-0
INFO[0003] Deleting cluster network 'k3d-k3s'
INFO[0003] Deleting image volume 'k3d-k3s-images'
INFO[0003] Removing cluster details from default kubeconfig...
INFO[0003] Removing standalone kubeconfig file (if there is one)...
INFO[0003] Successfully deleted cluster k3s!