GitOps & CI/CD

Argo Rollouts

Progressive delivery Kubernetes - canary et blue-green avec analyse Prometheus/Datadog, rollback automatique, plugin kubectl. CNCF, argoproj. Apache 2.0.

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

ComposantValeur
CRD principaleRollout (remplace Deployment)
Stratégiescanary, blueGreen
Analyse métriquesPrometheus, Datadog, New Relic, CloudWatch, Web (HTTP)
Traffic shiftingNGINX, ALB, Istio, Linkerd, Traefik, Contour, Apisix
CLIPlugin kubectl kubectl argo rollouts
DashboardUI web intégrée (port 3100)

Prérequis

RessourceValeur
Kubernetes1.23+
Ingress ou service meshRequis pour le traffic splitting (optionnel pour blue-green simple)
PrometheusRequis 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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic