
K3s est une distribution Kubernetes légère (~70 MB) qui intègre dans un seul binaire tous les composants nécessaires : containerd, Flannel, CoreDNS, metrics-server. Conçu pour les environnements edge, IoT et les homelabs, K3s démarre en quelques secondes avec des ressources minimales (512 MB RAM pour un agent).
Ce guide vous montre comment :
- Installer K3s sur un serveur unique ou un cluster multi-node
- Configurer via YAML (config.yaml, registries.yaml)
- Désactiver les composants inutiles (Traefik, ServiceLB)
- Déployer en haute disponibilité avec etcd intégré
- Diagnostiquer les problèmes courants
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Architecture K3s : binaire unique, composants intégrés, différences avec Kubernetes standard
- Installation rapide : mono-serveur en 30 secondes, multi-node avec agents
- Configuration YAML : config.yaml pour personnaliser, registries.yaml pour les registries privés
- Gestion des add-ons : désactiver Traefik, ServiceLB, local-path selon vos besoins
- Haute disponibilité : cluster HA avec etcd intégré (3+ serveurs)
- Dépannage : commandes de diagnostic et résolution des problèmes courants
Vocabulaire essentiel
Section intitulée « Vocabulaire essentiel »Avant de commencer, voici les termes que vous rencontrerez dans ce guide :
| Terme | Explication simple |
|---|---|
| Cluster | Un groupe de machines (physiques ou virtuelles) qui travaillent ensemble pour faire tourner vos applications |
| Node | Une machine dans le cluster. Peut être un "server" ou un "agent" |
| Server (K3s) | La machine qui prend les décisions : où lancer les applications, comment les exposer au réseau, etc. C'est le "cerveau" du cluster |
| Agent (K3s) | Une machine qui exécute les applications. Elle reçoit ses ordres du server. C'est la "force de travail" |
| Control plane | L'ensemble des composants qui gèrent le cluster (API, scheduler, etc.). Sur K3s, c'est le rôle du "server" |
| Pod | La plus petite unité dans Kubernetes : un ou plusieurs conteneurs qui tournent ensemble |
| kubeconfig | Un fichier qui contient les informations de connexion à votre cluster (adresse, certificats, tokens) |
| Token | Un mot de passe secret qui permet aux agents de rejoindre le cluster |
Quand choisir K3s
Section intitulée « Quand choisir K3s »| Critère | K3s | Minikube | Kind |
|---|---|---|---|
| Cas d'usage | Edge / IoT / homelab, prod légère | Dev local, apprentissage | CI/CD, tests, clusters jetables |
| Datastore | SQLite (défaut) ; embedded etcd (HA) ; externe possible | etcd (kubeadm), HA stacked | etcd (kubeadm) dans les control-planes |
| Multi-node | ✅ Natif (server/agent) | ✅ --nodes | ✅ via config YAML |
| HA control plane | ✅ embedded etcd (min. 3 serveurs) | ✅ --ha (min. 3 CP) + kube-vip | ✅ multi control-planes (HAProxy) |
| Ressources | Agent ~275 MiB, Server ~1.6 GiB | 2 CPU, 20 GB disque (défaut) | ≥6 GB RAM Docker (8 GB conseillé) |
| GPU | ⚠️ À configurer (toolkit + plugin) | ✅ --gpus (driver Docker) | ⚠️ Pas clé en main |
| Persistance | ✅ Cluster système (systemd) | ✅ Profils persistants | ⚠️ Plutôt jetable |
| Installation | Binaire + service (Linux) | VM ou conteneur selon driver | Conteneurs Docker "nodes" |
Choisissez K3s si :
- Vous déployez sur des serveurs physiques ou VMs (pas de conteneur wrapper)
- Vous avez besoin de haute disponibilité native
- Vos ressources sont limitées (Raspberry Pi, edge)
- Vous voulez un cluster persistant pour un homelab
Architecture K3s
Section intitulée « Architecture K3s »Pourquoi K3s est "léger" ?
Section intitulée « Pourquoi K3s est "léger" ? »Un Kubernetes standard nécessite d'installer séparément de nombreux composants (etcd, kubelet, kube-proxy, un CNI...). K3s simplifie tout ça : un seul fichier de ~70 MB contient tout ce dont vous avez besoin.
Concrètement, quand vous installez K3s :
- Un seul binaire
/usr/local/bin/k3sest téléchargé - Ce binaire contient Kubernetes + tous les outils annexes
- Un service systemd démarre et gère le tout
Composants intégrés
Section intitulée « Composants intégrés »Voici ce que K3s installe automatiquement (vous n'avez rien à faire) :
| Composant | Ça sert à quoi ? |
|---|---|
| containerd | Fait tourner vos conteneurs (comme Docker, mais plus léger) |
| Flannel | Crée le réseau virtuel pour que vos pods communiquent entre eux |
| CoreDNS | Permet à vos pods de se trouver par nom (mon-service.default.svc) au lieu d'IP |
| kube-proxy | Route le trafic réseau vers les bons pods |
| metrics-server | Collecte les stats CPU/RAM pour kubectl top |
| Traefik | Ingress controller : expose vos apps sur le réseau externe |
| ServiceLB | Simule un load balancer cloud pour les services de type LoadBalancer |
| local-path | Crée des volumes persistants sur le disque local |
Add-ons optionnels (désactivables)
Section intitulée « Add-ons optionnels (désactivables) »Certains composants peuvent être désactivés si vous préférez utiliser des alternatives :
| Add-on | Pourquoi le désactiver ? |
|---|---|
| Traefik | Vous préférez Nginx Ingress, Istio, ou gérez l'ingress autrement |
| ServiceLB | Vous utilisez MetalLB ou n'avez pas besoin de LoadBalancer |
| local-path | Vous utilisez un stockage réseau (NFS, Longhorn, Ceph) |
Modes de datastore
Section intitulée « Modes de datastore »K3s supporte plusieurs backends pour stocker l'état du cluster :
| Mode | Quand l'utiliser | Description |
|---|---|---|
| SQLite (kine) | Mono-serveur (défaut) | Simple, fiable, fichier local. Parfait pour apprendre ou un homelab léger |
| Embedded etcd | HA (3+ serveurs) | Activé avec --cluster-init. Réplication + quorum entre serveurs |
| Datastore externe | Infra existante | MySQL, PostgreSQL ou etcd externe. Utile si vous avez déjà une DB managée |
Prérequis
Section intitulée « Prérequis »Ressources minimales
Section intitulée « Ressources minimales »| Rôle | CPU | RAM | Disque |
|---|---|---|---|
| Server (control plane) | 2 cœurs | 2 GB | 10 GB SSD |
| Agent (worker) | 1 cœur | 512 MB | 5 GB |
Systèmes supportés
Section intitulée « Systèmes supportés »- Linux : Ubuntu 20.04+, Debian 11+, RHEL/Rocky 8+, openSUSE
- Architecture : amd64, arm64, armhf (Raspberry Pi)
Ports réseau
Section intitulée « Ports réseau »| Port | Protocole | Fonction | Requis pour |
|---|---|---|---|
| 6443 | TCP | API Kubernetes | Tous (agents, kubectl) |
| 8472 | UDP | Flannel VXLAN | Multi-node |
| 10250 | TCP | Kubelet metrics | Monitoring |
| 2379-2380 | TCP | etcd | HA (serveurs uniquement) |
Installation mono-serveur
Section intitulée « Installation mono-serveur »L'installation la plus simple : un serveur unique qui fait tourner le control plane et les workloads.
-
Installer K3s avec le script officiel
Fenêtre de terminal # Télécharger le script officiel, l'inspecter, puis l'exécutercurl -sfL https://get.k3s.io -o k3s-install.shless k3s-install.shsh k3s-install.sh -
Vérifier l'installation
Fenêtre de terminal # Vérifier que le service K3s tournesudo systemctl status k3s# ● k3s.service - Lightweight Kubernetes# Active: active (running) <-- Ce qu'on veut voirFenêtre de terminal # Lister les machines du clustersudo k3s kubectl get nodes# NAME STATUS ROLES AGE VERSION# master1 Ready control-plane 30s v1.36.2+k3s1 -
Configurer kubectl pour votre utilisateur
Par défaut, le kubeconfig est lisible uniquement par root. Pour utiliser
kubectlsans sudo :Fenêtre de terminal # Créer le dossier de config kubectlmkdir -p ~/.kube# Copier le kubeconfig K3ssudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config# Changer le propriétaire du fichier (pour votre utilisateur)sudo chown $(id -u):$(id -g) ~/.kube/config# Tester : cette commande ne doit plus nécessiter sudokubectl get nodes
Fichiers importants
Section intitulée « Fichiers importants »| Chemin | Description |
|---|---|
/etc/rancher/k3s/k3s.yaml | Kubeconfig (certificats + token admin) |
/etc/rancher/k3s/config.yaml | Configuration K3s (à créer) |
/etc/rancher/k3s/registries.yaml | Configuration des registries |
/var/lib/rancher/k3s/server/node-token | Token pour joindre des agents |
/var/lib/rancher/k3s/server/db/ | Base SQLite (datastore) |
Configuration avec config.yaml
Section intitulée « Configuration avec config.yaml »Au lieu de passer des arguments en ligne de commande, utilisez /etc/rancher/k3s/config.yaml.
Profil développement (minimal)
Section intitulée « Profil développement (minimal) »# Kubeconfig lisible sans sudowrite-kubeconfig-mode: "0644"
# Désactiver les composants non nécessairesdisable: - traefik - servicelbProfil homelab
Section intitulée « Profil homelab »write-kubeconfig-mode: "0644"
# Désactiver Traefik (utiliser Nginx Ingress à la place)disable: - traefik
# Ajouter des SAN pour accès distanttls-san: - "k3s.homelab.local" - "192.168.1.100"
# Limiter les ressourceskubelet-arg: - "max-pods=50"Profil production HA
Section intitulée « Profil production HA »write-kubeconfig-mode: "0644"
# Initialiser le cluster HA (premier serveur uniquement)cluster-init: true
# SAN pour le load balancertls-san: - "k3s-api.example.com" - "10.0.0.10"
# Désactiver les add-ons par défautdisable: - traefik - servicelb - local-path-provisioner
# Configurer etcdetcd-expose-metrics: trueAppliquer la configuration
Section intitulée « Appliquer la configuration »# Si K3s est déjà installé, redémarrer le servicesudo systemctl restart k3s
# Vérifier les composants désactivéssudo k3s kubectl get pods -n kube-system# Traefik et ServiceLB ne doivent pas apparaîtreInstallation multi-node
Section intitulée « Installation multi-node »Un cluster K3s se compose de servers (control plane) et agents (workers).
-
Sur le premier serveur : installer K3s
Fenêtre de terminal curl -sfL https://get.k3s.io -o k3s-install.shsh k3s-install.sh -
Récupérer le token pour joindre les agents
Fenêtre de terminal sudo cat /var/lib/rancher/k3s/server/node-token# K10xxx::server:xxx -
Sur chaque agent : joindre le cluster
Connectez-vous en SSH sur la machine qui sera agent, puis :
Fenêtre de terminal curl -sfL https://get.k3s.io -o k3s-install.shK3S_URL=https://SERVER_IP:6443 K3S_TOKEN=TOKEN sh k3s-install.shRemplacez :
SERVER_IP: l'adresse IP du serveur K3s (ex:192.168.1.10)TOKEN: le token récupéré à l'étape 2
Exemple concret :
Fenêtre de terminal curl -sfL https://get.k3s.io -o k3s-install.shK3S_URL=https://192.168.1.10:6443 K3S_TOKEN=K10abcd1234::server:xyz789 sh k3s-install.sh -
Vérifier le cluster
Fenêtre de terminal # Sur le serveursudo k3s kubectl get nodes# NAME STATUS ROLES AGE VERSION# server1 Ready control-plane 5m v1.36.2+k3s1# agent1 Ready <none> 2m v1.36.2+k3s1# agent2 Ready <none> 1m v1.36.2+k3s1
Labelliser les agents
Section intitulée « Labelliser les agents »Par défaut, les agents n'ont pas de rôle affiché. Ajoutez un label :
kubectl label node agent1 node-role.kubernetes.io/worker=workerkubectl label node agent2 node-role.kubernetes.io/worker=workerConfiguration des registries
Section intitulée « Configuration des registries »Le fichier /etc/rancher/k3s/registries.yaml configure l'accès aux registries de conteneurs.
Miroir Docker Hub
Section intitulée « Miroir Docker Hub »mirrors: docker.io: endpoint: - "https://registry.local:5000"Registry privé avec authentification
Section intitulée « Registry privé avec authentification »mirrors: "registry.example.com": endpoint: - "https://registry.example.com"
configs: "registry.example.com": auth: username: "user" password: "password" tls: # Certificat CA personnalisé ca_file: "/etc/certs/ca.crt" # Ou désactiver la vérification TLS (non recommandé) # insecure_skip_verify: trueRegistry insecure (HTTP)
Section intitulée « Registry insecure (HTTP) »mirrors: "registry.local:5000": endpoint: - "http://registry.local:5000"
configs: "registry.local:5000": tls: insecure_skip_verify: trueHaute disponibilité (HA)
Section intitulée « Haute disponibilité (HA) »K3s supporte deux modes HA :
| Mode | Description | Quand l'utiliser |
|---|---|---|
| etcd intégré | etcd sur chaque serveur K3s | Simplicité, pas de dépendance externe |
| Base externe | MySQL, PostgreSQL, etcd externe | Infrastructure existante |
HA avec etcd intégré
Section intitulée « HA avec etcd intégré »Nécessite 3 serveurs minimum (nombre impair pour le quorum).
-
Premier serveur : initialiser le cluster
Fenêtre de terminal curl -sfL https://get.k3s.io -o k3s-install.shsh k3s-install.sh server \--cluster-init \--tls-san=lb.example.comL'option
--cluster-initactive etcd intégré. -
Récupérer le token
Fenêtre de terminal sudo cat /var/lib/rancher/k3s/server/node-token -
Serveurs 2 et 3 : joindre comme serveurs
Fenêtre de terminal curl -sfL https://get.k3s.io -o k3s-install.shsh k3s-install.sh server \--server https://SERVER1_IP:6443 \--token TOKEN \--tls-san=lb.example.com -
Vérifier le cluster
Fenêtre de terminal sudo k3s kubectl get nodes# Tous les serveurs doivent avoir le rôle control-plane# Vérifier etcdsudo k3s etcdctl member list
Premiers pas après installation
Section intitulée « Premiers pas après installation »Votre cluster K3s est installé. Voici comment vérifier qu'il fonctionne et déployer votre première application.
Récupérer le kubeconfig
Section intitulée « Récupérer le kubeconfig »K3s écrit son fichier de connexion dans /etc/rancher/k3s/k3s.yaml dès l'installation du serveur. C'est lui que kubectl lit pour savoir à quel cluster parler et avec quels certificats client s'authentifier. Son format est celui de n'importe quel cluster Kubernetes, et le champ décisif est server :
apiVersion: v1clusters:- cluster: certificate-authority-data: <certificat de l'autorité> server: https://127.0.0.1:6443 name: defaultcontexts:- context: cluster: default user: default name: defaultcurrent-context: defaultkind: Configusers:- name: default user: client-certificate-data: <certificat client> client-key-data: <clé privée>Sur le serveur lui-même, exportez la variable KUBECONFIG pour que kubectl trouve ce fichier :
export KUBECONFIG=/etc/rancher/k3s/k3s.yamlkubectl get nodes# Les nodes doivent tous afficher "Ready"Pour piloter le cluster depuis votre poste, copiez le fichier puis remplacez 127.0.0.1 par l'adresse réelle du serveur. Sans cette substitution, kubectl interrogerait votre propre machine et échouerait :
scp root@192.168.1.10:/etc/rancher/k3s/k3s.yaml ~/.kube/k3s.yamlsed -i 's|127.0.0.1|192.168.1.10|' ~/.kube/k3s.yamlexport KUBECONFIG=~/.kube/k3s.yamlkubectl get nodesVérifier que tout fonctionne
Section intitulée « Vérifier que tout fonctionne »# 1. Vos nodes sont-ils prêts ?kubectl get nodes# Tous doivent être "Ready"
# 2. Les pods système tournent-ils ?kubectl get pods -n kube-system# Tous doivent être "Running" ou "Completed"
# 3. Les services système sont-ils OK ?kubectl get svc -n kube-systemDéployer une application de test
Section intitulée « Déployer une application de test »# Créer un déploiement nginxkubectl create deployment nginx --image=nginx
# Vérifier que le pod tournekubectl get pods# NAME READY STATUS RESTARTS AGE# nginx-xxx 1/1 Running 0 30s
# Exposer l'applicationkubectl expose deployment nginx --port=80 --type=NodePort
# Trouver le port attribuékubectl get svc nginx# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE# nginx NodePort 10.43.xxx.xx <none> 80:3xxxx/TCP 10s
# Tester (remplacez 3xxxx par le port affiché)curl http://localhost:3xxxxExposer un service avec ServiceLB
Section intitulée « Exposer un service avec ServiceLB »Sur un cloud, un Service de type LoadBalancer demande au fournisseur de créer un équilibreur de charge. Sur une machine nue, personne ne répond à cette demande et le service resterait en attente indéfiniment. K3s comble ce vide avec ServiceLB (le composant klipper-lb), activé par défaut.
Le mécanisme est simple : à la création d'un Service LoadBalancer, ServiceLB lance un DaemonSet de pods svclb-* qui réservent le port demandé sur chaque nœud et relaient le trafic vers vos pods.
kubectl create deployment web --image=nginx:alpinekubectl expose deployment web --type=LoadBalancer --port=8080 --target-port=80 --name=web-lb
kubectl get svc web-lb# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE# web-lb LoadBalancer 10.43.183.85 172.29.0.2,172.29.0.3,172.29.0.4 8080:30642/TCP 4sLa colonne EXTERNAL-IP liste les adresses de tous les nœuds : le service répond sur chacun d'eux, sans équilibreur externe. Les pods qui réalisent ce tour de passe-passe vivent dans kube-system :
kubectl get pods -n kube-system -l svccontroller.k3s.cattle.io/svcname=web-lb# NAME READY STATUS NODE# svclb-web-lb-42d9ba67-67vj2 1/1 Running server1# svclb-web-lb-42d9ba67-szcjj 1/1 Running agent1# svclb-web-lb-42d9ba67-hkhn6 1/1 Running agent2Nettoyer
Section intitulée « Nettoyer »kubectl delete deployment nginx webkubectl delete svc nginx web-lbOutils intégrés
Section intitulée « Outils intégrés »K3s embarque plusieurs outils accessibles via le binaire.
sudo k3s kubectl get pods -A# Équivalent à kubectl avec le kubeconfig K3scrictl (runtime)
Section intitulée « crictl (runtime) »# Lister les imagessudo k3s crictl images
# Lister les conteneurssudo k3s crictl ps
# Logs d'un conteneursudo k3s crictl logs CONTAINER_IDctr (containerd)
Section intitulée « ctr (containerd) »# Lister les images dans le namespace k8s.iosudo k3s ctr -n k8s.io images listcheck-config
Section intitulée « check-config »Vérifier que le système supporte K3s :
sudo k3s check-configDépannage
Section intitulée « Dépannage »Commandes de diagnostic
Section intitulée « Commandes de diagnostic »# Status du servicesudo systemctl status k3ssudo journalctl -u k3s -f # Logs en temps réel
# État du clustersudo k3s kubectl get nodes -o widesudo k3s kubectl get pods -A
# Événements récentssudo k3s kubectl get events --sort-by='.lastTimestamp' -A
# Vérifier les composants systèmesudo k3s kubectl get pods -n kube-systemProblèmes courants
Section intitulée « Problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
connection refused :6443 | K3s pas démarré | sudo systemctl start k3s |
| Agent ne rejoint pas | Token invalide/expiré | Vérifier le token, l'IP et le port 6443 |
Pods en Pending | Pas de node schedulable | Vérifier les taints/tolerations |
| DNS ne résout pas | CoreDNS pas ready | kubectl rollout restart deployment/coredns -n kube-system |
ImagePullBackOff | Registry inaccessible | Vérifier registries.yaml |
| Certificat expiré | TLS-SAN manquant | Regénérer avec --tls-san |
Redémarrer ou arrêter K3s
Section intitulée « Redémarrer ou arrêter K3s »K3s tourne comme un service systemd, installé sous le nom k3s sur un serveur et k3s-agent sur un agent. Redémarrer le service relit la configuration (config.yaml) sans toucher à vos manifestes ni aux données du cluster :
# Sur un serveursudo systemctl restart k3s
# Sur un agentsudo systemctl restart k3s-agent
# Suivre le démarrage et repérer une erreur de configurationsudo journalctl -u k3s -fQuand le service refuse de s'arrêter, ou que des conteneurs restent accrochés après un stop, le script k3s-killall.sh fait le ménage : il arrête K3s, tue tous les conteneurs qu'il gérait et nettoie les règles réseau. Il ne désinstalle rien et ne supprime aucune donnée, le cluster repart tel quel au prochain démarrage.
sudo /usr/local/bin/k3s-killall.shsudo systemctl start k3sRéinitialiser K3s
Section intitulée « Réinitialiser K3s »# Désinstallation complète (server)sudo /usr/local/bin/k3s-uninstall.sh
# Désinstallation complète (agent)sudo /usr/local/bin/k3s-agent-uninstall.sh
# Réinstaller (script téléchargé puis exécuté)curl -sfL https://get.k3s.io -o k3s-install.shsh k3s-install.shSauvegarder etcd (cluster HA)
Section intitulée « Sauvegarder etcd (cluster HA) »# Snapshot manuelsudo k3s etcd-snapshot save --name backup-$(date +%Y%m%d)
# Lister les snapshotssudo k3s etcd-snapshot list
# Restaurer (arrêter K3s d'abord)sudo systemctl stop k3ssudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshotBonnes pratiques
Section intitulée « Bonnes pratiques »Sécurité
Section intitulée « Sécurité »- Ne jamais exposer le port 6443 sur Internet sans authentification
- Rotation des tokens : regénérer périodiquement le node-token
- Network policies : restreindre le trafic inter-pods
- RBAC : créer des ServiceAccounts dédiés, pas de cluster-admin
Production
Section intitulée « Production »- 3 serveurs minimum pour la HA (etcd nécessite un quorum)
- Load balancer devant les API servers
- Monitoring : Prometheus + Grafana
- Sauvegardes etcd automatisées (cron)
- TLS-SAN : inclure toutes les IPs/DNS possibles
Ressources
Section intitulée « Ressources »- Définir les requests/limits sur tous les pods
- Surveiller avec
kubectl top nodesetkubectl top pods - Éviter les serveurs surchargés : séparer control plane et workloads si possible
À retenir
Section intitulée « À retenir »- K3s = Kubernetes complet dans un binaire de ~70 MB, idéal pour edge/IoT/homelab
- Installation par script officiel téléchargé puis inspecté (
curl -sfL https://get.k3s.io -o k3s-install.sh) - config.yaml pour personnaliser :
--disable,--tls-san, options kubelet - registries.yaml pour les registries privés et miroirs
- HA native avec
--cluster-init(etcd intégré, 3+ serveurs) - Outils intégrés :
k3s kubectl,k3s crictl,k3s check-config - Désactiver les add-ons inutiles : Traefik, ServiceLB, local-path
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources
Section intitulée « Ressources »- Documentation officielle : docs.k3s.io
- Releases GitHub : github.com/k3s-io/k3s/releases
- Rancher (SUSE) : rancher.com/docs/k3s