Contactez-nous
-
kubernetes

MicroK8s : le kube facile

image de couverture - MicroK8s

Sommaire

Introduction

Avec la montée en popularité de Kubernetes, de nombreuses solutions se sont développées pour rendre sa mise en place de plus en plus accessible : K0s (Mirantis), K3s (Rancher Labs), Typhoon (Digital Ocean), Minikube (Kubernetes project), kind…  Aujourd’hui, c’est la solution de Canonical, MicroK8s, que j’aimerais mettre en avant. Présentée comme étant “production ready”, elle s’invite avec un éco-système modulaire qui permet de configurer votre orchestrateur préféré aux petits oignons.

 

Installation

Canonical étant aux commandes, l’installation se fera au travers du gestionnaire de paquets Snapcraft, présent par défaut depuis un moment dans les dernières versions d’Ubuntu.

sudo snap install microk8s --classic --channel=1.28

Même si les snap se veulent universels et installables sur n’importe quel Linux, ils ne sont pas présents dans toutes les distributions et leur mise en place pourrait nécessiter quelques étapes supplémentaires sur des distributions autres qu’Ubuntu. Il est également à noter que d’autres méthodes d’installations sont disponibles pour Mac OS, Windows, Raspberry Pi, WSL2, etc… plus d’infos ici : https://microk8s.io/docs/install-alternatives.

Félicitations : plus que quelques secondes d’attente et vous avez à présent un nœud Kubernetes qui tourne en version 1.28. Si vous êtes impatients, vous pouvez voir l’avancée via la commande suivante :

sudo microk8s status --wait-ready

Pas envie d’utiliser sudo ? Pas de problèmes : MicroK8s a son propre groupe utilisateur. Tout est expliqué dans la doc : https://microk8s.io/docs/getting-started.

 

Architecture

Concrètement, qu’avons-nous ? Fondamentalement, le strict minimum : Un nœud qui fait office de master et de worker. Il gère son propre control-plane et permet de recevoir des charges de travail dessus. Nous verrons plus loin (dans la partie HA) comment transformer cela en un vrai cluster avec des nœuds dédiés pour les workers et d’autres pour les masters. 

MicroK8s se démarque de k3s et de Rancher, grâce à son système d’addOns (que nous verrons juste après). Ces derniers lui permettent de prendre en charge nativement un grand nombre d’éléments qui lui donnent une certaine flexibilité et simplicité d’utilisation.

 

AddOns

Ok c’est cool, on a un cluster Kubernetes qui tourne, mais y’a pas grand-chose dessus… Cependant, vous avez pu constater que la commande précédente vous a retourné un peu plus que l’état actuel du kube :

Capture d’écran 2023-10-19 à 10.41.30

Une petite liste d’addons nous est présentée.

Ils représentent des éléments qui peuvent être déployés dans votre cluster pour vous simplifier la vie. Par exemple, si vous voulez un contrôleur d’ingress de type nginx, vous pouvez le déployer via un simple :

sudo microk8s enable ingress

Ou encore, si vous aimez bien gérer vos certificats avec Let’s Encrypt, vous pouvez activer l’addon cert-manager. Il déploiera le célèbre chart Helm dans votre cluster et vous aurez tout ce dont vous avez besoin pour générer vos certificats TLS.

sudo microk8s enable cert-manager

On parle ici d’une façon « simplifiée » de déployer des composants sur votre cluster. Si vous voulez déployer à la main, via Helm ou autre, rien ne vous en empêche. Le principal avantage de ces addOns est leur côté “sur étagère” et pré-paramétrés pour fonctionner directement en modifiant si besoin la configuration interne de Kubernetes.

Encore plus d’addOns

MicroK8s fonctionne avec un système d’addOns basés sur des dépôts. Par défaut, le dépôt “core” est activé, mais vous pouvez, par exemple, activer le dépôt communautaire pour avoir encore plus d’addOns sympas à disposition. Cela est faisable au travers de la commande suivante :

sudo microk8s enable community

Et voilà, vous pouvez à présent déployer Argo CD, Fluentd, Knative, Linkerd, Istio, l’Ingress controller Traefik, Trivy… et bien d’autres encore en une seule ligne de commande.

Capture d’écran 2023-10-19 à 10.56.02

Leur déploiement passe toujours par la même commande :

sudo microk8s enable <addon>

Spoiler alert : Si vous souhaitez supprimer un addOn, il faudra utiliser la commande :

sudo microk8s disable <addon>

 

Utilisation

Après cette première phase de mise en place du kube, nous allons regarder comment interagir avec.

Mono Utilisateur

Vous êtes le seul utilisateur et vous voulez commencer à jouer avec kubectl, pour cela, rien de plus simple. Sur le node vous avez un kubectl intégré accessible via la commande :

sudo microk8s kubectl

C’est pratique à des fins de debug, mais ca reste un peu long… Et d’une manière générale, on interagit avec un cluster Kubernetes depuis un poste client, pas directement depuis le node où il est installé. Pour exporter un fichier kubeconfig tout prêt, vous pouvez simplement faire la commande suivante :

sudo microk8s config

Capture d’écran 2023-10-19 à 10.59.07

Il ne vous reste plus qu'à copier le contenu sur votre laptop préféré dans un fichier du répertoire ~/.kube et le tour sera joué.

Par exemple, si vous avez un accès root à votre noeud, vous pouvez faire cela :

ssh root@$MICROK8S_NODE 'microk8s config' > ~/.kube/microk8s_node

Multi utilisateurs

Si vous êtes dans la politique du least privilege, ou si tout simplement vous êtes dans un contexte où vous souhaitez donner des droits spécifiques à des utilisateurs spécifiques, tout est prévu ! Et cela se gère avec ces bons vieux RBAC (Role Based Access Control) qui vous permettront de définir qui a accès à quoi et comment. Cela se fera au travers de l’activation de l’addOn rbac. Plus d’informations ici : https://microk8s.io/docs/multi-user.

 

Mise à jour

Kubernetes est en constante évolution et les mises à jour sont très régulières. Que ce soit pour fixer des failles de sécurité ou pour introduire de nouvelles fonctionnalités, il est important de maintenir son cluster Kubernetes le plus à jour possible. Bien heureusement, MicroK8s nous propose une solution toute prête, et cela est directement lié au gestionnaire de paquets snaps !

x.y.Z

Les mises à jour de type “patch” sont appliquées automatiquement. Ainsi, si vous êtes sur le channel 1.28, votre cluster passera tout seul les versions 1.28.1, 1.28.2, 1.28.3, etc. sans rien vous demander. Cela est géré en arrière-plan par le système snap.

x.Y.z

Les mises à jour de type “minor” (par exemple : 1.28 à 1.29) doivent être réalisées manuellement. Cela est dû au risque d’incompatibilité ascendante (par exemple, la disparition d’un objet dans une apiVersion particulière).

La mise à jour est tout aussi simple que l’installation. Vous n’avez qu'à “rafraîchir” le snap sur un nouveau canal. Par exemple, quand la version 1.29 de Kubernetes sortira, la commande à effectuer sera la suivante :

sudo snap refresh microk8s --channel=1.29/stable

Attention ! Bien entendu, avant toute mise à jour pouvant entraîner une incompatibilité ascendante, vous DEVEZ adapter vos workloads AVANT la migration pour vérifier que tout est compatible avec la nouvelle version.

Pour les personnes qui aiment vivre dangereusement, il existe en plus du channel “stable”, les channels “candidate”, “beta” et “edge”.

 

Haute Disponibilité

Ok, on a un nœud Kubernetes qui tourne. C’est bien… mais on ne peut pas vraiment appeler ça un “cluster”. Si je dois rebooter ma machine, je vais avoir une interruption de service, et dans un contexte prod ready, ce n’est pas acceptable.

Pas de soucis, il “suffit” de rajouter des nœuds à notre cluster. Et tout cela est très simplifié, bien heureusement !

sudo microk8s add-node

Cette commande va nous générer une nouvelle commande à exécuter sur notre nouveau nœud afin qu’il rejoigne le cluster. Il est également possible de rajouter le nouveau nœud en temps que worker uniquement si l’on ne souhaite pas faire tourner de control plane dessus.
Plus d’informations sur le sujet sont disponibles ici : https://microk8s.io/docs/high-availability.

Il est à noter que la gestion d’un cluster Kubernetes à plusieurs nœuds est légèrement plus complexe que celle d’un cluster à un seul nœud. Par exemple, lors d’une mise a jour “mineure” vous devrez vous y prendre noeud par noeud et drainer vos charges de travail.

 

Inconvénients

Jusqu’ici, tout avait l’air magique et parfait… Cependant MicroK8s, comme beaucoup d’outils, n’est pas exempt de petits problèmes, et il me paraît important de faire quelques retours d'expériences.

Une HA pas aussi magique que cela

Dans une dynamique de test en conditions réelles, j’ai voulu voir comment fonctionnait réellement le mode Haute disponibilité en utilisant 4 VM Ubuntu sous Virtualbox. La mise en place n’a pas été aussi simple qu’annoncée et la documentation n’est probablement pas à jour sur ce sujet. 

Quoi qu’il en soit, il est très simple de rajouter un nœud de travail (worker), mais l’ajout de master implique que ces derniers ne pourront pas faire tourner de charge de travail. Ce qui nous met dans une typologie incongrue où nous avons notre premier nœud qui officiera comme maître ET qui pourra prendre des charges de travail, des nœuds maîtres uniquement, et des nœuds de charge de travail uniquement…

Certains addOns trop gourmands

De même, j’ai voulu tester le plugin starboard qui permet de rajouter une couche de sécurité à votre cluster en ajoutant notamment Trivy Operator qui va scanner vos workloads et la configuration de votre cluster pour vous aider à mieux comprendre les failles que vous pourriez avoir. De ce côté, le plugin s’installe bien et les rapport se sont correctement générés. Cependant, le load average de mon nœud à dépassé les 70 sans moyen de le faire retomber. Là encore, des recherches sur internet ont révélé des soucis sous le capot de MicroK8s (en l'occurrence : https://github.com/canonical/microk8s/issues/500). Seule la désinstallation du plugin m’a permis de retourner à une solution normale.

 

Conclusion

De par sa simplicité d’installation et de mise à jour, MicroK8s est une solution sympathique si vous souhaitez avoir un serveur Kubernetes simplement. Ses modules complémentaires peuvent vous faciliter la vie et son mode d’ajout automatique de nœuds en font une alternative très séduisante aux autres acteurs du marché. 

Cependant, sa simplicité et sa volonté d’abstraction rendent son debug compliqué et fastidieux. Parfois, vous serez confronté à parcourir Internet à la recherche de “la” solution, voire inventer vous-même vos moyens de contournement, ce qui nécessitera, in fine, des compétences qui n’étaient pas requises lorsque vous aviez décidé de choisir cet outil…

En définitive, je pense que MicroK8s est un excellent outil si l’on souhaite avoir un orchestrateur simple d’utilisation et d’administration chez soi, en mono-noeud (ou avec quelques workers si le besoin s’en fait sentir), pour faire tourner son Home Assistant, son Plex, ou tout autre applications conteneurisées qu’il vous plaira d’avoir. Pour ma part, je l’utilise sur mon NAS depuis presque 3 ans pour héberger une petite dizaines d’applications que j’utilise quotidiennement. Il peut également servir en tant qu’orchestrateur de dev sur sa machine perso si on cherche une alternative à kind ou minikube. Quoi qu’il en soit, concernant le “Production ready” la peinture ne semble pas sèche, et le produit demande encore un peu de polish à mes yeux pour rivaliser avec un Rancher par exemple.