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éristique | Description |
|---|---|
| IP unique | Chaque Pod a sa propre adresse IP |
| Réseau partagé | Les conteneurs partagent localhost |
| Stockage partagé | Volumes accessibles par tous les conteneurs |
| Éphémère | Les Pods sont mortels et remplaçables |
| Co-localisation | Conteneurs 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
| Phase | Description |
|---|---|
| Pending | Pod accepté mais pas encore schedulé |
| Running | Au moins un conteneur en exécution |
| Succeeded | Tous les conteneurs terminés avec succès |
| Failed | Au 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
| Condition | Description |
|---|---|
| PodScheduled | Pod assigné à un node |
| ContainersReady | Tous les conteneurs sont prêts |
| Initialized | Tous les init containers terminés |
| Ready | Pod 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
| Probe | Question | Action si échec |
|---|---|---|
| Liveness | Le conteneur fonctionne-t-il ? | Restart |
| Readiness | Le conteneur peut-il recevoir du trafic ? | Retrait du Service |
| Startup | Le 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ètre | Description | Défaut |
|---|---|---|
| initialDelaySeconds | Délai avant première probe | 0 |
| periodSeconds | Intervalle entre probes | 10 |
| timeoutSeconds | Timeout de la probe | 1 |
| successThreshold | Succès consécutifs requis | 1 |
| failureThreshold | Échecs avant action | 3 |
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
| Classe | Condition | Priorité |
|---|---|---|
| Guaranteed | requests = limits pour tous les conteneurs | Haute |
| Burstable | Au moins un request défini | Moyenne |
| BestEffort | Aucun request ni limit | Basse (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