Aller au contenu
Conteneurs & Orchestration medium

K3s : Kubernetes léger pour edge, IoT et homelab

24 min de lecture

logo k3s

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
  • 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

Avant de commencer, voici les termes que vous rencontrerez dans ce guide :

TermeExplication simple
ClusterUn groupe de machines (physiques ou virtuelles) qui travaillent ensemble pour faire tourner vos applications
NodeUne 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 planeL’ensemble des composants qui gèrent le cluster (API, scheduler, etc.). Sur K3s, c’est le rôle du “server”
PodLa plus petite unité dans Kubernetes : un ou plusieurs conteneurs qui tournent ensemble
kubeconfigUn fichier qui contient les informations de connexion à votre cluster (adresse, certificats, tokens)
TokenUn mot de passe secret qui permet aux agents de rejoindre le cluster
CritèreK3sMinikubeKind
Cas d’usageEdge / IoT / homelab, prod légèreDev local, apprentissageCI/CD, tests, clusters jetables
DatastoreSQLite (défaut) ; embedded etcd (HA) ; externe possibleetcd (kubeadm), HA stackedetcd (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)
RessourcesAgent ~275 MiB, Server ~1.6 GiB2 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
InstallationBinaire + service (Linux)VM ou conteneur selon driverConteneurs 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

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 :

  1. Un seul binaire /usr/local/bin/k3s est téléchargé
  2. Ce binaire contient Kubernetes + tous les outils annexes
  3. Un service systemd démarre et gère le tout
Architecture K3s : binaire unique avec composants intégrés

Voici ce que K3s installe automatiquement (vous n’avez rien à faire) :

ComposantÇa sert à quoi ?
containerdFait tourner vos conteneurs (comme Docker, mais plus léger)
FlannelCrée le réseau virtuel pour que vos pods communiquent entre eux
CoreDNSPermet à vos pods de se trouver par nom (mon-service.default.svc) au lieu d’IP
kube-proxyRoute le trafic réseau vers les bons pods
metrics-serverCollecte les stats CPU/RAM pour kubectl top
TraefikIngress controller : expose vos apps sur le réseau externe
ServiceLBSimule un load balancer cloud pour les services de type LoadBalancer
local-pathCrée des volumes persistants sur le disque local

Certains composants peuvent être désactivés si vous préférez utiliser des alternatives :

Add-onPourquoi le désactiver ?
TraefikVous préférez Nginx Ingress, Istio, ou gérez l’ingress autrement
ServiceLBVous utilisez MetalLB ou n’avez pas besoin de LoadBalancer
local-pathVous utilisez un stockage réseau (NFS, Longhorn, Ceph)

K3s supporte plusieurs backends pour stocker l’état du cluster :

ModeQuand l’utiliserDescription
SQLite (kine)Mono-serveur (défaut)Simple, fiable, fichier local. Parfait pour apprendre ou un homelab léger
Embedded etcdHA (3+ serveurs)Activé avec --cluster-init. Réplication + quorum entre serveurs
Datastore externeInfra existanteMySQL, PostgreSQL ou etcd externe. Utile si vous avez déjà une DB managée
RôleCPURAMDisque
Server (control plane)2 cœurs2 GB10 GB SSD
Agent (worker)1 cœur512 MB5 GB
  • Linux : Ubuntu 20.04+, Debian 11+, RHEL/Rocky 8+, openSUSE
  • Architecture : amd64, arm64, armhf (Raspberry Pi)
PortProtocoleFonctionRequis pour
6443TCPAPI KubernetesTous (agents, kubectl)
8472UDPFlannel VXLANMulti-node
10250TCPKubelet metricsMonitoring
2379-2380TCPetcdHA (serveurs uniquement)

L’installation la plus simple : un serveur unique qui fait tourner le control plane et les workloads.

  1. Installer K3s avec le script officiel

    Fenêtre de terminal
    curl -sfL https://get.k3s.io | sh -
  2. Vérifier l’installation

    Fenêtre de terminal
    # Vérifier que le service K3s tourne
    sudo systemctl status k3s
    # ● k3s.service - Lightweight Kubernetes
    # Active: active (running) <-- Ce qu'on veut voir
    Fenêtre de terminal
    # Lister les machines du cluster
    sudo k3s kubectl get nodes
    # NAME STATUS ROLES AGE VERSION
    # master1 Ready control-plane 30s v1.34.3+k3s1
  3. Configurer kubectl pour votre utilisateur

    Par défaut, le kubeconfig est lisible uniquement par root. Pour utiliser kubectl sans sudo :

    Fenêtre de terminal
    # Créer le dossier de config kubectl
    mkdir -p ~/.kube
    # Copier le kubeconfig K3s
    sudo 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 sudo
    kubectl get nodes
CheminDescription
/etc/rancher/k3s/k3s.yamlKubeconfig (certificats + token admin)
/etc/rancher/k3s/config.yamlConfiguration K3s (à créer)
/etc/rancher/k3s/registries.yamlConfiguration des registries
/var/lib/rancher/k3s/server/node-tokenToken pour joindre des agents
/var/lib/rancher/k3s/server/db/Base SQLite (datastore)

Au lieu de passer des arguments en ligne de commande, utilisez /etc/rancher/k3s/config.yaml.

/etc/rancher/k3s/config.yaml
# Kubeconfig lisible sans sudo
write-kubeconfig-mode: "0644"
# Désactiver les composants non nécessaires
disable:
- traefik
- servicelb
/etc/rancher/k3s/config.yaml
write-kubeconfig-mode: "0644"
# Désactiver Traefik (utiliser Nginx Ingress à la place)
disable:
- traefik
# Ajouter des SAN pour accès distant
tls-san:
- "k3s.homelab.local"
- "192.168.1.100"
# Limiter les ressources
kubelet-arg:
- "max-pods=50"
/etc/rancher/k3s/config.yaml
write-kubeconfig-mode: "0644"
# Initialiser le cluster HA (premier serveur uniquement)
cluster-init: true
# SAN pour le load balancer
tls-san:
- "k3s-api.example.com"
- "10.0.0.10"
# Désactiver les add-ons par défaut
disable:
- traefik
- servicelb
- local-path-provisioner
# Configurer etcd
etcd-expose-metrics: true
Fenêtre de terminal
# Si K3s est déjà installé, redémarrer le service
sudo systemctl restart k3s
# Vérifier les composants désactivés
sudo k3s kubectl get pods -n kube-system
# Traefik et ServiceLB ne doivent pas apparaître

Un cluster K3s se compose de servers (control plane) et agents (workers).

  1. Sur le premier serveur : installer K3s

    Fenêtre de terminal
    curl -sfL https://get.k3s.io | sh -
  2. 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
  3. 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 -
  4. Vérifier le cluster

    Fenêtre de terminal
    # Sur le serveur
    sudo 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

Par défaut, les agents n’ont pas de rôle affiché. Ajoutez un label :

Fenêtre de terminal
kubectl label node agent1 node-role.kubernetes.io/worker=worker
kubectl label node agent2 node-role.kubernetes.io/worker=worker

Le fichier /etc/rancher/k3s/registries.yaml configure l’accès aux registries de conteneurs.

/etc/rancher/k3s/registries.yaml
mirrors:
docker.io:
endpoint:
- "https://registry.local:5000"
/etc/rancher/k3s/registries.yaml
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: true
/etc/rancher/k3s/registries.yaml
mirrors:
"registry.local:5000":
endpoint:
- "http://registry.local:5000"
configs:
"registry.local:5000":
tls:
insecure_skip_verify: true

K3s supporte deux modes HA :

ModeDescriptionQuand l’utiliser
etcd intégréetcd sur chaque serveur K3sSimplicité, pas de dépendance externe
Base externeMySQL, PostgreSQL, etcd externeInfrastructure existante

Nécessite 3 serveurs minimum (nombre impair pour le quorum).

Architecture K3s HA avec etcd intégré : 3 serveurs avec réplication
  1. Premier serveur : initialiser le cluster

    Fenêtre de terminal
    curl -sfL https://get.k3s.io | sh -s - server \
    --cluster-init \
    --tls-san=lb.example.com

    L’option --cluster-init active etcd intégré.

  2. Récupérer le token

    Fenêtre de terminal
    sudo cat /var/lib/rancher/k3s/server/node-token
  3. 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
  4. 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 etcd
    sudo k3s etcdctl member list

Votre cluster K3s est installé. Voici comment vérifier qu’il fonctionne et déployer votre première application.

Fenêtre de terminal
# 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-system
Fenêtre de terminal
# Créer un déploiement nginx
kubectl create deployment nginx --image=nginx
# Vérifier que le pod tourne
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# nginx-xxx 1/1 Running 0 30s
# Exposer l'application
kubectl 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:3xxxx
Fenêtre de terminal
kubectl delete deployment nginx
kubectl delete svc nginx

K3s embarque plusieurs outils accessibles via le binaire.

Fenêtre de terminal
sudo k3s kubectl get pods -A
# Équivalent à kubectl avec le kubeconfig K3s
Fenêtre de terminal
# Lister les images
sudo k3s crictl images
# Lister les conteneurs
sudo k3s crictl ps
# Logs d'un conteneur
sudo k3s crictl logs CONTAINER_ID
Fenêtre de terminal
# Lister les images dans le namespace k8s.io
sudo k3s ctr -n k8s.io images list

Vérifier que le système supporte K3s :

Fenêtre de terminal
sudo k3s check-config
Fenêtre de terminal
# Status du service
sudo systemctl status k3s
sudo journalctl -u k3s -f # Logs en temps réel
# État du cluster
sudo k3s kubectl get nodes -o wide
sudo k3s kubectl get pods -A
# Événements récents
sudo k3s kubectl get events --sort-by='.lastTimestamp' -A
# Vérifier les composants système
sudo k3s kubectl get pods -n kube-system
SymptômeCause probableSolution
connection refused :6443K3s pas démarrésudo systemctl start k3s
Agent ne rejoint pasToken invalide/expiréVérifier le token, l’IP et le port 6443
Pods en PendingPas de node schedulableVérifier les taints/tolerations
DNS ne résout pasCoreDNS pas readykubectl rollout restart deployment/coredns -n kube-system
ImagePullBackOffRegistry inaccessibleVérifier registries.yaml
Certificat expiréTLS-SAN manquantRegénérer avec --tls-san
Fenêtre de terminal
# 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
curl -sfL https://get.k3s.io | sh -
Fenêtre de terminal
# Snapshot manuel
sudo k3s etcd-snapshot save --name backup-$(date +%Y%m%d)
# Lister les snapshots
sudo k3s etcd-snapshot list
# Restaurer (arrêter K3s d'abord)
sudo systemctl stop k3s
sudo k3s server --cluster-reset --cluster-reset-restore-path=/path/to/snapshot
  • 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
  • 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
  • Définir les requests/limits sur tous les pods
  • Surveiller avec kubectl top nodes et kubectl top pods
  • Éviter les serveurs surchargés : séparer control plane et workloads si possible
  1. K3s = Kubernetes complet dans un binaire de ~70 MB, idéal pour edge/IoT/homelab
  2. Installation en une ligne : curl -sfL https://get.k3s.io | sh -
  3. config.yaml pour personnaliser : --disable, --tls-san, options kubelet
  4. registries.yaml pour les registries privés et miroirs
  5. HA native avec --cluster-init (etcd intégré, 3+ serveurs)
  6. Outils intégrés : k3s kubectl, k3s crictl, k3s check-config
  7. Désactiver les add-ons inutiles : Traefik, ServiceLB, local-path

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.