Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

k0s : déployer un cluster Kubernetes léger et certifié

17 min de lecture

logo kubernetes

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.

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

Avant de choisir k0s, comparez avec les autres options :

Critèrek0sk3skubeadmKubesprayRKE2
TypeDistributionDistributionBootstrap toolPlaybooks AnsibleDistribution
OrientationEdge, prod, CIEdge, IoT, devStandard upstreamProd, multi-cloudEnterprise, sécurité
Installationk0sctl (YAML)Script uniqueCommandesAnsibleScript
CNI défautkube-routerFlannelAucunConfigurableCanal
HA native✅ Multi-controller✅ Multi-serverManuel✅ Ansible✅ Intégrée
Profil CISManuelManuelManuelSelon config✅ Intégré
Cas d’usageEdge, CI/CD, prodEdge, IoT, devBare metal, formationProd automatiséeConformité, prod

k0s adopte une philosophie différente des autres distributions : le control plane est 100% isolé.

ComposantRôle
kube-apiserverAPI Kubernetes
kube-controller-managerGestion des contrôleurs
kube-schedulerPlacement des pods
etcdBase de données clé/valeur
kube-routerCNI par défaut (ou Calico)
containerdRuntime de conteneurs
CoreDNSDNS interne du cluster
konnectivity-serverTunneling control plane ↔ workers

Architecture k0s : Control Plane avec processus supervisés et Workers avec kubelet/containerd

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.

Fenêtre de terminal
# Télécharger k0sctl
curl -sSLf https://github.com/k0sproject/k0sctl/releases/download/v0.19.4/k0sctl-linux-amd64 \
-o /usr/local/bin/k0sctl
# Rendre exécutable
chmod +x /usr/local/bin/k0sctl
# Vérifier l'installation
k0sctl version

Vérification :

Fenêtre de terminal
k0sctl version
# k0sctl v0.19.4

Avant de déployer, préparez vos serveurs Linux.

RôleRAM minCPUDisque
Controller1 Go1 vCPU20 Go
Worker1 Go1 vCPU20 Go
  1. Système d’exploitation supporté

    Ubuntu 22.04+, Debian 11+, Rocky Linux 8+, ou Amazon Linux 2.

  2. Accès SSH avec clé

    Fenêtre de terminal
    # Depuis votre poste de travail
    ssh-copy-id user@ip-du-serveur
  3. Utilisateur avec sudo sans mot de passe

    Fenêtre de terminal
    # Sur le serveur
    echo "kube ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/kube
  4. Ports ouverts

    PortUsageDirection
    22SSHk0sctl → tous les nœuds
    6443API Kubernetesworkers → controller
    8132Konnectivityworkers → controller
    9443Controller joincontrollers → controller
    10250Kubeletcontroller → workers

    Le CNI ajoute ses propres ports (ex: 8472/UDP pour VXLAN). Consultez la documentation de votre CNI.

k0sctl utilise un fichier YAML déclaratif pour définir le cluster :

k0sctl.yaml
apiVersion: k0sctl.k0sproject.io/v1beta1
kind: Cluster
metadata:
name: mon-cluster-k0s
spec:
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/12
Fenêtre de terminal
# Appliquer la configuration
k0sctl apply --config k0sctl.yaml

Sortie attendue :

⣿⣿ ...
INFO ==> Running phase: Connect to hosts
INFO [ssh] 192.168.122.10:22: connected
INFO [ssh] 192.168.122.20:22: connected
INFO [ssh] 192.168.122.21:22: connected
INFO ==> Running phase: Detect host operating systems
INFO [ssh] 192.168.122.10:22: is running Ubuntu 24.04.3 LTS
...
INFO ==> Running phase: Initialize the k0s cluster
INFO [ssh] 192.168.122.10:22: installing k0s controller
INFO [ssh] 192.168.122.10:22: waiting for kubernetes api to respond
INFO ==> Running phase: Install workers
...
INFO ==> Finished in 1m5s
INFO k0s cluster version v1.35.2+k0s.0 is now installed
Fenêtre de terminal
# Exporter le kubeconfig
k0sctl kubeconfig --config k0sctl.yaml > kubeconfig
# Utiliser le cluster
export KUBECONFIG=$PWD/kubeconfig
kubectl get nodes -o wide

Sortie attendue :

NAME STATUS ROLES AGE VERSION INTERNAL-IP
k0s-worker1 Ready <none> 37s v1.35.2+k0s 192.168.122.20
k0s-worker2 Ready <none> 37s v1.35.2+k0s 192.168.122.21
Fenêtre de terminal
# Pods système
kubectl get pods -n kube-system

Vous 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 :

Fenêtre de terminal
# Créer un pod de test
kubectl run nginx-test --image=nginx:alpine --restart=Never
# Vérifier qu'il tourne
kubectl get pod nginx-test -o wide
# Tester la connectivité
kubectl exec nginx-test -- wget -qO- http://localhost
# Nettoyer
kubectl delete pod nginx-test

k0s supporte trois options de CNI :

CNIConfigurationCas d’usage
kube-routerprovider: kuberouterPar défaut, léger, performant
Calicoprovider: calicoNetwork policies avancées, BGP
Customprovider: customCilium, Weave, Flannel…

Exemple avec Calico :

k0sctl.yaml (extrait)
spec:
k0s:
config:
spec:
network:
provider: calico
calico:
mode: vxlan # ou "ipip", "bird"

Ce guide ne configure pas de StorageClass. k0s supporte le standard CSI, ce qui permet d’installer n’importe quel provisioner selon votre environnement :

Fenêtre de terminal
# Exemple : local-path-provisioner (pour le développement)
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
  1. Éditer k0sctl.yaml

    Ajoutez le nouveau worker dans la section hosts :

    - ssh:
    address: 192.168.122.22
    user: kube
    keyPath: ~/.ssh/id_ed25519
    role: worker
  2. Appliquer la modification

    Fenêtre de terminal
    k0sctl apply --config k0sctl.yaml

    k0sctl détecte automatiquement le nouveau nœud et l’ajoute au cluster.

  3. Vérifier

    Fenêtre de terminal
    kubectl get nodes
    # Le nouveau worker apparaît en quelques secondes

Cette procédure concerne un worker. Pour retirer un contrôleur en cluster HA, consultez la documentation officielle sur le quorum etcd.

  1. Drainer le nœud

    Fenêtre de terminal
    kubectl drain k0s-worker2 --ignore-daemonsets --delete-emptydir-data
  2. Supprimer de k0sctl.yaml

    Retirez l’entrée du worker de la section hosts.

  3. Appliquer

    Fenêtre de terminal
    k0sctl apply --config k0sctl.yaml
  4. Nettoyer sur le serveur (optionnel)

    Fenêtre de terminal
    ssh kube@192.168.122.21 "sudo k0s reset"

k0sctl gère les mises à jour in-place :

  1. Modifier la version dans k0sctl.yaml

    spec:
    k0s:
    version: v1.35.3+k0s.0 # Nouvelle version
  2. Appliquer la mise à jour

    Fenêtre de terminal
    k0sctl apply --config k0sctl.yaml

    k0sctl met à jour les nœuds un par un (rolling update).

Fenêtre de terminal
# Sur le controller
ssh kube@192.168.122.10 "sudo k0s backup --save-path /tmp/k0s-backup.tar.gz"
# Récupérer le backup
scp kube@192.168.122.10:/tmp/k0s-backup.tar.gz .

Pour un cluster simple (1 controller) :

Fenêtre de terminal
# Sur le controller
sudo k0s stop
sudo k0s restore /path/to/k0s-backup.tar.gz
sudo k0s start
SymptômeCause probableSolution
connection refused sur 6443k0s controller pas démarréssh controller "sudo k0s status"
Worker ne rejoint pasToken expiré ou port bloquéVérifier firewall, régénérer token
Pods en PendingPas de worker disponiblekubectl get nodes, ajouter un worker
CoreDNS en CrashLoopRéseau CNI pas prêtkubectl logs -n kube-system coredns-xxx
k0sctl apply timeoutSSH lent ou serveur surchargéAugmenter timeout : --request-timeout 10m
Fenêtre de terminal
# État du cluster (depuis le controller)
ssh kube@192.168.122.10 "sudo k0s status"
# Identifier les unités systemd k0s
ssh 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 etcd
ssh kube@192.168.122.10 "sudo k0s etcd member-list"
# Vérifier la connectivité API
curl -k https://192.168.122.10:6443/healthz

Si un nœud est dans un état incohérent :

Fenêtre de terminal
ssh kube@192.168.122.20 "sudo k0s stop && sudo k0s reset && sudo reboot"

Puis relancez k0sctl apply.

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.

  • 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
k0sctl.yaml (HA) — extrait
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 balancer

k0s propose plusieurs approches :

OptionDescription
Load balancer externeHAProxy, keepalived, cloud LB
NLLB (Node-local LB)Load balancing côté workers
CPLBControl Plane Load Balancing intégré

Consultez la documentation HA officielle pour une mise en œuvre complète.

  1. k0s = binaire unique : tout Kubernetes intégré (apiserver, etcd, containerd, CNI)
  2. Control plane isolé par défaut : pas de kubelet ni runtime sur le controller (sauf mode --enable-worker)
  3. k0sctl : outil déclaratif pour déployer/gérer via SSH
  4. Un fichier, un cluster : k0sctl.yaml décrit l’infrastructure complète
  5. Mises à jour simples : changez la version dans le YAML, k0sctl fait le rolling update
  6. CNI flexible mais définitif : kube-router (défaut), Calico, ou custom — à choisir dès le départ
  7. Exigences modestes : 1 vCPU / 1 Go RAM comme base minimale recommandée
  8. Certifié CNCF : 100% compatible avec l’écosystème Kubernetes

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn