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.

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.

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).

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

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 :

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

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

  1. On a des images Docker.
  2. On écrit des manifests YAML (Deployment + Service + éventuellement ConfigMap/PVC).
  3. kubectl apply -f . permet de lancer ou appliquer les MAJ des fichiers .yaml
  4. 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... ?