Kubernetes avec Claude Code : Deployment, Service, Ingress et rollback
Guide pratique pour créer avec Claude Code un déploiement Kubernetes sûr, vérifiable et réversible.
Produire du YAML que l’on peut relire
Kubernetes orchestre des applications conteneurisées, mais le premier obstacle pour un débutant est la densité des concepts : Deployment, Service, Ingress, ConfigMap, Secret, probes, requests, limits, rollout et rollback. Si vous demandez simplement à Claude Code de générer du YAML Kubernetes, le résultat peut sembler correct tout en étant fragile : image latest, pas de readinessProbe, Secret d’exemple commité, Service trop exposé ou annotations Ingress adaptées à un autre cluster.
L’objectif de ce guide est plus concret. Nous utilisons Claude Code pour créer une base sûre, puis nous la relisons comme une modification d’infrastructure. L’exemple repose sur nginx:1.27-alpine et une page HTML fournie par ConfigMap. Il fonctionne sans image privée, donc il peut être testé dans kind, minikube, Docker Desktop Kubernetes ou un cluster jetable.
Gardez les documents officiels à portée de main : Deployments, Services, Ingress, probes, ressources, ConfigMap, Secret et kubectl rollout. Pour continuer sur ClaudeCodeLab, lisez aussi Docker integration, CI/CD setup, code review et permissions guide.
Cas d’usage réels
Ne commencez pas par une plateforme complète. Commencez par une unité que vous pouvez déployer, vérifier, casser volontairement, puis restaurer. C’est ainsi que les commandes deviennent utiles avant un incident.
| Cas d’usage | Objectif | Ce que Claude Code doit préparer |
|---|---|---|
| Premier outil interne | Mettre une application Web derrière un Service stable | Deployment, ClusterIP Service, probes, requests et limits |
| Atelier de formation | Faire exécuter les mêmes étapes à chaque participant | Manifest avec namespace, commandes de vérification, exercice d’échec |
| Revue avant production | Repérer les YAML dangereux avant release | Sélecteurs, Secret, probes, Ingress, rollback |
| Gate de Pull Request | Bloquer les changements d’infra risqués | dry-run CI et checklist de revue |
Ce sujet a aussi une logique de monétisation : le lecteur ne veut pas seulement une définition, il veut éviter une panne. ClaudeCodeLab relie donc ce guide aux ressources gratuites, aux modèles et à la formation et consultation Claude Code pour les équipes qui veulent adapter le flux à leur dépôt.
Donner des limites à Claude Code
Un bon prompt Kubernetes décrit aussi ce qui est interdit. Sans limites, l’assistant peut choisir LoadBalancer, inventer un Secret, ajouter du RBAC global ou supposer un Ingress Controller que vous n’avez pas.
Crée un exemple de déploiement Kubernetes testable localement pour débutants.
Exigences:
- namespace claude-k8s-demo
- utiliser nginx:1.27-alpine, pas une image privée
- inclure un ConfigMap avec une page HTML
- Deployment avec replicas 2, RollingUpdate, readinessProbe, livenessProbe et resources
- Service de type ClusterIP
- Ingress optionnel avec host claude-k8s.local
- expliquer la politique Secret sans générer de vraie valeur
- inclure les commandes apply, rollout status, port-forward, échec et rollback
Contraintes:
- ne pas utiliser NodePort ni LoadBalancer
- ne pas écrire de vraie valeur Secret dans YAML
- ne pas créer ClusterRole, ClusterRoleBinding ni commande destructive
Ce prompt donne une surface de revue nette : labels, selectors, probes, ports, resources et secrets. Si votre équipe répète cette opération, placez les règles stables dans CLAUDE.md et reliez-les aux bonnes pratiques CLAUDE.md.
Manifest prêt à copier
Enregistrez ceci dans k8s/claude-k8s-demo.yaml. L’Ingress nécessite un controller, mais le Service est vérifiable par port-forward.
apiVersion: v1
kind: Namespace
metadata:
name: claude-k8s-demo
---
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-page
namespace: claude-k8s-demo
data:
APP_ENV: "demo"
index.html: |
<!doctype html>
<html lang="fr">
<head><meta charset="utf-8" /><title>Claude Code Kubernetes Demo</title></head>
<body><h1>Claude Code Kubernetes Demo</h1><p>Deployment, Service, ConfigMap, probes are running.</p></body>
</html>
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-web
namespace: claude-k8s-demo
labels:
app: demo-web
spec:
replicas: 2
revisionHistoryLimit: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: demo-web
template:
metadata:
labels:
app: demo-web
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- name: http
containerPort: 80
resources:
requests:
cpu: "50m"
memory: "64Mi"
limits:
cpu: "250m"
memory: "128Mi"
readinessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 3
periodSeconds: 5
livenessProbe:
httpGet:
path: /
port: http
initialDelaySeconds: 10
periodSeconds: 10
volumeMounts:
- name: demo-page
mountPath: /usr/share/nginx/html/index.html
subPath: index.html
readOnly: true
volumes:
- name: demo-page
configMap:
name: demo-page
---
apiVersion: v1
kind: Service
metadata:
name: demo-web
namespace: claude-k8s-demo
spec:
type: ClusterIP
selector:
app: demo-web
ports:
- name: http
port: 80
targetPort: http
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-web
namespace: claude-k8s-demo
spec:
ingressClassName: nginx
rules:
- host: claude-k8s.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-web
port:
name: http
Le point critique est l’alignement de selector.matchLabels, des labels du template Pod et du selector du Service. Une seule divergence suffit à obtenir un Service sans endpoints.
Vérifier localement
Vérifiez d’abord le cluster avec kubectl cluster-info, puis appliquez :
kubectl apply -f k8s/claude-k8s-demo.yaml
kubectl -n claude-k8s-demo rollout status deployment/demo-web
kubectl -n claude-k8s-demo get pods -l app=demo-web
kubectl -n claude-k8s-demo get service demo-web
kubectl -n claude-k8s-demo port-forward service/demo-web 8080:80
Dans un autre terminal :
curl http://localhost:8080/
Ne déboguez Ingress qu’après avoir prouvé que Pod et Service fonctionnent.
kubectl -n claude-k8s-demo get ingress demo-web
kubectl -n claude-k8s-demo describe ingress demo-web
ConfigMap, Secret et rollback
ConfigMap stocke une configuration non sensible. Secret vise les valeurs sensibles, mais un Secret YAML encodé en base64 ne doit pas être commité. Base64 n’est pas du chiffrement. En production, utilisez Secret Manager, External Secrets, Sealed Secrets, SOPS ou la procédure vault validée par votre équipe.
Pour un test local :
kubectl -n claude-k8s-demo create secret generic demo-api-secret \
--from-literal=API_TOKEN='replace-me-locally' \
--dry-run=client \
-o yaml > secret.local.yaml
kubectl apply -f secret.local.yaml
Exercez ensuite rollout et rollback :
kubectl -n claude-k8s-demo set image deployment/demo-web nginx=nginx:1.27-alpine
kubectl -n claude-k8s-demo rollout status deployment/demo-web
kubectl -n claude-k8s-demo rollout history deployment/demo-web
kubectl -n claude-k8s-demo set image deployment/demo-web nginx=nginx:not-a-real-tag
kubectl -n claude-k8s-demo rollout status deployment/demo-web --timeout=30s
kubectl -n claude-k8s-demo rollout undo deployment/demo-web
Un rollback Deployment ne restaure pas forcément ConfigMap, Secret, migration de base, DNS ou feature flag. Demandez à Claude Code d’écrire dans le runbook ce qui revient en arrière et ce qui nécessite une procédure séparée.
CI, erreurs fréquentes et suite
Ajoutez au minimum un dry-run en Pull Request :
name: Kubernetes manifest review
on:
pull_request:
paths:
- "k8s/**"
jobs:
dry-run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: azure/setup-kubectl@v4
with:
version: "v1.30.0"
- run: kubectl apply --dry-run=client -f k8s/
Les pièges courants sont l’image latest en production, la confusion readiness/liveness, l’absence de resources, la croyance que base64 sécurise un secret, le débogage Ingress avant Service et la mise en production d’une sortie Claude Code sans revue humaine. La réponse est pragmatique : docs officielles, CI, vérification locale, prompts avec contraintes et revue orientée risques.
Cet exemple reste volontairement petit. En projet réel, il faut gérer build Docker, tags immuables, TLS, secrets, observabilité, RBAC, CI/CD et incidents. Une personne seule peut commencer avec le cheatsheet gratuit. Une équipe peut structurer prompts, CLAUDE.md, gates CI et exercices de rollback via la formation et consultation Claude Code. Le flux vérifié pour cet article est : apply, rollout status, Pods, port-forward, curl, image invalide, échec visible, puis rollout undo. Les erreurs observées chez les débutants sont surtout des selectors incohérents, des probes sur le mauvais path, des resources absentes et des Secrets mal documentés.
PDF gratuit: cheatsheet Claude Code
Saisissez votre email et téléchargez une page avec commandes, habitudes de review et workflow sûr.
Nous protégeons vos données et n'envoyons pas de spam.
À propos de l'auteur
Masa
Ingénieur spécialisé dans les workflows pratiques avec Claude Code.
Articles liés
Workflow Obsidian vers CLAUDE.md avec Claude Code
Transformer des notes Obsidian en notes CLAUDE.md concises pour reprendre les sessions sans réexpliquer.
Claude Code Revenue CTA Routing : relier articles, PDF, Gumroad et consultation
Un workflow Claude Code pour orienter les lecteurs vers PDF gratuit, Gumroad ou consultation selon l'intention.
Règles de handoff Claude Code en équipe: preuves, permissions, rollback et revenus
Un format concret pour transmettre un travail Claude Code avec preuves, permissions, rollback, PDF gratuit, Gumroad et consultation.