Déployer une appli sur Kubernetes : Deployments et Services
Créer un pod à la main, c'est bien pour tester. Pour une vraie appli, tu veux :
- plusieurs réplicas,
- des mises à jour contrôlées,
- un point d'entrée stable pour les clients.
C'est exactement ce que t'apportent les Deployments et les Services.
Deployment : la façon moderne de gérer tes pods
Un Deployment gère :
- le nombre de réplicas,
- la stratégie de mise à jour,
- l'historique des versions de ReplicaSets.
Exemple minimal :
apiVersion: apps/v1
kind: Deployment
metadata:
name: mon-api
spec:
replicas: 3
selector:
matchLabels:
app: mon-api
template:
metadata:
labels:
app: mon-api
spec:
containers:
- name: api
image: ghcr.io/likedevGit/mon-api:1.0.0
ports:
- containerPort: 3000
Commande :
kubectl apply -f deployment-api.yaml
kubectl get deployments
kubectl get pods -l app=mon-api
Services : exposer tes pods
Les pods peuvent mourir, être recréés, bouger de node. Tu ne veux pas que les clients parlent directement aux IPs des pods.
Tu définis un Service qui :
- pointe vers les bons pods via un selector de labels,
- leur assigne une IP/port stable dans le cluster.
ClusterIP (interne)
apiVersion: v1
kind: Service
metadata:
name: mon-api
spec:
type: ClusterIP
selector:
app: mon-api
ports:
- port: 80
targetPort: 3000
- Les autres pods du cluster peuvent appeler
http://mon-api:80. - Rien n'est exposé vers l'extérieur.
NodePort (exposition simple)
spec:
type: NodePort
selector:
app: mon-api
ports:
- port: 80
targetPort: 3000
nodePort: 30080
- Ouvre le port 30080 sur chaque node.
- Accessible sur
http://<ip-node>:30080.
Pratique pour du debug ou un petit cluster perso, moins idéal en prod "propre".
LoadBalancer (cloud)
Sur les clouds managés (GKE, AKS, EKS…), un Service LoadBalancer demande au provider :
- de provisionner un load balancer externe,
- de le brancher sur ton Service.
spec:
type: LoadBalancer
selector:
app: mon-api
ports:
- port: 80
targetPort: 3000
Rolling update et rollback
Avec un Deployment, tu peux faire un rolling update :
kubectl set image deployment/mon-api api=ghcr.io/likedevGit/mon-api:1.1.0
kubectl rollout status deployment/mon-api
Si ça se passe mal :
kubectl rollout undo deployment/mon-api
La stratégie par défaut remplace progressivement les pods, sans downtime marqué (sauf bug applicatif).
Bonnes pratiques
- Utilise des labels cohérents (
app,tier,env) pour faciliter les selectors. - Sépare les Services internes (ClusterIP) des frontaux (LoadBalancer/Ingress).
- Sur du cloud, préfère souvent un Ingress + Service ClusterIP plutôt que des dizaines de Services LoadBalancer.
Dans les prochains articles, on ajoutera la configuration (ConfigMaps, Secrets) et l'observabilité pour suivre tes pods en situation réelle.