Déployer des machines avec du code est une chose, créer un cluster Kubernetes en est une autre. Le cluster Proxmox et les VM sont prêtes à recevoir tous les outils nécessaires pour déployer des conteneurs.

Pour rappel, je vous décris mon homelab et les différentes phases de création dans ces pages :

L'architecture est la suivante : trois machines virtuelles, chacune sera "master" dans le cluster k3s et disposeront de tous les rôles. Je déploierai Cilium pour la partie réseau et Longhorn pour le stockage de type bloc. Pour la communication Cilium entre les machines, je forcerai l'utilisation de WireGuard (la configuration sera faite automatiquement, n'oubliez pas le $ sudo apt install wireguard).

Installation sur le premier nœud

Un des avantages de k3s, c'est sa simplicité de mise en place. Cette simplicité implique forcément des contreparties, que ce soit des outils ou des plugins en moins. Dans le cas d'un homelab, k3s est largement suffisant. Je souhaitais utiliser RKE2, mais je n'ai pas assez de ressources pour supporter l'outil et les déploiements.

Ne réinventons pas la roue, voici la ligne de commande que j'ai lancée sur la première machine virtuelle :

$ export INSTALL_K3S_EXEC="server --disable=traefik --flannel-backend=none --disable-network-policy --cluster-init --write-kubeconfig-mode=644"
$ export K3s_VERSION="v1.29.0+k3s1"
#
$ curl -sfL https://get.k3s.io | \
INSTALL_K3S_VERSION=${K3s_VERSION} \
INSTALL_K3S_EXEC=${INSTALL_K3S_EXEC} \
sh -s -

# node token, sera utilisé pour rejoindre le cluster depuis les autres VM
$ sudo cat /var/lib/rancher/k3s/server/node-token

En bref, j'empêche le déploiement de Traefik, de la CNI et je force l'utilisation d'etcd au travers de l'argument --cluster-init. De plus, j'utilise la dernière version de k3s / Kubernetes à date, la 1.29.x lors de la saisie de l'article.

Enfin, la commande cat affichera le token qui sera utilisé dans les deux autres machines virtuelles pour rejoindre le cluster. Après quelques dizaines de secondes, le premier nœud sera dans un statut "Ready", comportant les rôles de control-plane,etcd,master.

jho@MBAJHO ~ % kubectl get nodes
NAME     STATUS   ROLES                       AGE   VERSION
w3p241   Ready    control-plane,etcd,master   27h   v1.29.0+k3s1

Maintenant que le premier master est prêt, nous pouvons continuer sur les deux autres instances.

Installation de k3s sur les autres nœuds

Continuons sur notre lancée pour installer k3s sur les deux autres machines. Les commandes sont identiques entre les machines.

$ export INSTALL_K3S_EXEC="server --disable=traefik --flannel-backend=none --disable-network-policy"
$ export FIRST_SERVER_IP="172.16.241.1"
$ export NODE_TOKEN="K1050f75ba16773d4bb086042fc44d6a290049d6cd54aac5de351d9d0001c608b52::server:f9809b4e0cda428c9495b5f03472f4f9"
$ export K3s_VERSION="v1.29.0+k3s1"

$ curl -sfL https://get.k3s.io | \
INSTALL_K3S_VERSION=${K3s_VERSION} \
K3S_URL=https://${FIRST_SERVER_IP}:6443 \
K3S_TOKEN=${NODE_TOKEN} \
K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC=${INSTALL_K3S_EXEC} \
sh -

Évidemment, changez les valeurs des variables FIRST_SERVER_IP (l'IP correspond à votre première machine), et NODE_TOKEN (copiez le résultat obtenu lors de la commande sudo cat ...).

L'installation sur ces nœuds doit s'effectuer aussi en quelques dizaines de secondes, pour avoir à la fin ce résultat :

jho@MBAJHO ~ % kubectl get nodes
NAME     STATUS   ROLES                       AGE   VERSION
w3p241   Ready    control-plane,etcd,master   27h   v1.29.0+k3s1
w3p242   Ready    control-plane,etcd,master   26h   v1.29.0+k3s1
w3p243   Ready    control-plane,etcd,master   26h   v1.29.0+k3s1

Chaque nœud doit avoir les mêmes rôles, dans un statut Ready. Désormais, déployons les outils Cilium et Longhorn…

Déploiement de Cilium et Longhorn

Pour effectuer les déploiements de ces outils, j'utilise Helm pour faciliter le workflow. Ce qui est pratique, c'est que Cilium et Longhorn fournissent des charts pour déployer les apps en une ligne de commande.

Cilium

Depuis votre machine ou sur un des hôtes k3s, installez Helm, ajoutez et mettez à jour les dépôts puis lancez le déploiement :

$ helm repo add cilium https://helm.cilium.io/
$ helm repo update
$ helm install cilium cilium/cilium --version 1.14.5 --namespace kube-system --set kubeProxyReplacement=true  --set encryption.enabled=true --set encryption.type=wireguard

Les pods mettront quelques secondes avant d'être opérationnels, ce qui débloquera aussi la création des pods spécifiques à Kubernetes (core-dns et metrics-server) :

jho@MBAJHO ~ % kubectl -n kube-system get pod
NAME                                      READY   STATUS    RESTARTS   AGE
cilium-42858                              1/1     Running   0          27h
cilium-ckckc                              1/1     Running   0          27h
cilium-operator-6b8f454664-7xdn9          1/1     Running   0          27h
cilium-operator-6b8f454664-cdgvx          1/1     Running   0          27h
cilium-vrpqw                              1/1     Running   0          27h
coredns-6799fbcd5-gbbdz                   1/1     Running   0          27h
local-path-provisioner-84db5d44d9-8z8zr   1/1     Running   0          27h
metrics-server-67c658944b-j7tsz           1/1     Running   0          27h

Nous pouvons continuer pour passer au déploiement du stockage Longhorn.

Source pour Cilium

Longhorn

Même principe que pour Cilium, ajoutez le dépôt, mettez à jour la liste et lancez le déploiement :

$ helm repo add longhorn https://charts.longhorn.io
$ helm repo update
$ helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.5.3

Et voici la liste de tous les pods :

jho@MBAJHO ~ % kubectl -n longhorn-system get pod
NAME                                                READY   STATUS    RESTARTS      AGE
csi-attacher-6d8779d485-7wxzm                       1/1     Running   0             27h
csi-attacher-6d8779d485-vnwts                       1/1     Running   0             27h
csi-attacher-6d8779d485-xrnz4                       1/1     Running   0             27h
csi-provisioner-69ffbb8c5b-4vjvn                    1/1     Running   0             27h
csi-provisioner-69ffbb8c5b-lgmhv                    1/1     Running   0             27h
csi-provisioner-69ffbb8c5b-s9tlb                    1/1     Running   0             27h
csi-resizer-7b98f6fbc4-796lh                        1/1     Running   0             27h
csi-resizer-7b98f6fbc4-mt7jk                        1/1     Running   0             27h
csi-resizer-7b98f6fbc4-sjrkq                        1/1     Running   0             27h
csi-snapshotter-65d845d4f4-5ttd7                    1/1     Running   0             27h
csi-snapshotter-65d845d4f4-svhh4                    1/1     Running   0             27h
csi-snapshotter-65d845d4f4-wc2lr                    1/1     Running   0             27h
engine-image-ei-68f17757-mllds                      1/1     Running   0             27h
engine-image-ei-68f17757-sgrsv                      1/1     Running   0             27h
engine-image-ei-68f17757-v6pvg                      1/1     Running   0             27h
instance-manager-3db57d1855ea765fa399c8e1e9af93cf   1/1     Running   0             27h
instance-manager-56508c728745cafcd38525bca2dccd23   1/1     Running   0             27h
instance-manager-d6a6475250dac7b48b9e74b4de586fad   1/1     Running   0             27h
longhorn-csi-plugin-8nzrn                           3/3     Running   0             27h
longhorn-csi-plugin-h65sk                           3/3     Running   0             27h
longhorn-csi-plugin-wmljc                           3/3     Running   0             27h
longhorn-driver-deployer-7cc7cc8559-jjqmc           1/1     Running   0             27h
longhorn-manager-6w8jh                              1/1     Running   1 (27h ago)   27h
longhorn-manager-kr2hc                              1/1     Running   1 (27h ago)   27h
longhorn-manager-tsndq                              1/1     Running   1 (27h ago)   27h
longhorn-ui-5d65c99c9b-wrxh7                        1/1     Running   0             27h
longhorn-ui-5d65c99c9b-zq8ft                        1/1     Running   0             27h

Source pour Longhorn.

Aller, on passe au déploiement des applications… !

Source d'inspiration.

Partager l'article