1. Pods
Unité de base de k8s. Un Pod est un ou plusieurs containers qui partagent le même réseau et le même stockage, et qui sont toujours déployés ensemble.
- C’est l’équivalent le plus proche d’un
docker run. - Les containers d’un même Pod communiquent via
localhost. - Les Pods sont éphémères : s’ils meurent, k8s en recrée de nouveaux.
Dans un fichier simple-pod.yaml :
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
2. Deployments & ReplicaSets
On ne crée presque jamais de Pods à la main en production.
- ReplicaSet : maintient un nombre exact de replicas d’un Pod.
- Deployment : gère les ReplicaSets + mises à jour (rolling update, rollback…).
Dans un fichier nginx-deployment.yaml :
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
Commandes pour utiliser le nginx-deployment.yaml :
kubectl apply -f nginx-deployment.yaml # Crée ou MAJ du déploiement du pod
kubectl get pods # Liste tous les Pods
kubectl get deployments # Liste tous les Déploiements
kubectl rollout status deployment/nginx-deployment # Statut du déploiement en direct
kubectl rollout undo deployment/nginx-deployment # Annule la MAJ du déploiement
3. Services
Les Pods ont des IP qui changent. Un Service donne un point d’accès stable (IP + DNS interne).
- ClusterIP (défaut) → accessible uniquement à l’intérieur du cluster
- NodePort → accessible depuis l’extérieur via un port sur chaque nœud
- LoadBalancer → provisionne un load balancer cloud (AWS, GCP, Azure…)
apiVersion: v1
kind: Service
metadata:
name: mon-app-svc
spec:
selector:
app: mon-app
ports:
- port: 80
targetPort: 8000
type: ClusterIP
Les Pods se découvrent via le nom DNS du Service : mon-app-svc (ou mon-app-svc.namespace.svc.cluster.local).
4. ConfigMaps & Secrets
- ConfigMap → configuration non sensible (fichiers, variables d’environnement)
- Secret → données sensibles (mots de passe, tokens, certificats) encodées en base64.
CAUTION
Ne pas oublier base64 =/= chiffrement. c'est juste un encodage. Pas une sécurité.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: info
DATABASE_URL: postgres://db:5432/mydb
On les injecte dans les Pods via envFrom ou volumeMounts.
5. Volumes (stockage persistant)
Comme avec Docker, les containers sont éphémères. Pour la persistance :
- PersistentVolume (PV) : ressource de stockage réelle (disque cloud, NFS…)
- PersistentVolumeClaim (PVC) : demande de stockage faite par l’application
Exemple simple (souvent géré automatiquement par un StorageClass) :
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pgdata
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Dans le Pod/Deployment on monte le PVC :
volumes:
- name: data
persistentVolumeClaim:
claimName: pgdata
6. Networks de base
- Chaque Pod a sa propre IP.
- La communication Pod vers Pod est native (pas besoin de réseau custom comme en Docker).
- Les Services font le load-balancing et le DNS.
- NetworkPolicies (optionnel) permettent de restreindre le trafic (agissent comme un firewall entre Pods).
Par défaut tout le monde peut parler à tout le monde dans le cluster.
7. Namespaces
Isolation logique (comme des dossiers). Utile pour séparer dev/staging/prod ou équipes.
kubectl create namespace mon-projet
kubectl apply -f app.yaml -n mon-projet
8. Miscellaneous
- Workflow typique
- On a des images Docker.
- On écrit des manifests YAML (Deployment + Service + éventuellement ConfigMap/PVC).
kubectl apply -f .permet de lancer ou appliquer les MAJ des fichiers .yaml- k8s s’occupe de démarrer, redémarrer, scaler, mettre à jour, etc.
- Commandes essentielles :
kubectl get all
kubectl describe pod <nom>
kubectl logs <pod> -f
kubectl exec -it <pod> -- bash
kubectl delete -f .
kubectl scale deployment mon-app --replicas=5
- Résumé Docker → k8s
| Docker | Kubernetes |
|---|---|
| Container | Pod (1 ou + containers) |
| docker run | Pod / Deployment |
| docker-compose | Deployment + Service + etc. |
| Volume named / bind | PersistentVolumeClaim |
| docker network | Service + NetworkPolicy |
| Dockerfile | Image déjà construite |
Suite Ingress, Helm, StatefulSets, Jobs, autoscaling, etc... ?