Aller au contenu
Conteneurs & Orchestration medium

Créer votre premier cluster Kubernetes local avec k3d ou Kind

20 min de lecture

logo kubernetes

Avec k3d ou Kind, vous pouvez créer un cluster Kubernetes local en quelques commandes sur votre poste. Ces outils sont parfaits pour apprendre, tester des manifests et faire des labs sans coût cloud. Dans ce guide, vous allez installer l'outil, créer un cluster, vérifier qu'il fonctionne, puis apprendre à le supprimer ou le recréer proprement.

  • Choisir entre k3d et Kind selon vos besoins
  • Installer l'outil de création de clusters
  • Créer un cluster Kubernetes fonctionnel
  • Vérifier que le cluster est opérationnel
  • Gérer le cycle de vie (stop, start, delete)

Avant de déployer en production, vous avez besoin d'un environnement pour apprendre et tester. Un cluster local offre plusieurs avantages :

AvantageDescription
GratuitPas de coûts cloud
RapideCréation en moins de 2 minutes
JetableSupprimez et recréez à volonté
IdentiqueMêmes commandes qu'en production

Les deux outils créent des clusters Kubernetes dans Docker, mais avec des philosophies différentes.

k3d est un wrapper autour de k3s, une distribution Kubernetes légère. Il crée des conteneurs Docker qui exécutent k3s.

Kind (Kubernetes IN Docker) a été conçu principalement pour tester Kubernetes lui-même. Il crée des conteneurs Docker qui exécutent un Kubernetes vanilla, souvent utilisé en CI.

Critèrek3dKind
Distributionk3s (léger)Kubernetes vanilla
DémarrageGénéralement plus rapidePlus lent au premier lancement
RessourcesPlus léger en généralPlus gourmand
Point d'entrée réseauConteneur load balancer inclusNécessite MetalLB pour un LB
Cas d'usage principalDéveloppement local, labsTests de conformité, CI

Ce tableau se lit par la ligne qui décrit votre situation, pas par la colonne de l'outil. Rien ne vous engage : les deux outils cohabitent sans conflit sur le même poste, chacun gérant ses propres conteneurs et son propre contexte kubectl. Si vous hésitez, commencez par celui de la ligne qui correspond à votre objectif du moment, vous installerez l'autre le jour où le besoin apparaîtra.

Vous voulez…Outil conseillé
Démarrer vite sur un poste modestek3d
Un environnement Kubernetes standard de testKind
Un cluster multi-nœuds légerk3d
Faire de la CI de validation KubernetesKind ou k3d
Apprendre Kubernetes en localk3d (recommandé)

Avant de commencer, vous avez besoin de :

  • Docker installé et fonctionnel (docker ps doit fonctionner)
  • kubectl installé (guide d'installation)
  • ~2 Go de RAM disponible

Vérifiez que Docker fonctionne :

Vérifier Docker
docker ps

Si la commande retourne une liste (même vide), Docker est prêt.

Les deux outils s'installent de la même façon : un binaire à déposer dans votre PATH, aucune configuration, aucun service à démarrer. Choisissez l'onglet de l'outil retenu, vous n'avez pas besoin d'installer les deux pour suivre la suite du guide.

k3d se distribue sous la forme d'un binaire unique, sans dépendance. Le projet publie à côté de chaque version un fichier checksums.txt : télécharger le binaire, comparer son empreinte à celle publiée, puis l'installer garantit que vous exécutez bien ce que le projet a produit. Le chemin _dist/ présent dans le fichier de sommes doit être retiré pour que sha256sum retrouve le fichier local, d'où le sed de la commande.

Installer k3d avec vérification d'empreinte
K3D_VERSION=v5.8.3
BASE="https://github.com/k3d-io/k3d/releases/download/${K3D_VERSION}"
curl -sSLO "${BASE}/k3d-linux-amd64"
curl -sSL "${BASE}/checksums.txt" \
| grep '_dist/k3d-linux-amd64$' \
| sed 's#_dist/##' \
| sha256sum --check -
sudo install -m 0755 k3d-linux-amd64 /usr/local/bin/k3d

La vérification doit afficher k3d-linux-amd64: OK. Si elle affiche FAILED, supprimez le fichier téléchargé et recommencez, ne l'installez pas.

Vérifiez l'installation :

Vérifier la version
k3d version
Exemple de résultat (versions testées)
k3d version v5.8.3
k3s version v1.31.5-k3s1 (default)

La création télécharge une image de conteneur au premier lancement, comptez quelques centaines de mégaoctets et une connexion réseau active. Un point commun aux deux outils : à la fin de la commande, votre kubectl pointe automatiquement sur le nouveau cluster, sans aucune manipulation de kubeconfig de votre part.

Une seule commande suffit, et le nom que vous donnez (monapp) sert de préfixe à tout ce qui sera créé : réseau Docker, conteneurs, contexte kubectl. Les chiffres entre crochets dans la sortie sont le temps écoulé en secondes depuis le début, ils permettent de voir quelle étape prend du temps. Sur un poste où les images sont déjà présentes, le total tourne autour de la dizaine de secondes.

Créer le cluster
k3d cluster create monapp
Résultat
INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-monapp'
INFO[0000] Created image volume k3d-monapp-images
INFO[0001] Creating node 'k3d-monapp-server-0'
INFO[0001] Creating LoadBalancer 'k3d-monapp-serverlb'
INFO[0001] Starting cluster 'monapp'
INFO[0004] Starting node 'k3d-monapp-server-0'
INFO[0004] Starting helpers...
INFO[0012] Cluster 'monapp' created successfully!
INFO[0012] You can now use it like this:
kubectl cluster-info

La dernière ligne n'est pas une commande exécutée automatiquement : c'est une suggestion. Le contexte kubectl est en revanche déjà basculé sur ce nouveau cluster, vérifiez-le à l'étape suivante avant de lancer quoi que ce soit.

Comprendre ce qui vient d'être créé aide à démystifier Kubernetes.

Rien de tout cela n'est magique : chaque élément du tableau est un objet Docker que vous pouvez lister, inspecter ou supprimer à la main. La conséquence pratique est importante pour la suite : un cluster k3d ne survit pas à la suppression de ses conteneurs. Si vous faites le ménage dans Docker avec un docker system prune, vous détruisez le cluster sans passer par k3d.

Élément crééDescription
Conteneur serveurUn conteneur Docker (k3d-monapp-server-0) qui exécute k3s avec le rôle control plane
Conteneur load balancerUn point d'entrée (k3d-monapp-serverlb) pour simplifier l'exposition des ports locaux
Réseau DockerUn réseau k3d-monapp pour la communication entre conteneurs
Volume d'imagesUn volume Docker pour stocker les images de conteneurs du cluster
Contexte kubectlConfiguré automatiquement pour pointer vers ce cluster
Voir les conteneurs créés
docker ps --filter "name=k3d-monapp"

Une fois le cluster créé, vérifiez qu'il est opérationnel :

  1. Vérifiez le contexte kubectl

    Fenêtre de terminal
    kubectl config current-context
    Résultat k3d
    k3d-monapp
  2. Affichez les informations du cluster

    Fenêtre de terminal
    kubectl cluster-info
    Résultat
    Kubernetes control plane is running at https://0.0.0.0:37625
    CoreDNS is running at https://0.0.0.0:37625/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    Metrics-server is running at https://0.0.0.0:37625/api/v1/namespaces/kube-system/services/https:metrics-server:https/proxy

    Le numéro de port est tiré au hasard à la création du cluster, le vôtre sera différent. Ce qui compte est que la commande réponde : si elle affiche The connection to the server ... was refused, le cluster n'est pas démarré ou le contexte pointe ailleurs.

  3. Listez les nœuds

    Fenêtre de terminal
    kubectl get nodes
    Résultat
    NAME STATUS ROLES AGE VERSION
    k3d-monapp-server-0 Ready control-plane,master 1m v1.31.5+k3s1
  4. Vérifiez les pods du cluster

    Voir tous les pods dans tous les namespaces
    kubectl get pods -A

    Cette commande montre que Kubernetes tourne déjà avec ses propres composants (DNS, proxy réseau, etc.) répartis dans plusieurs namespaces :

    Exemple de résultat (k3d)
    NAMESPACE NAME READY STATUS RESTARTS AGE
    kube-system coredns-ccb96694c-6qgn6 1/1 Running 0 26s
    kube-system helm-install-traefik-crd-cnrn6 0/1 Completed 0 26s
    kube-system helm-install-traefik-v927w 0/1 Completed 1 26s
    kube-system local-path-provisioner-5cf85fd84d-ls4xz 1/1 Running 0 26s
    kube-system metrics-server-5985cbc9d7-b8zvp 1/1 Running 0 26s
    kube-system svclb-traefik-6319d9ca-5x5hq 2/2 Running 0 8s
    kube-system traefik-5d45fc8cc9-q58sx 1/1 Running 0 8s

    Tous les pods doivent être en Running ou Completed. Les deux lignes helm-install-traefik sont des jobs d'installation : ils tournent une fois, installent l'Ingress Controller livré avec k3s, puis passent en Completed avec 0/1 prêt. C'est le comportement normal d'un job terminé, pas un échec. Le suffixe aléatoire des noms de pods sera différent chez vous.

Chaque outil ne connaît que ses propres clusters : k3d cluster list ignore un cluster Kind, et inversement. La sortie de k3d indique en plus le rapport nœuds démarrés sur nœuds attendus (1/1), ce qui permet de repérer d'un coup d'oeil un cluster partiellement arrêté.

Fenêtre de terminal
k3d cluster list
Résultat
NAME SERVERS AGENTS LOADBALANCER
monapp 1/1 0/0 true

Arrêter un cluster stoppe ses conteneurs sans détruire leur contenu : vos déploiements, vos ConfigMaps et vos volumes sont toujours là au redémarrage. C'est le geste à faire en fin de journée sur un poste où plusieurs clusters cohabitent, chacun consommant de la mémoire en permanence.

Arrêter
k3d cluster stop monapp
Redémarrer
k3d cluster start monapp

La suppression est définitive et ne demande aucune confirmation. Tout ce qui vivait dans le cluster disparaît, y compris les données stockées dans les volumes. Sur un cluster d'apprentissage c'est sans conséquence, mais prenez l'habitude de vérifier le nom : k3d cluster delete accepte n'importe quel cluster existant sans vous demander si c'est bien celui-là.

Fenêtre de terminal
k3d cluster delete monapp
Résultat
INFO[0000] Deleting cluster 'monapp'
INFO[0001] Deleting cluster network 'k3d-monapp'
INFO[0001] Deleting 1 attached volumes...
INFO[0001] Removing cluster details from default kubeconfig...
INFO[0001] Removing standalone kubeconfig file (if there is one)...
INFO[0001] Successfully deleted cluster monapp!

La suppression :

  • Arrête tous les conteneurs Docker du cluster
  • Supprime le réseau Docker associé
  • Retire le contexte de kubectl

Ce que vous n'avez pas besoin de comprendre tout de suite

Section intitulée « Ce que vous n'avez pas besoin de comprendre tout de suite »

Pour utiliser un cluster local, vous n'avez pas besoin de maîtriser :

ConceptPourquoi l'ignorer pour l'instant
etcdLa base de données interne de Kubernetes, gérée automatiquement
CNILe plugin réseau, préconfiguré par k3d/Kind
CSILe stockage, un stockage local est inclus
SchedulerLe composant qui place les pods, fonctionne tout seul
Admission controllersDes contrôles avancés, pas utiles pour débuter

Pour le moment, vous avez juste besoin d'un cluster qui répond à kubectl.

Un cluster à un seul nœud suffit pour déployer une application, mais il masque tout ce qui relève de la répartition : le scheduler n'a pas de choix à faire, les contraintes de placement n'ont aucun effet visible, et une panne de nœud ne peut pas être simulée. Ajouter deux workers change cela sans coûter beaucoup de mémoire, chaque nœud n'étant qu'un conteneur supplémentaire.

Cluster avec 1 server et 2 agents
k3d cluster create demo --servers 1 --agents 2
OptionSignification
--servers 11 nœud control plane
--agents 22 nœuds workers
Vérifier
kubectl get nodes

kubectl ne parle qu'à un seul cluster à la fois, celui désigné par le contexte courant. Créer un nouveau cluster bascule automatiquement ce contexte, ce qui explique la mésaventure classique : vous déployez sur le dernier cluster créé en croyant travailler sur le précédent. Prenez le réflexe de vérifier avant chaque session.

Lister les contextes
kubectl config get-contexts
Changer de contexte
kubectl config use-context k3d-monapp
Résultat
Switched to context "k3d-monapp".

Les trois causes ci-dessous se situent toutes en dehors de Kubernetes : le démon Docker, les ports de l'hôte, la mémoire disponible. Avant de chercher du côté du cluster, exécutez docker ps : si cette commande échoue, aucune des étapes de ce guide ne peut fonctionner.

SymptômeCause probableSolution
"Cannot connect to Docker"Docker non démarréVérifiez que Docker Desktop ou le service Docker est démarré selon votre système
"Port already in use"Le port d'API choisi est occupéArrêtez l'autre service ou utilisez --api-port pour changer de port
"Insufficient memory"Pas assez de RAMLibérez de la mémoire ou réduisez le nombre de nœuds

Le fichier ~/.kube/config peut avoir été écrasé, par exemple par un outil cloud qui le régénère, ou par une copie manuelle. Commencez par lister les contextes connus : si celui de votre cluster a disparu, kubectl ne saura pas où se connecter même si les conteneurs tournent toujours.

Vérifier les contextes disponibles
kubectl config get-contexts

Si le contexte n'apparaît pas, la solution la plus simple est de recréer le cluster :

Recréer proprement
k3d cluster delete monapp
k3d cluster create monapp

Un pod en Pending n'a pas encore été placé sur un nœud : le problème est en amont du conteneur, donc kubectl logs ne renvoie rien d'utile. Les événements sont la bonne source, ils indiquent explicitement pourquoi le scheduler n'a trouvé aucun nœud acceptable.

Voir les événements récents
kubectl get events -A --sort-by='.lastTimestamp' | head -20

Cause fréquente : ressources insuffisantes. Solution : arrêtez d'autres applications gourmandes ou réduisez le nombre de nœuds du cluster.

Une différence de vocabulaire mérite d'être notée avant de passer d'un outil à l'autre : k3d place systématiquement le nom du cluster en argument positionnel, Kind attend l'option --name. Oublier ce détail avec Kind agit sur le cluster par défaut, appelé kind, et non sur le vôtre.

Actionk3dKind
Créerk3d cluster create nomkind create cluster --name nom
Listerk3d cluster listkind get clusters
Arrêterk3d cluster stop nomNon supporté
Démarrerk3d cluster start nomNon supporté
Supprimerk3d cluster delete nomkind delete cluster --name nom
  1. k3d et Kind créent des clusters locaux pour apprendre, tester et faire de la CI, pas pour la production
  2. k3d est recommandé pour débuter : plus léger, plus rapide, inclut un point d'entrée réseau
  3. Kind est utile pour les tests de conformité et la CI sur un Kubernetes vanilla
  4. Un cluster local est jetable : si vous le cassez, supprimez-le et recréez-le
  5. kubectl est configuré automatiquement après la création du cluster
  6. kubectl get pods -A montre tous les pods dans tous les namespaces, utile pour vérifier l'état du cluster
  7. Arrêter vs supprimer : arrêter préserve vos déploiements (k3d seulement), supprimer libère tout
  • Architecture Kubernetes : Ce que contiennent réellement les conteneurs que k3d ou Kind viennent de démarrer.
  • Les Pods : La première ressource à créer sur le cluster que vous venez d'obtenir.
  • Contrôle des connaissances : Vérifier que les fondamentaux sont acquis avant d'attaquer les ressources Kubernetes.

Ce site vous est utile ?

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

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn