Dans cet exercice, vous allez mettre en place un cluster Kubernetes à l’aide de l’utilitaire kubeadm. Afin de simplifier le provisonning des machines virtuelles, nous utiliserons Multipass un outil qui permet de créer des machines virtuelles très simplement.
Création des VMs
Installez tout d’abord Multipass (celui-ci est disponible pour Windows, Linux et MacOS) puis lancez les commandes suivantes pour créer 2 machines virtuelles nommées controlplane et worker
multipass launch -n controlplane -m 2G -c 2 -d 10G
multipass launch -n worker -m 2G -c 2 -d 10G
Note: par défaut Multipass crée des VMs en limitant leurs ressources à 1 cpu, 1G RAM et 5G de disque. Les commandes ci-dessus donnent un peu plus de ressources que les valeurs par défaut.
Installation de Kubectl
Assurez-vous d’avoir installé kubectl sur la machine depuis laquelle vous avez lancé les commandes Multipass. kubectl permet de communiquer avec un cluster Kubernetes depuis la ligne de commande. Note: vous pouvez vous reporter à l’exercice installation de kubectl pour l’installation de kubectl.
Initialisation du cluster
Une fois les VMs créées, vous allez initialiser le cluster.
Lancez tout d’abord un shell sur controlplane:
multipass shell controlplane
Depuis ce shell lancez la commande suivante, celle-ci installe les dépendances nécessaires (container runtime et quelques packages)
curl -sSL https://luc.run/kubeadm/controlplane.sh | VERSION=1.27.5 sh
Toujours depuis le shell sur la VM controlplane lancez ensuite la commande qui initialize le cluster:
sudo kubeadm init
Après quelques dizaines de secondes, vous obtiendrez alors une commande qui vous servira, par la suite, à ajouter un node worker au cluster qui vient d’être créé.
Exemple de commande retournée (les tokens que vous obtiendrez seront différents):
sudo kubeadm join 192.168.64.40:6443 --token xrtqvq.9zmmzjx16b4jc4q8 --discovery-token-ca-cert-hash sha256:fabe1bbc0264b36a624b0c7284fe58151dad0640c81bff9a9f0e33fecd377e1a
Récupérez le fichier kubeconfig pour l’utilisateur courant (ubuntu):
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Ajout d’un node worker
Une fois le cluster initialisé, vous allez ajouter un node worker.
Lancez tout d’abord un shell sur worker:
multipass shell worker
Depuis ce shell lancez la commande suivante, celle-ci installe les dépendances nécessaires sur le worker:
curl -sSL https://luc.run/kubeadm/worker.sh | VERSION=1.27.5 sh
Lancez ensuite la commande retournée lors de l’étape d’initialisation (sudo kubeadm join …) afin d’ajouter le node worker au cluster.
sudo kubeadm join 192.168.64.40:6443 --token xrtqvq.9zmmzjx16b4jc4q8 --discovery-token-ca-cert-hash sha256:fabe1bbc0264b36a624b0c7284fe58151dad0640c81bff9a9f0e33fecd377e1a
Note: si vous avez perdu la commande d’ajout de node, vous pouvez la générer avec la commande suivante (à lancer depuis le node controlplane)
sudo kubeadm token create --print-join-command
Après quelques dizaines de secondes, vous obtiendrez rapidement une confirmation indiquant que la VM worker fait maintenant partie du cluster::
This node has joined the cluster
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
...
Etat du cluster
Listez à présent les nodes du cluster avec la commande suivante depuis un shell sur le node controlplane:
ubuntu@controlplane:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controlplane NotReady control-plane 93s v1.27.5
worker NotReady <none> 11s v1.27.5
Les nodes sont dans l’état NotReady, cela vient du fait qu’aucun plugin network n’a été installé pour le moment.
Plugin network
Afin que le cluster soit opérationnel il est nécessaire d’installer un plugin network. Plusieurs plugins sont disponibles (Cilium, Calico, WeaveNet, Flannel, …), chacun implémente la spécification CNI (Container Network Interface) et permet notamment la communication entre les différents Pods du cluster.
Dans cet exercice, vous allez installer le plugin Cilium. Utilisez pour cela les commandes suivantes:
OS="$(uname | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')"
curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-$OS-$ARCH.tar.gz{,.sha256sum}
sudo tar xzvfC cilium-$OS-$ARCH.tar.gz /usr/local/bin
cilium install
Note: l’article suivant effectue un benchmark des différentes solutions https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-updated-august-2020-6e1b757b9e49
Après quelques secondes, les nodes apparaitront dans l’état Ready
ubuntu@controlplane:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 3m7s v1.27.5
worker Ready <none> 105s v1.27.5
Le cluster est prêt à être utilisé.
Récupération du context
Afin de pouvoir dialoguer avec le cluster via le binaire kubectl que vous avez installé sur votre machine locale, il est nécessaire de récupérer le fichier de configuration généré lors de l’installation.
Pour cela, il faut récupérer le fichier /etc/kubernetes/admin.conf présent sur le node controlplane et le copier sur votre machine locale.
Avec Multipass vous pouvez récupérer le fichier de configuration avec la commande suivante (il sera alors sauvegardé dans le fichier kubeconfig du répertoire courant):
multipass exec controlplane -- sudo cat /etc/kubernetes/admin.conf > kubeconfig
Une fois que le fichier est présent en local, il faut simplement indiquer à kubectl ou il se trouve en positionnant la variable d’environnement KUBECONFIG:
export KUBECONFIG=$PWD/kubeconfig
Listez une nouvelle fois les nodes du cluster.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
controlplane Ready control-plane 3m39s v1.27.5
worker Ready <none> 2m17s v1.27.5
Vous pouvez à présent communiquer avec le cluster depuis votre machine locale et non depuis une connexion ssh sur le node controlplane.
En résumé
Le cluster que vous avez mis en place dans cet exercice contient un node controlplane et 1 node worker. Il est également possible avec kubeadm de mettre en place un cluster HA avec plusieurs nodes controlplane en charge de la gestion du cluster.