Cette série est également disponible en anglais.
Read in English
Chapitre 4
Home LabTutorialsDevOps & Infrastructure

Comment installer Kubernetes K3s sur un Raspberry Pi 5

11 min de lecture
Comment installer Kubernetes K3s sur un Raspberry Pi 5
Apprenez à installer et configurer K3s, une distribution Kubernetes légère, sur un Raspberry Pi 5. Ce guide couvre l'activation des cgroups, la mise en place du cluster et la configuration de l'accès à distance avec kubectl.

Mon objectif principal pour ce Raspberry Pi est de déployer des sites web et d'autres services. Il y a de nombreuses manières de le faire, mais je voulais reproduire un véritable environnement de production. Comme je travaille en tant qu'ingénieur DevOps, j'ai décidé d'opter pour Kubernetes, et plus précisément k3s.

Pourquoi choisir Kubernetes pour votre lab maison?

Kubernetes ajoute de la complexité, mais il apporte aussi beaucoup de confort d'utilisation une fois que l'on en comprend les bases. Il aide à maintenir vos applications en fonctionnement en redémarrant automatiquement les processus qui plantent, permet le deployment à grande échelle et en déployant les mises à jour sans interruption de service.

Cependant, Kubernetes ajoute un coût important en terme de ressource. Ainsi, j'ai choisi K3s plutôt qu'une installation Kubernetes complète afin de bénéficier d'une distribution plus légère qui est bien mieux adaptée à un Raspberry Pi. Comme nous allons le voir, l'installation de k3s est relativement simple.

Comment installer et configurer Kubernetes K3s ?

Étape 1 : Activer les Control Groups (cgroups) Linux

Kubernetes s'appuie sur une fonctionnalité du noyau Linux appelée cgroups (Control Groups). Les cgroups permettent au système d'exploitation d'allouer et de limiter les ressources (CPU, RAM, réseau) à des processus spécifiques. Dans notre cas, Kubernetes en aura besoin pour pouvoir exécuter nos conteneurs.

Par défaut, les OS léger qui tourne sur Raspberry Pi peuvent désactiver le suivi de la mémoire pour économiser une partie des ressources. Si ce n'est pas activer, Kubernetes essaiera de démarrer, réalisera qu'il n'a aucun moyen d'appliquer des limites de RAM aux pods, et plantera immédiatement. Nous devons donc ajouter ces indicateurs au noyau Linux pour initialiser ces modules de suivi au démarrage.

Exécutez cette commande pour ouvrir la configuration de démarrage de votre noyau :

sudo nano /boot/firmware/cmdline.txt

Et ajoutez ceci à la fin de la ligne existante (sauf si c'est déjà présent). Attention : Gardez toujours ce fichier sur une seule ligne, n'ajoutez pas de retour à la ligne.

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

Puis :

sudo reboot

Étape 2 : Exécuter le script d'installation de K3s

K3s nécessite iptables pour gérer les règles réseau. Installez-le avec :

sudo apt update && sudo apt install -y iptables

Ensuite, vous pouvez installer k3s en utilisant cette commande :

# Remplacez 192.168.x.x par l'IP statique de votre Pi
curl -sfL https://get.k3s.io | sh -s - \
  --node-ip=192.168.x.x

Ce que fait cette commande, c'est télécharger un script depuis https://get.k3s.io qui détecte l'architecture de votre CPU (dans ce cas ARM64) et télécharge le binaire approprié. Ensuite, il installe k3s et crée un fichier d'unité systemd (/etc/systemd/system/k3s.service). Cela garantit que si le Pi perd son alimentation et redémarre, Kubernetes se lance automatiquement avant même que vous ne vous connectiez.

Le paramètre Node-ip est essentiel. Un nœud (node) dans Kubernetes est une machine/serveur, dans ce cas votre Pi. Ici, vous devez donner l'adresse IP de votre Pi sur votre réseau local.

Attention : Assurez-vous d'utiliser l'adresse IP statique que vous avez configurée dans le chapitre précédent. Si vous utilisez une IP dynamique, votre cluster pourrait cesser de fonctionner si le routeur attribue une adresse différente plus tard.

Mais le script d'installation de K3s a beaucoup d'autres paramètres, en voici deux autres que vous pourriez vouloir utiliser selon votre cas d'usage :

--flannel-backend=wireguard-native : C'est très utile lorsque vous utilisez k3s dans un cluster avec plusieurs serveurs et que vous voulez une connexion sécurisée entre les nœuds, mais cela ajoute une petite charge sur le CPU.

--secrets-encryption : Chiffre les secrets Kubernetes au repos. C'est une bonne option de sécurité si vous stockez des données sensibles dans les Secrets, mais cela ajoute aussi de la surcharge.

Pour une configuration plus reproductible, vous pouvez aussi utiliser un fichier de configuration K3s. Ce fichier configure spécifiquement les paramètres du logiciel Kubernetes.

Note sur le YAML : Kubernetes et K3s utilisent le format YAML pour la configuration. En YAML, l'indentation est cruciale. Utilisez toujours des espaces (généralement 2), jamais de tabulations, et assurez-vous que votre alignement est parfait.

node-ip: 192.168.x.x
flannel-backend: wireguard-native
tls-san:
 - 192.168.x.x

Ensuite, installez K3s en utilisant ce fichier de configuration :

curl -sfL https://get.k3s.io | sh - \
  --config config.yaml

Note importante sur l'architecture : Le Raspberry Pi 5 utilise l'architecture ARM64. Lorsque vous déploierez vos propres applications plus tard, assurez-vous que les images Docker utilisées sont compatibles ARM64 (c'est le cas de la plupart des images populaires).

Étape 3 : Comment vérifier la santé initiale de votre cluster Kubernetes

Kubernetes a deux composants principaux : le plan de contrôle (Control Plane) (qui gère tout) et le plan de données (Data Plane) (qui exécute votre application). Dans un environnement multi-nœuds, nous aurions plusieurs machines séparées pour ces deux plans. Cela permet de s'assurer que les applications ne privent pas le plan de contrôle de ressources s'ils en utilisent trop, et vice-versa. Dans notre cas, nous n'avons qu'un seul nœud. C'est suffisant pour une petite configuration mais moins résistant aux pannes.

Pour vérifier l'état du « plan de contrôle » et voir la « taxe » réelle que Kubernetes prélève sur les ressources de votre Pi, vous pouvez exécuter :

kubectl get nodes
kubectl top nodes
kubectl get pods -n kube-system

Vous devriez voir quelque chose comme ça, bien qu'avec moins de pods que moi puisque ma configuration a déjà beaucoup plus de services.

Terminal

kubectl est un outil en ligne de commande qui agit comme un client REST. Il envoie des commandes JSON au serveur d'API Kubernetes sur le plan de contrôle qui tourne sur votre Pi. Dans ce cas, nous avons fait ceci :

get nodes : Liste les nœuds Kubernetes et leur état. C'est une bonne vérification pour voir si Kubernetes fonctionne. Si le statut est Ready, cela signifie que le runtime de conteneur (containerd) est sain et que le réseau est fonctionnel.

top nodes : Affiche l'utilisation actuelle du processeur et de la RAM de votre Pi. C'est possible car K3s inclut un metrics-server par défaut.

get pods -n kube-system : Vous verrez plusieurs pods dans l'espace de noms (namespace) kube-system. Cherchez en particulier :

  • traefik : Le contrôleur d'entrée (Ingress) responsable du routage des requêtes HTTP du monde extérieur vers les services à l'intérieur de Kubernetes.
  • coredns : Gère le DNS interne du cluster.
  • local-path-provisioner : Gère le stockage sur votre Pi.

Si tout est bon, nous avons pratiquement terminé et Kubernetes est installé.

Note sur les espaces de noms : Le flag -n kube-system indique à kubectl de regarder dans l'espace de noms « kube-system ». Kubernetes utilise des espaces de noms pour isoler des groupes de ressources. Dans ce cas ci, les outils système sont ainsi séparés de vos propres applications.

Étape 4 : Comment configurer votre PC pour l'accès kubectl à distance

Néanmoins, devoir ouvrir une connexion SSH à chaque fois que vous voulez gérer votre cluster est fastidieux. Installons donc kubectl sur votre PC pour contrôler Kubernetes à distance (mais toujours uniquement depuis votre réseau local) :

  • macOS :
    brew install kubectl
  • Windows : Téléchargez depuis : [kubernetes]https://kubernetes.io/releases/download/#binaries). Ou utilisez :
    winget install -e --id Kubernetes.kubectl
  • Linux :
    sudo apt install kubectl

Ensuite, nous devons créer un fichier de configuration; Kubernetes cherche un fichier situé à :

  • Linux/macOS : ~/.kube/config
  • Windows : %USERPROFILE%\.kube\config

Sur votre PC, créez ce fichier. Puis, allez sur votre Raspberry Pi et exécutez :

sudo cat /etc/rancher/k3s/k3s.yaml

Fichier de configuration

Vous trouverez quelque chose comme ceci. Copiez ce texte et collez-le dans le fichier de configuration sur votre PC ; ne le modifiez pas sur le Pi.

Dans le fichier que vous venez de coller sur votre ordinateur portable, trouvez cette ligne :

server: https://127.0.0.1:6443

Le Pi pense que le serveur est à 127.0.0.1 (lui-même). Votre ordinateur portable a besoin de connaître la véritable IP du Pi. Changez-la pour :

server: https://192.168.x.x:6443

(Remplacez par l'adresse IP réelle de votre Pi).

Le Pi, lui, conserve 127.0.0.1.

Testez : Ouvrez un terminal sur votre ordinateur portable et tapez kubectl get nodes. Si vous voyez votre Pi, c'est que la configuration de Kubernetes est terminée !

Astuce de dépannage : Si vous avez un pare-feu (comme ufw) activé sur votre Pi, il pourrait bloquer le trafic sur le port 6443. Assurez-vous qu'il est configuré pour autoriser le trafic Kubernetes.

Maintenance et Désinstallation

Mise à jour de K3s : Pour mettre à jour K3s, il vous suffit d'exécuter à nouveau le même script d'installation. Il détectera l'installation existante et mettra à jour les binaires tout en conservant vos paramètres et vos applications.

Désinstaller K3s : Si vous avez besoin de recommencer ou de supprimer K3s, exécutez simplement le script de désactivation intégré :

/usr/local/bin/k3s-uninstall.sh

Ce que Kubernetes nous apporte

Avant d'aller plus loin, clarifions ce que Kubernetes nous apporte réellement et ce que K3s change par rapport à une installation Kubernetes normale, aussi appelée k8s.

Kubernetes fait plus qu'exécuter des conteneurs, c'est un système d'orchestration complet. Au lieu de démarrer manuellement des conteneurs en espérant qu'ils continuent de tourner, vous décrivez l'état désiré de votre système et Kubernetes essaie de le maintenir.

Avez-vous besoin de Kubernetes pour un simple blog ? Pas vraiment. Mais K3s est facile à installer, amusant à tester, et c’est une excellente façon d’apprendre une technologie utilisée par de nombreux développeurs professionnels.

Boucle de contrôle

Si un pod plante, il le redémarre. Si un déploiement est mis à jour, il déploie la nouvelle version de manière à ce que les utilisateurs ne voient jamais d'interruption. Si un nœud disparaît, Kubernetes peut replanifier les charges de travail sur un autre nœud, en supposant que vous ayez un cluster multi-nœuds. Si vous configurez un ingress, il peut router le trafic externe vers la bonne application.

Kubernetes est puissant, mais ce n'est pas magique. Il ne supprime pas la nécessité de comprendre le réseau, le stockage, le DNS, le TLS, le monitoring et les sauvegardes. En fait, il vous force souvent à les apprendre correctement.

Principales fonctionnalités de Kubernetes

Le diagramme ci-dessous montre les principaux composants d’une application déployée dans Kubernetes, ainsi que la manière dont ils interagissent. Définissons-les plus précisément.

Architecture Kubernetes

  • Pods : La plus petite unité déployable dans Kubernetes. Généralement un conteneur d'application, parfois plusieurs conteneurs qui travaillent ensemble. C'est ce qui exécute réellement votre application.
  • Déploiements (Deployments) : Définissent combien de répliques (pods) d'une application doivent être exécutées et quelle image de conteneur utiliser. Également utilisés pour définir des règles de mise à l'échelle, exécuter des mises à jour progressives (rolling updates) et gérer les redémarrages automatiques/l'auto-réparation.
  • Services : Donnent aux pods une adresse réseau interne stable. Les pods ont leur propre adresse IP, ils peuvent être détruits et recréés avec une nouvelle IP. Le service fournit un nom et une IP stables pour que vous n'ayez pas à vous en soucier. Il peut aussi répartir la charge entre les pods.
  • Ingress : Bien que le service fournisse une adresse stable, nous devons toujours savoir quel service contacter. C'est le rôle de l'Ingress, c'est la porte d'entrée de Kubernetes qui lit les requêtes HTTP et les transfère au bon service.
  • ConfigMaps et Secrets : Pour stocker des valeurs de configuration. Utile pour les paramètres d'application, les variables d'environnement, les feature flags, etc. Bien sûr, les Secrets doivent être utilisés pour tout ce qui doit être gardé en sécurité, car les ConfigMaps sont accessibles à l'exécution.
  • Volumes Persistants (Persistent Volumes) : Fournissent du stockage aux applications qui ont besoin de conserver des données. Requis pour les bases de données, les téléversements, les tableaux de bord, les analyses, etc.

    Conseil sur le stockage : Le local-path-provisioner, installé par défaut avec k3s, store les données sur le disque de votre Pi. Si vous ajoutez plus tard d'autres Pi à votre cluster, vous devrez vous tourner vers un stockage partagé comme NFS ou Longhorn pour permettre à vos applications de se déplacer entre les nœuds.

  • Espaces de noms (Namespaces) : Chaque application déployée sur Kubernetes peut avoir tout ou partie des éléments mentionnés ci-dessus. Pour rester organisé, Kubernetes utilise des espaces de noms pour séparer logiquement les ressources au sein d'un même cluster.

Les différences entre K3s et K8s

K3s est une distribution Kubernetes légère créée par Rancher/SUSE. C'est toujours Kubernetes, mais empaqueté d'une manière beaucoup plus facile à installer et à exécuter sur de petites machines comme un Raspberry Pi.

Logo K3s

Une installation Kubernetes normale peut être assez lourde. Vous devez souvent installer et configurer de nombreux éléments vous-même : le serveur d'API, le gestionnaire de contrôleurs, le planificateur, le kubelet, le kube-proxy, le réseau CNI, le contrôleur d'ingress, la classe de stockage, le serveur de métriques, et plus encore.

De plus, k3s utilise beaucoup moins de ressources par défaut, ce qui le rend idéal pour les appareils en périphérie (edge devices) et les Raspberry Pi.

K3s regroupe beaucoup de ces éléments et fournit des configurations par défaut judicieuses. La documentation officielle de K3s liste plusieurs composants empaquetés qui sont déployés automatiquement, y compris coredns, traefik, local-storage, et metrics-server. K3s inclut également son propre répartiteur de charge (Load Balancer) de service embarqué appelé ServiceLB.

Néanmoins, il est possible de commencer avec k3s puis de changer des composants pour arriver à un k8s complet. Vous ne serez donc pas enfermé dans k3s si vous commencez par là. K3s n'est donc pas un faux Kubernetes ou un Kubernetes jouet. C'est un Kubernetes certifié par la CNCF, mais empaqueté pour des environnements plus petits.

Ce que K3s installe par défaut

Une chose que j'aime avec K3s, c'est qu'il vous donne un cluster fonctionnel immédiatement. Vous ne partez pas d'une installation Kubernetes vide. Par défaut, K3s inclut plusieurs composants utiles dans un homelab.

  • Containerd : C'est ce qui démarre et gère réellement les conteneurs.
  • CoreDNS : DNS interne pour le cluster. Permet aux pods et aux services de se retrouver par leur nom.
  • Flannel : Plugin réseau CNI par défaut. Crée le réseau des pods pour que les conteneurs puissent communiquer entre eux.
  • Traefik : Contrôleur d'ingress par défaut.
  • ServiceLB : Dans le cloud, un Service Kubernetes de type LoadBalancer crée généralement un véritable répartiteur de charge cloud. À la maison, il n'y a pas de répartiteur de charge AWS, Azure ou Google Cloud qui nous attend. ServiceLB est un répartiteur de charge léger pour les clusters bare-metal. Il rend les services de type LoadBalancer utilisables sans fournisseur cloud. Mais il existe d'autres options comme NodePort ou MetalLB.
  • Local-path-provisioner : Fournisseur de stockage local simple. Vous permet de créer des volumes persistants adossés au disque local. Mais il est lié à une seule machine. Pas idéal pour le basculement multi-nœuds. Préférez NFS ou Longhorn pour un vrai stockage distribué et résilient.
  • Metrics-server : Collecte des métriques de base sur le CPU et la mémoire. Nécessaire pour des commandes comme kubectl top.

Chacun de ces éléments peut être remplacé par une autre solution. Par exemple, vous pouvez remplacer Traefik par Nginx si vous voulez encore plus de contrôle. C'est pourquoi K3s semble beaucoup plus simple qu'une installation Kubernetes complète. Une grande partie de la configuration fastidieuse est déjà faite pour vous.

Voilà ! Vous devriez maintenant avoir Kubernetes installé et comprendre les principaux concepts qui le font fonctionner. Dans le prochain chapitre, nous déploierons notre premier site web avec Kubernetes. Mais d'abord, vous voudrez peut-être apprendre à auto-héberger un registre de conteneurs pour accélérer votre pipeline CI/CD.

#kubernetes#k3s#raspberry-pi#devops#homelab
Judicael Poumay (Ph.D.)

Judicael Poumay (Ph.D.)

Suivez-moi sur LinkedIn pour du contenu hebdomadaire Judicaël Poumay

En tant que chercheur/développeur IA indépendant spécialisé en Traitement du Langage Naturel (NLP), j'ai une expertise complète dans le développement et l'intégration de systèmes d'IA, ainsi que l'analyse de données.

Votre entreprise cherche à intégrer des solutions IA, analyser des données ou renforcer son développement back-end ? Contactez-moi !

Offrez-moi une bière 🍺

Articles Similaires