Aller au contenu principal

Pods et Conteneurs


1 - Qu'est-ce qu'un Pod ?

Un Pod est la plus petite unité déployable dans Kubernetes. Il représente un ou plusieurs conteneurs qui partagent le même contexte d'exécution.

Caractéristiques d'un Pod

CaractéristiqueDescription
IP uniqueChaque Pod a sa propre adresse IP
Réseau partagéLes conteneurs partagent localhost
Stockage partagéVolumes accessibles par tous les conteneurs
ÉphémèreLes Pods sont mortels et remplaçables
Co-localisationConteneurs sur le même node

2 - Créer un Pod

2.1 Méthode impérative

# Créer un Pod simple
kubectl run mon-pod --image=nginx

# Avec des options
kubectl run mon-pod --image=nginx --port=80 --labels="app=web,env=dev"

# Vérifier
kubectl get pods
kubectl describe pod mon-pod

2.2 Méthode déclarative (recommandée)

# pod-simple.yaml
apiVersion: v1
kind: Pod
metadata:
name: mon-pod
labels:
app: web
env: dev
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
# Appliquer le manifest
kubectl apply -f pod-simple.yaml

# Vérifier
kubectl get pod mon-pod -o wide

2.3 Structure d'un manifest Pod


3 - Cycle de vie d'un Pod

3.1 Phases du Pod

PhaseDescription
PendingPod accepté mais pas encore schedulé
RunningAu moins un conteneur en exécution
SucceededTous les conteneurs terminés avec succès
FailedAu moins un conteneur a échoué
UnknownÉtat inconnu (problème de communication)

3.2 Conditions du Pod

# Voir les conditions
kubectl describe pod mon-pod | grep Conditions -A 10
ConditionDescription
PodScheduledPod assigné à un node
ContainersReadyTous les conteneurs sont prêts
InitializedTous les init containers terminés
ReadyPod prêt à recevoir du trafic

4 - Pods multi-conteneurs

4.1 Patterns de Pods multi-conteneurs

4.2 Exemple : Sidecar pattern

# pod-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-avec-sidecar
spec:
containers:
# Conteneur principal
- name: app
image: nginx
volumeMounts:
- name: logs
mountPath: /var/log/nginx

# Sidecar - collecte les logs
- name: log-collector
image: busybox
command: ['sh', '-c', 'tail -f /var/log/nginx/access.log']
volumeMounts:
- name: logs
mountPath: /var/log/nginx

volumes:
- name: logs
emptyDir: {}

4.3 Exemple : Ambassador pattern

# pod-ambassador.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-avec-ambassador
spec:
containers:
# Application principale
- name: app
image: mon-app
env:
- name: DATABASE_HOST
value: "localhost" # Le proxy local
- name: DATABASE_PORT
value: "5432"

# Ambassador - proxy vers la base de données
- name: db-proxy
image: cloudnativelabs/kube-ambassador
ports:
- containerPort: 5432

5 - Init Containers

Les Init Containers s'exécutent avant les conteneurs principaux et doivent se terminer avec succès.

Exemple d'Init Container

# pod-init.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-avec-init
spec:
initContainers:
# Attendre que la DB soit disponible
- name: wait-for-db
image: busybox
command: ['sh', '-c', 'until nc -z database 5432; do echo waiting...; sleep 2; done']

# Télécharger la configuration
- name: download-config
image: busybox
command: ['wget', '-O', '/config/app.conf', 'http://config-server/app.conf']
volumeMounts:
- name: config
mountPath: /config

containers:
- name: app
image: mon-app
volumeMounts:
- name: config
mountPath: /etc/app

volumes:
- name: config
emptyDir: {}

6 - Probes (Sondes de santé)

6.1 Types de probes

ProbeQuestionAction si échec
LivenessLe conteneur fonctionne-t-il ?Restart
ReadinessLe conteneur peut-il recevoir du trafic ?Retrait du Service
StartupLe conteneur a-t-il démarré ?Restart

6.2 Méthodes de probe

# pod-probes.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-avec-probes
spec:
containers:
- name: app
image: mon-app
ports:
- containerPort: 8080

# HTTP GET
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3

# TCP Socket
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 5

# Exec command
startupProbe:
exec:
command:
- cat
- /tmp/healthy
failureThreshold: 30
periodSeconds: 10

6.3 Configuration des probes

ParamètreDescriptionDéfaut
initialDelaySecondsDélai avant première probe0
periodSecondsIntervalle entre probes10
timeoutSecondsTimeout de la probe1
successThresholdSuccès consécutifs requis1
failureThresholdÉchecs avant action3

7 - Ressources et limites

7.1 Requests et Limits

# pod-resources.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-ressources
spec:
containers:
- name: app
image: nginx
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"

7.2 QoS Classes

ClasseConditionPriorité
Guaranteedrequests = limits pour tous les conteneursHaute
BurstableAu moins un request définiMoyenne
BestEffortAucun request ni limitBasse (premier tué)
# Guaranteed QoS
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "256Mi"
cpu: "500m"

8 - Commandes kubectl pour les Pods

8.1 Gestion de base

# Lister les pods
kubectl get pods
kubectl get pods -o wide # Plus de détails
kubectl get pods -A # Tous les namespaces

# Détails d'un pod
kubectl describe pod mon-pod

# Logs
kubectl logs mon-pod
kubectl logs mon-pod -c nom-conteneur # Multi-conteneur
kubectl logs mon-pod -f # Follow
kubectl logs mon-pod --previous # Conteneur précédent (après restart)

# Exécuter une commande
kubectl exec mon-pod -- ls /
kubectl exec -it mon-pod -- /bin/bash # Shell interactif

# Copier des fichiers
kubectl cp mon-pod:/var/log/app.log ./app.log
kubectl cp ./config.yaml mon-pod:/etc/app/

# Supprimer
kubectl delete pod mon-pod
kubectl delete pod mon-pod --grace-period=0 --force # Force

8.2 Debugging

# Voir les événements
kubectl get events --sort-by='.lastTimestamp'

# Debug avec un pod éphémère
kubectl debug mon-pod -it --image=busybox

# Port-forward
kubectl port-forward pod/mon-pod 8080:80

# Voir le YAML complet
kubectl get pod mon-pod -o yaml

9 - Bonnes pratiques

9.1 Labels et annotations

apiVersion: v1
kind: Pod
metadata:
name: mon-app
labels:
app: frontend
version: v1.2.0
environment: production
team: platform
annotations:
description: "Application frontend principale"
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
spec:
containers:
- name: app
image: mon-app:v1.2.0

9.2 Checklist Pod production

  • Définir des requests et limits pour les ressources
  • Configurer des probes (liveness, readiness)
  • Utiliser des labels cohérents
  • Éviter d'utiliser le tag :latest
  • Définir une securityContext appropriée
  • Ne jamais utiliser des Pods seuls en production (utiliser Deployments)
# Exemple complet
apiVersion: v1
kind: Pod
metadata:
name: app-production
labels:
app: mon-app
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
containers:
- name: app
image: mon-app:v1.2.0
ports:
- containerPort: 8080
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true

Résumé

Dans ce chapitre, nous avons appris :

  • L'anatomie d'un Pod et ses caractéristiques
  • Les patterns multi-conteneurs (Sidecar, Ambassador, Adapter)
  • Les Init Containers pour l'initialisation
  • Les Probes pour la santé des conteneurs
  • La gestion des ressources (requests/limits)
  • Les commandes kubectl essentielles

Prochaine étape

Dans le prochain chapitre, nous découvrirons les Deployments et ReplicaSets pour gérer le cycle de vie des applications.

→ Chapitre suivant : Deployments et ReplicaSets


← Retour à la table des matières