Découvrir Kubernetes : pods, services et kubectl
🎯 Objectifs
À la fin de ce module, vous serez capable de :
- ✅ Comprendre l'architecture d'un cluster Kubernetes
- ✅ Installer un environnement local avec Minikube
- ✅ Créer et gérer des Pods
- ✅ Exposer des applications avec des Services
- ✅ Utiliser les namespaces et les labels
- ✅ Maîtriser les commandes kubectl essentielles
📋 Prérequis
- Module Docker Intermédiaire complété
- Docker installé et fonctionnel
- Terminal Bash ou Zsh
- Notions de base en réseau (ports, IP)
☸️ Pourquoi Kubernetes ?
Le problème
Avec Docker, vous savez lancer des conteneurs. Mais en production :
- Comment gérer des dizaines de conteneurs sur plusieurs serveurs ?
- Comment redémarrer automatiquement un conteneur qui plante ?
- Comment répartir la charge entre plusieurs instances ?
La solution : Kubernetes (K8s)
Kubernetes est une plateforme d'orchestration qui automatise :
| Fonctionnalité | Description |
|---|---|
| Self-healing | Redémarre les conteneurs en échec |
| Scaling | Ajuste le nombre de réplicas |
| Rolling updates | Mise à jour sans interruption |
| Service discovery | Réseau interne automatique |
| Load balancing | Répartition de charge |
🏗️ Architecture Kubernetes
Vue d'ensemble
┌──────────────────────────────────────────────┐
│ CLUSTER K8S │
│ │
│ ┌────────────────┐ ┌──────────────────┐ │
│ │ Control Plane │ │ Worker Node 1 │ │
│ │ │ │ │ │
│ │ · API Server ├───►│ ┌────┐ ┌────┐ │ │
│ │ · etcd │ │ │ Pod│ │ Pod│ │ │
│ │ · Scheduler │ │ └────┘ └────┘ │ │
│ │ · Controller │ └──────────────────┘ │
│ │ │ │
│ └────────────────┘ ┌──────────────────┐ │
│ │ Worker Node 2 │ │
│ │ │ │
│ │ ┌────┐ ┌────┐ │ │
│ │ │ Pod│ │ Pod│ │ │
│ │ └────┘ └────┘ │ │
│ └──────────────────┘ │
└──────────────────────────────────────────────┘Composants principaux
| Composant | Rôle | Emplacement |
|---|---|---|
| API Server | Point d'entrée de toutes les requêtes | Control Plane |
| etcd | Base de données clé-valeur (état du cluster) | Control Plane |
| Scheduler | Assigne les pods aux nœuds | Control Plane |
| Controller Manager | Maintient l'état désiré | Control Plane |
| kubelet | Agent qui exécute les pods | Worker Node |
| kube-proxy | Gère le réseau des services | Worker Node |
🔧 Installation Locale
Minikube (recommandé)
# Installation sur Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# Démarrer le cluster
minikube start
# Vérifier le statut
minikube statuskubectl
# Installation
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install kubectl /usr/local/bin/kubectl
# Vérification
kubectl version --client💡 Alternative :
kind(Kubernetes in Docker) est plus léger. Docker Desktop inclut aussi une option Kubernetes intégrée dans les paramètres.
🚀 Premiers Pas avec kubectl
# Informations du cluster
kubectl cluster-info
# Lister les nœuds
kubectl get nodes
# Version complète
kubectl versionRésultat attendu :
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 2m v1.30.0📦 Pods
Concept
Un Pod est la plus petite unité déployable dans Kubernetes. Il contient un ou plusieurs conteneurs qui partagent le même réseau et stockage.
Créer un Pod avec YAML
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80Commandes essentielles
# Créer le pod
kubectl apply -f nginx-pod.yaml
# Lister les pods
kubectl get pods
# Détails complets
kubectl describe pod nginx-pod
# Voir les logs
kubectl logs nginx-pod
# Ouvrir un shell dans le pod
kubectl exec -it nginx-pod -- /bin/bash
# Supprimer le pod
kubectl delete pod nginx-podCycle de vie d'un Pod
Pending → Running → Succeeded / Failed
│ │
└── ContainerCreating └── CrashLoopBackOff⚠️ Attention : un Pod seul n'est jamais redémarré automatiquement. Utilisez un Deployment pour la haute disponibilité (module avancé).
🌐 Services
Pourquoi ?
Les Pods ont des adresses IP éphémères qui changent à chaque redémarrage. Un Service fournit un point d'accès stable.
Types de Services
| Type | Accès | Cas d'usage |
|---|---|---|
| ClusterIP | Interne au cluster uniquement | Communication entre services |
| NodePort | Depuis l'extérieur via un port du nœud | Développement, tests |
| LoadBalancer | Via un load balancer externe | Production (cloud) |
Exemple : NodePort
# nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080# Créer le service
kubectl apply -f nginx-service.yaml
# Lister les services
kubectl get svc
# Détails du service
kubectl describe svc nginx-service
# Accéder avec Minikube
minikube service nginx-service --url💡 Le selector
app: nginxlie le service aux pods ayant le label correspondant.
📁 Namespaces
Les namespaces sont des clusters virtuels au sein d'un même cluster physique.
Namespaces par défaut
| Namespace | Rôle |
|---|---|
default | Espace par défaut pour vos ressources |
kube-system | Composants internes de Kubernetes |
kube-public | Ressources accessibles publiquement |
# Lister les namespaces
kubectl get ns
# Créer un namespace
kubectl create ns mon-projet
# Lister les pods d'un namespace
kubectl get pods -n mon-projet
# Créer une ressource dans un namespace
kubectl apply -f nginx-pod.yaml -n mon-projet🏷️ Labels et Selectors
Les labels sont des paires clé-valeur pour organiser vos ressources.
metadata:
labels:
app: nginx
env: production
team: backend# Filtrer par label
kubectl get pods -l app=nginx
# Filtrer avec plusieurs labels
kubectl get pods -l app=nginx,env=production
# Ajouter un label à un pod existant
kubectl label pod nginx-pod version=1.0💡 Les selectors dans les Services utilisent
matchLabelspour cibler les bons Pods.
📋 Commandes Essentielles
| Commande | Description |
|---|---|
kubectl get <ressource> | Lister les ressources |
kubectl describe <ressource> <nom> | Détails d'une ressource |
kubectl apply -f <fichier> | Créer/mettre à jour une ressource |
kubectl delete <ressource> <nom> | Supprimer une ressource |
kubectl logs <pod> | Voir les logs |
kubectl exec -it <pod> -- <cmd> | Exécuter une commande dans un pod |
kubectl get all | Voir toutes les ressources |
kubectl get pods -o wide | Afficher plus de détails (IP, nœud) |
❌ Erreurs Courantes
| Erreur | Cause | Solution |
|---|---|---|
ImagePullBackOff | Image introuvable | Vérifier le nom et le tag de l'image |
CrashLoopBackOff | Le conteneur plante en boucle | Consulter kubectl logs |
Pending | Pas de nœud disponible | Vérifier les ressources du cluster |
ErrImagePull | Erreur d'authentification au registry | Configurer un imagePullSecret |
Connection refused | Service mal configuré | Vérifier les selectors et les ports |
🎯 Points Clés
- Un cluster = Control Plane + Worker Nodes
- Un Pod = plus petite unité déployable (un ou plusieurs conteneurs)
- Un Service = point d'accès réseau stable vers des Pods
- Les namespaces isolent les ressources
- Les labels organisent et ciblent les ressources
kubectlest l'outil principal d'interaction avec le cluster
📚 Ressources
- Documentation officielle Kubernetes
- kubectl Cheat Sheet
- Minikube - Getting Started
- Kubernetes The Hard Way
🚀 Prochaines étapes
Vous gérez vos premiers Pods et Services. Montez en compétence :
- Kubernetes en production : Deployments, Ingress et Secrets - Deployments, ConfigMaps, Secrets et Ingress