Argo Rollouts est un contrôleur Kubernetes qui remplace le Deployment standard par une CRD Rollout, ajoutant des stratégies de déploiement progressif (canary, blue-green) avec analyse automatique des métriques. Il peut pauserer un déploiement, le promouvoir progressivement ou le rollbacker automatiquement selon des critères Prometheus, Datadog, CloudWatch ou custom. Il s'intègre avec les ingress controllers et service meshes pour le traffic shifting fin.
Informations essentielles
Origine : argoproj → CNCF Incubating · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Documentation · GitHub · Releases
Support : CNCF Incubating. Actif, utilisé en production chez Netflix, Intuit, Bloomberg.
Stack par défaut
| Composant | Valeur |
|---|---|
| CRD principale | Rollout (remplace Deployment) |
| Stratégies | canary, blueGreen |
| Analyse métriques | Prometheus, Datadog, New Relic, CloudWatch, Web (HTTP) |
| Traffic shifting | NGINX, ALB, Istio, Linkerd, Traefik, Contour, Apisix |
| CLI | Plugin kubectl kubectl argo rollouts |
| Dashboard | UI web intégrée (port 3100) |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.23+ |
| Ingress ou service mesh | Requis pour le traffic splitting (optionnel pour blue-green simple) |
| Prometheus | Requis pour l'analyse automatique des métriques (optionnel) |
Installation
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f \
https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
# Vérifier
kubectl get pods -n argo-rollouts
# argo-rollouts-controller Running
Plugin kubectl
curl -Lo kubectl-argo-rollouts \
https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
chmod +x kubectl-argo-rollouts
sudo mv kubectl-argo-rollouts /usr/local/bin/kubectl-argo-rollouts
kubectl argo rollouts version
Canary deployment
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: ghcr.io/org/my-app:1.0.0
ports:
- containerPort: 8080
strategy:
canary:
steps:
- setWeight: 20 # 20% du trafic vers la nouvelle version
- pause: {duration: 5m} # Pause 5 min, puis analyser
- setWeight: 40
- pause: {duration: 5m}
- setWeight: 60
- pause: {} # Pause indéfinie - promotion manuelle requise
- setWeight: 80
- pause: {duration: 5m}
Blue-Green deployment
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app-bg
spec:
replicas: 3
selector:
matchLabels:
app: my-app-bg
template:
metadata:
labels:
app: my-app-bg
spec:
containers:
- name: my-app
image: ghcr.io/org/my-app:1.0.0
strategy:
blueGreen:
activeService: my-app-active # Service production
previewService: my-app-preview # Service de preview (nouveau stack)
autoPromotionEnabled: false # Promotion manuelle
# Services associés
apiVersion: v1
kind: Service
metadata:
name: my-app-active
spec:
selector:
app: my-app-bg
ports:
- port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-app-preview
spec:
selector:
app: my-app-bg
ports:
- port: 80
targetPort: 8080
Analyse automatique des métriques
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
spec:
metrics:
- name: success-rate
interval: 1m
failureLimit: 3
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{status!~"5.."}[2m]))
/
sum(rate(http_requests_total[2m]))
successCondition: result[0] >= 0.95
Référencer l'AnalysisTemplate dans le Rollout :
strategy:
canary:
analysis:
templates:
- templateName: success-rate
startingStep: 2
steps:
- setWeight: 20
- pause: {duration: 2m}
- setWeight: 40
- pause: {duration: 2m}
Mise à jour
# Mettre à jour l'image d'un Rollout
kubectl argo rollouts set image my-app my-app=ghcr.io/org/my-app:2.0.0
# Suivre la progression
kubectl argo rollouts get rollout my-app --watch
Troubleshooting
# État d'un rollout
kubectl argo rollouts get rollout my-app
# Promouvoir manuellement (sortir d'une pause indéfinie)
kubectl argo rollouts promote my-app
# Rollback immédiat
kubectl argo rollouts undo my-app
# Logs du contrôleur
kubectl logs -n argo-rollouts -l app.kubernetes.io/name=argo-rollouts --tail=50
# Démarrer le dashboard (port 3100)
kubectl argo rollouts dashboard
Commandes utiles
kubectl argo rollouts list rollouts # Lister les rollouts
kubectl argo rollouts get rollout <nom> # État détaillé
kubectl argo rollouts set image <nom> <container>=<image> # Déclencher un déploiement
kubectl argo rollouts promote <nom> # Promouvoir manuellement
kubectl argo rollouts undo <nom> # Rollback
kubectl argo rollouts pause <nom> # Mettre en pause
kubectl argo rollouts resume <nom> # Reprendre
kubectl argo rollouts retry rollout <nom> # Rejouer un rollout échoué
Ressources
- Documentation : https://argo-rollouts.readthedocs.io/
- GitHub : https://github.com/argoproj/argo-rollouts
- Exemples : https://github.com/argoproj/argo-rollouts/tree/master/examples
- Releases : https://github.com/argoproj/argo-rollouts/releases