Installation d'un cluster Kubernetes avec kubeadm et flannel

Posted on dim. 09 août 2020 in tuto

Pour différentes raisons, je me suis mis récemment à jouer un peu plus qu'avant avec les conteneurs.

À titre perso, je ne me vois pas quitter la virtualisation classique sur mon infra, j'aime bien l'aspect sécurité apporté par le cloisonnement des différentes machines. Pour autant, j'ai déjà utilisé Docker et Docker-Compose pour me créer rapidement des environnements de développement avec base de données, annuaire LDAP, etc... sans polluer ma machine. À titre pro, les conteneurs me permettent de déployer rapidement des outils dans des versions précises pour analyser et tester des vulnérabilités, ce qui est un vrai confort.

Mais les conteneurs, c'est so 2018. Du coup, je me suis mis à creuser sur les outils d'orchestration et sur l'infrastructure as code, et plus particulièrement sur Kubernetes. Pourquoi Kubernetes ? Parce qu'il passait par là. J'avais déjà entendu parler de la solution, qui me semble plutôt mature et répandue. Je n'ai pas fait de comparatif des solutions, je ne suis pas DevOps avec un avis précis sur la question, c'était juste pour jouer et ajouter une corde à mon arc.

Et je vais vous dire...

Je trouve ça trop cool.

Le fait de balancer un bon gros YAML pour déployer toute une infra en une commande avec redondance, load balancing et tout le tintouin m'éclate vraiment.

Je suis très loin d'être un pro sur k8s (le petit surnom de Kubernetes, c'est plus rapide à taper), et je commence juste à gratter le début des possibilités, mais je vous poste un récapitulatif de la création d'un cluster de tests sur mon lab.

Préparation des machines

Je suis parti sur 4 VM : une sera le master, et les trois autres seront les nodes qui exécuteront les pods. Au niveau hardware, tous ont 2 coeurs, 16Go de stockage, et le master a 4Go de RAM contre 2Go pour chacun des nodes. Tout ce joli petit monde est raccordé au même réseau avec une IP fixe.

J'installe une debian minimale sur chaque machine, en ne mettant que les utilitaires usuels du système, un serveur OpenSSH et vim.

Installation de docker

Sur chacune des machines, il faut commencer par installer docker et containerd qui seront le backend pour les conteneurs. Ça donne :

# apt update && apt upgrade
# apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
# curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
# apt update
# apt -y install docker-ce docker-ce-cli containerd.io
# docker version

La dernière commande permet de confirmer que l'installation tourne :

Version de Docker installée

Installation de kubelet et kubeadm

Une fois docker installé, il faut installer kubeadm et kubelet sur chacune des machines : le premier est un outil conçu pour créer rapidement un cluster, et kubelet est le daemon qui permet aux membres du cluster de communiquer entre eux.

Pour ça, il faut lancer :

# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >/etc/apt/sources.list.d/kubernetes.list
# apt-get update
# apt-get install -y kubelet kubeadm

Quand on a tout ce joli petit monde installé, on peut lancer la création du cluster.

Déploiement du cluster

Initialisation

Il faut tout d'abord définir le réseau utilisé par les pods. Il s'agit d'un réseau "interne" à kubernetes, qui sera géré par le composant de networking (CNI). Il est recommandé de prévoir un /16, et de s'assurer qu'il n'y aura pas de collision avec le reste de votre réseau. Dans mon cas, j'ai choisi 172.17.0.0/16.

Une fois ce réseau choisi, il faut lancer l'initialisation du cluster depuis le master, en lançant la commande suivante :

# kubeadm init --pod-network-cidr 172.17.0.0/16

Kubeadm va configurer le cluster et déployer les pods nécessaires à son bon fonctionnement. À la fin de son travail, il va afficher une commande contenant token et hashes à utiliser pour que les nodes puissent rejoindre votre beau cluster tout neuf. Il suffit de lancer cette commande sur chacun des nodes pour les faire rejoindre le cluster.

Lier les nodes au cluster

La commande ressemble à :

# kubeadm join <ip de votre master>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<cert-hash>

Tester et administrer le cluster

Une fois ces commandes exécutées, votre cluster est (presque) prêt. Sur votre machine, vous devez installer kubectl (depuis vos dépôts ou en téléchargeant directement le binaire).

Après avoir installé kubectl, il vous faut récupérer la configuration. Elle se trouve sur votre master, dans le fichier /etc/kubernetes/admin.conf.

Attention : ce fichier représente la clef d'accès à l'ensemble de votre cluster, et doit donc être sécurisé comme tel.

Sur votre machine, placez le fichier dans ~/.kube/config. Ensuite, vous pouvez tester si votre cluster fonctionne bien avec la commande :

$ kubectl get nodes

La commande doit vous retourner vos 4 nodes, dont le master :

Nodes du cluster

Installation de flannel

Flannel est un CNI : il est en charge de gérer l'attribution des adresses IP à vos pods, sans que vous n'ayez rien à gérer. Pour l'installer, rien de plus simple : il suffit de déployer la configuration sur votre cluster via kubectl :

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Une fois le déploiement effectué, vous pouvez afficher l'ensemble des pods pour voir que flannel est bien présent dans chacun des nodes de votre cluster :

$ kubectl get pods -A -o wide

Pods tournant dans le cluster, dont flannel

Et voilà, votre cluster est installé, et vous n'avez plus qu'à créer vos fichiers YAML pour lancer pods, déploiements et autres services !