Kubernetes

Orchestration de conteneurs avec Kubernetes — pods, services, deployments, mise à l'échelle automatique et health checks.

Qu’est-ce que Kubernetes ?

Kubernetes (K8s) est une plateforme d’orchestration de conteneurs qui automatise le déploiement, la mise à l’échelle et la gestion des applications conteneurisées. Créé par Google, il constitue aujourd’hui le standard de facto pour exécuter des workloads en production.

Kubernetes résout des problèmes que Docker seul ne peut pas gérer à grande échelle :

  • Comment répartir mes conteneurs sur plusieurs machines ?
  • Comment monter automatiquement en charge lorsque le trafic augmente ?
  • Que se passe-t-il si un conteneur échoue — qui le redémarre ?
  • Comment réaliser des rolling updates sans downtime ?

Concepts fondamentaux

Pod

Un Pod est l’unité de déploiement minimale dans Kubernetes. Il contient un ou plusieurs conteneurs qui partagent le réseau et le stockage. En pratique, la plupart des pods n’ont qu’un seul conteneur.

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  containers:
    - name: my-app
      image: my-app:1.0.0
      ports:
        - containerPort: 3000

Service

Un Service expose un ensemble de pods comme un service réseau stable. Les pods sont éphémères (ils peuvent mourir et être recréés), mais le Service conserve une IP et un DNS fixes.

Types de Service :

  • ClusterIP (par défaut) : accessible uniquement à l’intérieur du cluster
  • NodePort : expose le service sur un port de chaque nœud
  • LoadBalancer : crée un répartiteur de charge externe (chez les cloud providers)
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 3000
  type: ClusterIP

Deployment

Un Deployment gère le cycle de vie des pods : combien de réplicas exécuter, comment les mettre à jour et comment effectuer un rollback si quelque chose échoue.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: my-app:1.0.0
          ports:
            - containerPort: 3000
          resources:
            requests:
              memory: "128Mi"
              cpu: "250m"
            limits:
              memory: "256Mi"
              cpu: "500m"

Health checks

Kubernetes utilise des probes pour vérifier l’état des conteneurs :

Liveness probe

Vérifie si le conteneur est vivant. En cas d’échec, Kubernetes redémarre le conteneur.

livenessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 15
  failureThreshold: 3

Readiness probe

Vérifie si le conteneur est prêt à recevoir du trafic. En cas d’échec, Kubernetes cesse de lui envoyer des requests (mais ne le redémarre pas).

readinessProbe:
  httpGet:
    path: /ready
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 10

Startup probe

Pour les applications dont le démarrage est lent. Tant que le startup probe n’est pas validé, les autres probes ne s’exécutent pas.

startupProbe:
  httpGet:
    path: /health
    port: 3000
  failureThreshold: 30
  periodSeconds: 5

Mise à l’échelle

Mise à l’échelle manuelle

kubectl scale deployment my-app --replicas=5

Horizontal Pod Autoscaler (HPA)

Ajuste automatiquement le nombre de pods en fonction de métriques comme le CPU ou la mémoire :

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70

ConfigMaps et Secrets

ConfigMap

Pour la configuration non sensible :

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
data:
  LOG_LEVEL: "info"
  API_TIMEOUT: "30s"

Secret

Pour les données sensibles (encodées en base64) :

apiVersion: v1
kind: Secret
metadata:
  name: my-app-secrets
type: Opaque
data:
  DATABASE_PASSWORD: cGFzc3dvcmQxMjM=

Namespaces

Les namespaces permettent de diviser un cluster en environnements logiques isolés :

kubectl create namespace staging
kubectl create namespace production

Chaque namespace peut avoir ses propres ressources, limites et politiques d’accès.

Résumé

Kubernetes est la plateforme standard pour orchestrer des conteneurs en production. Ses abstractions clés — Pods, Services, Deployments — combinées aux health checks, à l’auto-scaling et à la gestion de la configuration, fournissent tout le nécessaire pour exécuter des applications distribuées de manière fiable et scalable.