
k0s vous permet de déployer un cluster Kubernetes certifié CNCF en quelques minutes. Un seul binaire, zéro dépendance externe, et un plan de contrôle isolé des workloads par défaut. Ce guide vous accompagne du premier nœud jusqu’à un cluster multi-nœuds prêt à être étendu vers de la haute disponibilité.
Prérequis : 1 à N serveurs Linux (Ubuntu 22.04+), accès SSH avec clé, et kubectl installé sur votre poste.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre l’architecture k0s : contrôleur isolé, binaire unique, par défaut pas de kubelet sur le control plane
- Déployer un cluster avec k0sctl (1 contrôleur + 2 workers)
- Configurer le réseau : kube-router, Calico ou CNI personnalisé
- Gérer le cycle de vie : ajout/retrait de nœuds, mises à jour, sauvegarde/restauration
- Diagnostiquer les problèmes courants : logs, statuts, connectivité
k0s vs autres solutions
Section intitulée « k0s vs autres solutions »Avant de choisir k0s, comparez avec les autres options :
| Critère | k0s | k3s | kubeadm | Kubespray | RKE2 |
|---|---|---|---|---|---|
| Type | Distribution | Distribution | Bootstrap tool | Playbooks Ansible | Distribution |
| Orientation | Edge, prod, CI | Edge, IoT, dev | Standard upstream | Prod, multi-cloud | Enterprise, sécurité |
| Installation | k0sctl (YAML) | Script unique | Commandes | Ansible | Script |
| CNI défaut | kube-router | Flannel | Aucun | Configurable | Canal |
| HA native | ✅ Multi-controller | ✅ Multi-server | Manuel | ✅ Ansible | ✅ Intégrée |
| Profil CIS | Manuel | Manuel | Manuel | Selon config | ✅ Intégré |
| Cas d’usage | Edge, CI/CD, prod | Edge, IoT, dev | Bare metal, formation | Prod automatisée | Conformité, prod |
Architecture k0s
Section intitulée « Architecture k0s »k0s adopte une philosophie différente des autres distributions : le control plane est 100% isolé.
Ce que k0s intègre dans son binaire unique
Section intitulée « Ce que k0s intègre dans son binaire unique »| Composant | Rôle |
|---|---|
| kube-apiserver | API Kubernetes |
| kube-controller-manager | Gestion des contrôleurs |
| kube-scheduler | Placement des pods |
| etcd | Base de données clé/valeur |
| kube-router | CNI par défaut (ou Calico) |
| containerd | Runtime de conteneurs |
| CoreDNS | DNS interne du cluster |
| konnectivity-server | Tunneling control plane ↔ workers |
Contrôleur vs Worker
Section intitulée « Contrôleur vs Worker »Installation de k0sctl
Section intitulée « Installation de k0sctl »k0sctl est l’outil CLI officiel pour déployer et gérer les clusters k0s. Il se connecte en SSH aux nœuds et automatise l’installation.
# Télécharger k0sctlcurl -sSLf https://github.com/k0sproject/k0sctl/releases/download/v0.19.4/k0sctl-linux-amd64 \ -o /usr/local/bin/k0sctl
# Rendre exécutablechmod +x /usr/local/bin/k0sctl
# Vérifier l'installationk0sctl version# Avec Homebrewbrew install k0sproject/tap/k0sctl
# Vérifier l'installationk0sctl version# Télécharger depuis GitHub Releases# https://github.com/k0sproject/k0sctl/releases
# Ou avec Scoopscoop bucket add k0sproject https://github.com/k0sproject/scoop-k0s.gitscoop install k0sctlVérification :
k0sctl version# k0sctl v0.19.4Préparer les serveurs
Section intitulée « Préparer les serveurs »Avant de déployer, préparez vos serveurs Linux.
Configuration minimale
Section intitulée « Configuration minimale »| Rôle | RAM min | CPU | Disque |
|---|---|---|---|
| Controller | 1 Go | 1 vCPU | 20 Go |
| Worker | 1 Go | 1 vCPU | 20 Go |
Prérequis sur chaque serveur
Section intitulée « Prérequis sur chaque serveur »-
Système d’exploitation supporté
Ubuntu 22.04+, Debian 11+, Rocky Linux 8+, ou Amazon Linux 2.
-
Accès SSH avec clé
Fenêtre de terminal # Depuis votre poste de travailssh-copy-id user@ip-du-serveur -
Utilisateur avec sudo sans mot de passe
Fenêtre de terminal # Sur le serveurecho "kube ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/kube -
Ports ouverts
Port Usage Direction 22 SSH k0sctl → tous les nœuds 6443 API Kubernetes workers → controller 8132 Konnectivity workers → controller 9443 Controller join controllers → controller 10250 Kubelet controller → workers Le CNI ajoute ses propres ports (ex: 8472/UDP pour VXLAN). Consultez la documentation de votre CNI.
Premier déploiement avec k0sctl
Section intitulée « Premier déploiement avec k0sctl »Créer le fichier k0sctl.yaml
Section intitulée « Créer le fichier k0sctl.yaml »k0sctl utilise un fichier YAML déclaratif pour définir le cluster :
apiVersion: k0sctl.k0sproject.io/v1beta1kind: Clustermetadata: name: mon-cluster-k0sspec: hosts: # Controller (control plane) - ssh: address: 192.168.122.10 user: kube port: 22 keyPath: ~/.ssh/id_ed25519 role: controller
# Worker 1 - ssh: address: 192.168.122.20 user: kube port: 22 keyPath: ~/.ssh/id_ed25519 role: worker
# Worker 2 - ssh: address: 192.168.122.21 user: kube port: 22 keyPath: ~/.ssh/id_ed25519 role: worker
k0s: version: v1.35.2+k0s.0 config: apiVersion: k0s.k0sproject.io/v1beta1 kind: ClusterConfig metadata: name: mon-cluster spec: api: address: 192.168.122.10 sans: - 192.168.122.10 network: provider: kuberouter # ou "calico" podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12Déployer le cluster
Section intitulée « Déployer le cluster »# Appliquer la configurationk0sctl apply --config k0sctl.yamlSortie attendue :
⣿⣿ ...INFO ==> Running phase: Connect to hostsINFO [ssh] 192.168.122.10:22: connectedINFO [ssh] 192.168.122.20:22: connectedINFO [ssh] 192.168.122.21:22: connectedINFO ==> Running phase: Detect host operating systemsINFO [ssh] 192.168.122.10:22: is running Ubuntu 24.04.3 LTS...INFO ==> Running phase: Initialize the k0s clusterINFO [ssh] 192.168.122.10:22: installing k0s controllerINFO [ssh] 192.168.122.10:22: waiting for kubernetes api to respondINFO ==> Running phase: Install workers...INFO ==> Finished in 1m5sINFO k0s cluster version v1.35.2+k0s.0 is now installedRécupérer le kubeconfig
Section intitulée « Récupérer le kubeconfig »# Exporter le kubeconfigk0sctl kubeconfig --config k0sctl.yaml > kubeconfig
# Utiliser le clusterexport KUBECONFIG=$PWD/kubeconfigkubectl get nodes -o wideSortie attendue :
NAME STATUS ROLES AGE VERSION INTERNAL-IPk0s-worker1 Ready <none> 37s v1.35.2+k0s 192.168.122.20k0s-worker2 Ready <none> 37s v1.35.2+k0s 192.168.122.21Vérifier les composants système
Section intitulée « Vérifier les composants système »# Pods systèmekubectl get pods -n kube-systemVous devriez voir au minimum :
- CoreDNS : résolution DNS interne du cluster
- konnectivity-agent : tunnel entre workers et control plane
- kube-proxy : règles iptables pour les Services
- Pods CNI : kube-router (défaut) ou Calico selon votre configuration
La présence de Metrics Server dépend de votre configuration (voir section “Configuration avancée”).
Test de déploiement :
# Créer un pod de testkubectl run nginx-test --image=nginx:alpine --restart=Never
# Vérifier qu'il tournekubectl get pod nginx-test -o wide
# Tester la connectivitékubectl exec nginx-test -- wget -qO- http://localhost
# Nettoyerkubectl delete pod nginx-testConfiguration avancée
Section intitulée « Configuration avancée »Choisir le CNI (réseau)
Section intitulée « Choisir le CNI (réseau) »k0s supporte trois options de CNI :
| CNI | Configuration | Cas d’usage |
|---|---|---|
| kube-router | provider: kuberouter | Par défaut, léger, performant |
| Calico | provider: calico | Network policies avancées, BGP |
| Custom | provider: custom | Cilium, Weave, Flannel… |
Exemple avec Calico :
spec: k0s: config: spec: network: provider: calico calico: mode: vxlan # ou "ipip", "bird"Configurer le storage
Section intitulée « Configurer le storage »Ce guide ne configure pas de StorageClass. k0s supporte le standard CSI, ce qui permet d’installer n’importe quel provisioner selon votre environnement :
# Exemple : local-path-provisioner (pour le développement)kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yamlAjouter un nœud worker
Section intitulée « Ajouter un nœud worker »-
Éditer k0sctl.yaml
Ajoutez le nouveau worker dans la section
hosts:- ssh:address: 192.168.122.22user: kubekeyPath: ~/.ssh/id_ed25519role: worker -
Appliquer la modification
Fenêtre de terminal k0sctl apply --config k0sctl.yamlk0sctl détecte automatiquement le nouveau nœud et l’ajoute au cluster.
-
Vérifier
Fenêtre de terminal kubectl get nodes# Le nouveau worker apparaît en quelques secondes
Retirer un nœud worker
Section intitulée « Retirer un nœud worker »Cette procédure concerne un worker. Pour retirer un contrôleur en cluster HA, consultez la documentation officielle sur le quorum etcd.
-
Drainer le nœud
Fenêtre de terminal kubectl drain k0s-worker2 --ignore-daemonsets --delete-emptydir-data -
Supprimer de k0sctl.yaml
Retirez l’entrée du worker de la section
hosts. -
Appliquer
Fenêtre de terminal k0sctl apply --config k0sctl.yaml -
Nettoyer sur le serveur (optionnel)
Fenêtre de terminal ssh kube@192.168.122.21 "sudo k0s reset"
Mettre à jour le cluster
Section intitulée « Mettre à jour le cluster »k0sctl gère les mises à jour in-place :
-
Modifier la version dans k0sctl.yaml
spec:k0s:version: v1.35.3+k0s.0 # Nouvelle version -
Appliquer la mise à jour
Fenêtre de terminal k0sctl apply --config k0sctl.yamlk0sctl met à jour les nœuds un par un (rolling update).
Sauvegarde et restauration
Section intitulée « Sauvegarde et restauration »Sauvegarder etcd
Section intitulée « Sauvegarder etcd »# Sur le controllerssh kube@192.168.122.10 "sudo k0s backup --save-path /tmp/k0s-backup.tar.gz"
# Récupérer le backupscp kube@192.168.122.10:/tmp/k0s-backup.tar.gz .Restaurer depuis un backup
Section intitulée « Restaurer depuis un backup »Pour un cluster simple (1 controller) :
# Sur le controllersudo k0s stopsudo k0s restore /path/to/k0s-backup.tar.gzsudo k0s startDépannage
Section intitulée « Dépannage »Problèmes courants
Section intitulée « Problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
connection refused sur 6443 | k0s controller pas démarré | ssh controller "sudo k0s status" |
| Worker ne rejoint pas | Token expiré ou port bloqué | Vérifier firewall, régénérer token |
Pods en Pending | Pas de worker disponible | kubectl get nodes, ajouter un worker |
CoreDNS en CrashLoop | Réseau CNI pas prêt | kubectl logs -n kube-system coredns-xxx |
k0sctl apply timeout | SSH lent ou serveur surchargé | Augmenter timeout : --request-timeout 10m |
Commandes de diagnostic
Section intitulée « Commandes de diagnostic »# État du cluster (depuis le controller)ssh kube@192.168.122.10 "sudo k0s status"
# Identifier les unités systemd k0sssh kube@192.168.122.10 "systemctl list-units | grep k0s"
# Logs du controller (nom d'unité à adapter selon votre installation)ssh kube@192.168.122.10 "sudo journalctl -u 'k0s*' -f"
# État de etcdssh kube@192.168.122.10 "sudo k0s etcd member-list"
# Vérifier la connectivité APIcurl -k https://192.168.122.10:6443/healthzReset complet d’un nœud
Section intitulée « Reset complet d’un nœud »Si un nœud est dans un état incohérent :
ssh kube@192.168.122.20 "sudo k0s stop && sudo k0s reset && sudo reboot"Puis relancez k0sctl apply.
Aperçu de la haute disponibilité (HA)
Section intitulée « Aperçu de la haute disponibilité (HA) »k0s supporte la haute disponibilité avec plusieurs controllers. Voici un aperçu — la mise en œuvre complète dépasse le cadre de ce guide.
Principes
Section intitulée « Principes »- Minimum 3 controllers pour le quorum etcd (2n+1)
- Load balancer devant les controllers sur le port 6443
- externalAddress dans la config k0s pointe vers le load balancer
spec: hosts: - ssh: address: 192.168.122.10 role: controller - ssh: address: 192.168.122.11 role: controller - ssh: address: 192.168.122.12 role: controller # ... workers
k0s: config: spec: api: externalAddress: 192.168.122.100 # IP du load balancerOptions de load balancing
Section intitulée « Options de load balancing »k0s propose plusieurs approches :
| Option | Description |
|---|---|
| Load balancer externe | HAProxy, keepalived, cloud LB |
| NLLB (Node-local LB) | Load balancing côté workers |
| CPLB | Control Plane Load Balancing intégré |
Consultez la documentation HA officielle pour une mise en œuvre complète.
À retenir
Section intitulée « À retenir »- k0s = binaire unique : tout Kubernetes intégré (apiserver, etcd, containerd, CNI)
- Control plane isolé par défaut : pas de kubelet ni runtime sur le controller (sauf mode
--enable-worker) - k0sctl : outil déclaratif pour déployer/gérer via SSH
- Un fichier, un cluster :
k0sctl.yamldécrit l’infrastructure complète - Mises à jour simples : changez la version dans le YAML, k0sctl fait le rolling update
- CNI flexible mais définitif : kube-router (défaut), Calico, ou custom — à choisir dès le départ
- Exigences modestes : 1 vCPU / 1 Go RAM comme base minimale recommandée
- Certifié CNCF : 100% compatible avec l’écosystème Kubernetes
Prochaines étapes
Section intitulée « Prochaines étapes »Ressources officielles
Section intitulée « Ressources officielles »- Documentation k0s : docs.k0sproject.io
- GitHub k0s : github.com/k0sproject/k0s
- GitHub k0sctl : github.com/k0sproject/k0sctl
- Releases : github.com/k0sproject/k0s/releases