Dev Local

kind

Kubernetes in Docker par kubernetes-sigs - clusters multi-nœuds dans conteneurs Docker/Podman, port mapping ingress, registry locale, CI/CD natif. Apache 2.0.

kind (Kubernetes in Docker) est un outil kubernetes-sigs qui crée des clusters Kubernetes en utilisant des conteneurs Docker (ou Podman depuis v0.20) comme nœuds. Chaque nœud est un conteneur, ce qui permet des clusters multi-nœuds, plusieurs clusters en parallèle et un port mapping précis. kind est l'outil de référence pour les pipelines CI/CD - il est utilisé dans les tests end-to-end officiels de Kubernetes lui-même. Les images de nœuds sont versionnées (kindest/node:v1.32.0), garantissant une reproductibilité exacte entre environnements.


Informations essentielles

Origine : Kubernetes SIG Testing  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Kubernetes SIG Testing. Utilisé dans les tests e2e officiels de Kubernetes.

Stack par défaut

ComposantValeur
Runtime requisDocker 20.10+ ou Podman 4.0+ (depuis kind v0.20)
Image nœudkindest/node:v1.32.x (versionnée - pas de :latest)
RéseauBridge Docker dédié (kind)
kubeconfig contextkind-<cluster-name>
Multi-clusterOui, plusieurs clusters simultanés

Prérequis

RessourceValeur
Docker20.10+ (ou Podman 4.0+)
kubectlConfiguré automatiquement via kind get kubeconfig

Installation

# Linux
curl -Lo kind \
  https://github.com/kubernetes-sigs/kind/releases/latest/download/kind-linux-amd64
chmod +x kind && sudo mv kind /usr/local/bin/

# macOS
brew install kind

# Windows (Chocolatey)
choco install kind

kind version

Créer et gérer un cluster

# Cluster minimal (nommé "kind" par défaut)
kind create cluster

# Cluster nommé
kind create cluster --name mycluster

# Cluster avec une version K8s spécifique
kind create cluster --name mycluster --image kindest/node:v1.31.0

# Lister les clusters
kind get clusters

# Supprimer un cluster
kind delete cluster --name mycluster

# Récupérer le kubeconfig
kind get kubeconfig --name mycluster > ~/.kube/kind-mycluster.yaml

# Vérifier le contexte
kubectl cluster-info --context kind-mycluster

Configuration multi-nœuds

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
  - role: worker
kind create cluster --name mycluster --config kind-config.yaml
kubectl get nodes

Port mapping pour Ingress

Pour exposer un Ingress Controller sur les ports 80/443 de la machine hôte :

# kind-ingress.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
    kubeadmConfigPatches:
      - |
        kind: InitConfiguration
        nodeRegistration:
          kubeletExtraArgs:
            node-labels: "ingress-ready=true"
    extraPortMappings:
      - containerPort: 80
        hostPort: 80
        protocol: TCP
      - containerPort: 443
        hostPort: 443
        protocol: TCP
kind create cluster --name ingress-cluster --config kind-ingress.yaml

# Installer NGINX Ingress Controller (build kind officiel)
kubectl apply -f \
  https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

# Attendre que l'ingress controller soit prêt
kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s

Registry locale

# 1. Créer une registry Docker locale
docker run -d --restart=always \
  -p 127.0.0.1:5001:5000 \
  --network bridge \
  --name kind-registry \
  registry:2

# 2. Connecter la registry au réseau kind
docker network connect kind kind-registry

# 3. Déclarer la registry dans le cluster
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:5001"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

# Utilisation
docker build -t localhost:5001/myimage:tag .
docker push localhost:5001/myimage:tag
# Dans les manifests : image: localhost:5001/myimage:tag

Charger des images locales (sans registry)

# Charger une image Docker locale directement dans le cluster
kind load docker-image myimage:tag --name mycluster

# Charger plusieurs images
kind load docker-image image1:tag image2:tag --name mycluster

Mise à jour

# Linux
curl -Lo kind \
  https://github.com/kubernetes-sigs/kind/releases/latest/download/kind-linux-amd64
chmod +x kind && sudo mv kind /usr/local/bin/

# macOS
brew upgrade kind

Troubleshooting

# Logs du nœud control-plane (conteneur Docker)
docker logs mycluster-control-plane

# Entrer dans le nœud
docker exec -it mycluster-control-plane bash

# Images disponibles dans le cluster
docker exec mycluster-control-plane crictl images

# Pods système en erreur
kubectl get pods -n kube-system

# Cluster en erreur au démarrage
# Vérifier que Docker dispose d'assez de mémoire
docker info | grep -E "Memory|CPUs"

# Contexte kubectl incorrect
kubectl config use-context kind-mycluster

# Réinitialiser
kind delete cluster --name mycluster
kind create cluster --name mycluster

Ressources

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic