
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 curl -sfL https://get.k3s.io | 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.34.3+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 | 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 | K3S_URL=https://SERVER_IP:6443 K3S_TOKEN=TOKEN sh -Remplacez :
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 | K3S_URL=https://192.168.1.10:6443 K3S_TOKEN=K10abcd1234::server:xyz789 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.34.3+k3s1# agent1 Ready <none> 2m v1.34.3+k3s1# agent2 Ready <none> 1m v1.34.3+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 | sh -s - 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 | sh -s - 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.
Vé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:3xxxxNettoyer
Section intitulée « Nettoyer »kubectl delete deployment nginxkubectl delete svc nginxOutils 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 |
Ré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éinstallercurl -sfL https://get.k3s.io | sh -Sauvegarder 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 en une ligne :
curl -sfL https://get.k3s.io | 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