De Docker Compose à Kubernetes : architecture complète, distributions (K8s, K3s, K0s, MicroK8s), objets fondamentaux, networking, Ingress, scaling automatique et déploiement en production.
Ce chapitre installe un cluster K3s fonctionnel — un nœud master et deux workers — et configure kubectl pour le piloter depuis votre machine locale. À la fin, vous avez un cluster prêt pour les chapitres suivants.
3 VPS minimum (ou 1 pour un single-node) :
# Sur chaque nœud — désactiver le swap (requis par K8s)
swapoff -a
sed -i '/swap/d' /etc/fstab
# Vérifier
free -h
# Swap: 0B# Installation avec options de production
curl -sfL https://get.k3s.io | sh -s - \
--write-kubeconfig-mode 644 \
--disable traefik \
--node-name master-01Options utilisées :
--write-kubeconfig-mode 644 : rend le kubeconfig lisible sans sudo--disable traefik : on installera Ingress NGINX à la place (plus répandu)--node-name : nom lisible du nœud dans le clusterVérifier que K3s tourne :
systemctl status k3s
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master-01 Ready control-plane,master 30s v1.28.5+k3s1Récupérer le token pour joindre les workers :
cat /var/lib/rancher/k3s/server/node-token
# K10abc123...Sur chaque nœud worker :
curl -sfL https://get.k3s.io | K3S_URL=https://MASTER_IP:6443 \
K3S_TOKEN=TOKEN_DU_MASTER \
sh -s - --node-name worker-01Vérifier depuis le master :
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master-01 Ready control-plane,master 5m v1.28.5+k3s1
# worker-01 Ready <none> 30s v1.28.5+k3s1
# worker-02 Ready <none> 25s v1.28.5+k3s1Copier le kubeconfig depuis le master vers votre machine locale :
# Depuis votre machine locale
scp root@MASTER_IP:/etc/rancher/k3s/k3s.yaml ~/.kube/config-k3s
# Éditer l'IP dans le fichier (127.0.0.1 → IP publique du master)
sed -i 's/127.0.0.1/MASTER_IP/g' ~/.kube/config-k3s
# Fusionner avec votre kubeconfig existant (si vous avez d'autres clusters)
export KUBECONFIG=~/.kube/config:~/.kube/config-k3s
kubectl config view --flatten > ~/.kube/config-merged
mv ~/.kube/config-merged ~/.kube/config# Lister les contextes disponibles
kubectl config get-contexts
# CURRENT NAME CLUSTER AUTHINFO NAMESPACE
# * k3s k3s k3s default
# Switcher de contexte
kubectl config use-context k3s
# kubectx (outil tiers, plus pratique)
brew install kubectx
kubectx k3s # switcher
kubens staging # changer de namespace# Nœuds
kubectl get nodes
kubectl get nodes -o wide # avec IP et runtime
kubectl describe node worker-01 # détails complets
# Pods
kubectl get pods # namespace courant
kubectl get pods -A # tous les namespaces
kubectl get pods -n kube-system # namespace spécifique
kubectl get pods -o wide # avec nœud et IP
# Ressources d'un namespace
kubectl get all -n mon-namespace
# Ressources personnalisées
kubectl get crd # Custom Resource Definitions# Détails d'une ressource
kubectl describe pod mon-pod
kubectl describe deployment mon-app
# Logs
kubectl logs mon-pod
kubectl logs mon-pod -f # suivre en temps réel
kubectl logs mon-pod -c mon-container # multi-container pod
kubectl logs mon-pod --previous # logs du conteneur précédent (après crash)
# Ouvrir un shell dans un pod
kubectl exec -it mon-pod -- /bin/sh
kubectl exec -it mon-pod -c mon-container -- bash
# Port-forward pour accéder à un service localement
kubectl port-forward pod/mon-pod 8080:3000
kubectl port-forward service/mon-service 8080:80# Appliquer (créer ou mettre à jour)
kubectl apply -f deployment.yaml
kubectl apply -f ./manifests/ # dossier entier
# Supprimer
kubectl delete -f deployment.yaml
kubectl delete pod mon-pod # par nom
kubectl delete pod mon-pod --grace-period=0 # force (éviter en prod)
# Dry run — voir ce qui serait fait sans appliquer
kubectl apply -f deployment.yaml --dry-run=client
kubectl apply -f deployment.yaml --dry-run=serverRépéter -n mon-namespace à chaque commande est fastidieux. Changer le namespace par défaut du contexte :
kubectl config set-context --current --namespace=mon-namespace
# Toutes les commandes s'exécutent maintenant dans mon-namespaceSi vous voulez pratiquer localement sans VPS :
# macOS/Linux
brew install kind
# Cluster minimal
kind create cluster
# Charger une image locale dans Kind (pas besoin de registry)
docker build -t mon-app:latest .
kind load docker-image mon-app:latest
# Utiliser le contexte Kind
kubectl config use-context kind-kindLe cluster tourne, kubectl est configuré. Le chapitre suivant couvre les objets fondamentaux : Pod, Deployment, ReplicaSet, Service et Namespace — et écrit les premiers manifestes YAML.