Skip to content
Learni
Voir tous les tutoriels
DevOps

Comment maîtriser Argo Workflows en 2026

Read in English

Introduction

Argo Workflows est un moteur de workflows natif Kubernetes, idéal pour orchestrer des pipelines CI/CD, ML ou ETL complexes. Contrairement à Jenkins ou Airflow, il s'exécute directement dans le cluster, utilisant des CRDs pour définir des DAGs (Directed Acyclic Graphs) de conteneurs. En 2026, avec Kubernetes 1.32+, Argo excelle dans les environnements cloud-native grâce à son scaling horizontal, son support artifacts (S3, GCS) et son UI intuitive.

Ce tutoriel expert vous guide pas à pas : de l'installation Helm à des workflows avancés avec paramètres, loops et volumes partagés. Vous apprendrez à éviter les pièges de performance et à sécuriser avec RBAC. À la fin, vous maîtriserez des pipelines production-ready, bookmarqués par tout DevOps senior. (128 mots)

Prérequis

  • Cluster Kubernetes 1.28+ (Minikube, EKS, GKE)
  • kubectl configuré
  • Helm 3.14+
  • Namespace dédié (argo)
  • Connaissances avancées en YAML Kubernetes et conteneurs Docker

Installation via Helm

install-argo.sh
# Ajouter le repo Argo
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update

# Créer namespace
kubectl create namespace argo

# Installer Argo Workflows (version stable 2026)
helm install argo argo/argo-workflows \
  --namespace argo \
  --set server.service.type=LoadBalancer \
  --set workflows.defaultNamespace=argo \
  --set server.ingress.enabled=false

# Vérifier pods
kubectl get pods -n argo

# Port-forward pour UI (optionnel)
kubectl port-forward svc/argo-server -n argo 2746:2746

Ce script installe Argo via Helm dans le namespace 'argo' avec un service LoadBalancer pour l'UI. Il active le namespace par défaut pour workflows. Évitez les configs par défaut en prod : activez RBAC et persistence après. Vérifiez les pods 'Running' avant de continuer.

Accès à l'interface UI

Une fois installé, accédez à l'UI Argo via http://localhost:2746 (port-forward) ou l'IP LoadBalancer. L'UI visualise les DAGs en temps réel, logs conteneurs et artifacts. Utilisez kubectl -n argo create token workflow-controller pour l'auth basique. Analogie : comme un Grafana pour workflows, mais natif K8s.

Premier workflow simple

whalesay.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: whalesay-
  namespace: argo
spec:
  entrypoint: whalesay
  templates:
  - name: whalesay
    container:
      image: docker/whalesay
      command: [cowsay]
      args: ["hello world"]

---
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: hello-world-
  namespace: argo
spec:
  entrypoint: main
  templates:
  - name: main
    steps:
    - - name: print-message
        template: whalesay

Ce YAML définit deux workflows : un simple conteneur 'whalesay' et un avec steps composés. Soumettez via kubectl apply -f whalesay.yaml -n argo. Vérifiez status dans UI. Piège : oubliez le namespace 'argo' pour éviter 'NotFound'.

Soumission et monitoring

  • Soumettez : argo submit -n argo --watch whalesay.yaml
  • UI : Filtrez par label, visualisez DAG.
  • Logs : argo logs @latest -n argo
Exemple concret : Un workflow 'Succeeded' affiche le DAG vert ; 'Failed' zoome sur le nœud rouge pour debug.

Workflow avec paramètres et DAG

dag-params.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: dag-params-
  namespace: argo
spec:
  entrypoint: main
  arguments:
    parameters:
    - name: message
      value: "Argo en 2026"
  templates:
  - name: main
    dag:
      tasks:
      - name: generate
        template: generate
      - name: consume
        template: consume
        depends: generate
  - name: generate
    script:
      image: python:3.9
      command: [python]
      source: |
        import json
        print(json.dumps({"message": "{{workflow.parameters.message}}"}))
  - name: consume
    script:
      image: python:3.9
      command: [python]
      source: |
        import sys, json
        data = json.loads(sys.stdin.read())
        print(f"Consumed: {data['message']}")

DAG avec paramètres injectés et passage de données via stdout/stdin. Le task 'generate' produit JSON, 'consume' le lit. Soumettez avec --parameter message=Test. Piège : stdout >1MB échoue ; utilisez artifacts pour gros data.

Workflow avec loops et conditions

loop-condition.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: loop-condition-
  namespace: argo
spec:
  entrypoint: loop-example
  arguments:
    parameters:
    - name: loops
      value: "3"
  templates:
  - name: loop-example
    steps:
    - - name: loop-task
        template: loop-template
        arguments:
          parameters:
          - name: iteration
            value: "{{item}}
        withParam: "{{range $i := until {{workflow.parameters.loops}} }}{{ $i }}{{end}}"
    - - name: condition-task
        template: condition-template
        when: "{{steps.loop-task.status}} == Succeeded"
  - name: loop-template
    inputs:
      parameters:
      - name: iteration
    script:
      image: alpine
      command: [sh]
      source: echo "Iteration {{inputs.parameters.iteration}}"
  - name: condition-template
    script:
      image: alpine
      command: [sh]
      source: echo "Loop succeeded!"

Loop sur 'withParam' (until N), condition 'when' sur status précédent. Exécute 3 itérations puis check. Utile pour batch processing. Piège : 'withParam' string-only ; castez ints avec 'seq' pour ranges dynamiques.

Workflow avec artifacts S3

artifacts-s3.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: artifacts-s3-
  namespace: argo
spec:
  entrypoint: main
  volumeClaimTemplates:
  - metadata:
      name: workdir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi
  templates:
  - name: main
    steps:
    - - name: produce
        template: produce-artifact
    - - name: consume
        template: consume-artifact
        arguments:
          artifacts:
          - name: mydata
            from: "{{steps.produce.outputs.artifacts.mydata}}"
  - name: produce-artifact
    outputs:
      artifacts:
      - name: mydata
        path: /tmp/data.txt
    script:
      image: alpine
      volumeMounts:
      - name: workdir
        mountPath: /tmp
      command: [sh]
      source: |
        echo "Data from S3 producer" > /tmp/data.txt
  - name: consume-artifact
    inputs:
      artifacts:
      - name: mydata
        path: /tmp/input.txt
    script:
      image: alpine
      volumeMounts:
      - name: workdir
        mountPath: /tmp
      command: [sh]
      source: cat /tmp/input.txt

Artifacts locaux via PVC (workdir) pour partage entre steps. Remplacez par S3 en config globale Argo (configmap.artifactRepository.s3). Piège : PVC par workflow = contention ; utilisez ephemeral pour parallelism.

Configuration RBAC experte

rbac-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: workflow-controller-configmap
  namespace: argo
 data:
  artifactRepository: |
    s3:
      bucket: my-bucket
      endpoint: s3.amazonaws.com
      insecure: false
      accessKeySecret:
        name: s3-credentials
        key: accesskey
      secretKeySecret:
        name: s3-credentials
        key: secretkey
---
apiVersion: v1
kind: Secret
metadata:
  name: s3-credentials
  namespace: argo
data:
  accesskey: <base64-key>
  secretkey: <base64-secret>
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: argo-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: argo-workflow-controller
  namespace: argo

ConfigMap pour S3 artifacts, Secret pour creds, ClusterRoleBinding pour perms. Appliquez kubectl apply -f rbac-config.yaml -n argo ; kubectl rollout restart deployment/argo-server argo-workflow-controller -n argo. Piège : creds base64-only, pas plain-text.

Bonnes pratiques

  • Resource limits : Toujours set resources.requests/limits par template pour QoS.
  • Retry policies : retryStrategy.backoff.maxDuration: 3600 pour résilience.
  • Parallelism : parallelism: 20 au workflow-level pour scale.
  • Labels/Annotations : labels: {team: devops} pour filtrage UI/Grafana.
  • Persistence : MinIO pour artifacts locaux en dev, S3 en prod.

Erreurs courantes à éviter

  • Namespace mismatch : Workflows dans 'default' échouent si defaultNamespace=argo.
  • Artifact size : >500MB via stdin = OOM ; forcez PVC/S3.
  • Infinite loops : 'withItems' sans bounds = stuck ; testez avec 'until 1'.
  • RBAC too loose : Cluster-admin expose risques ; limitez à Workflow CRDs.

Pour aller plus loin

  • Docs officielles : Argo Workflows
  • Intégrez Argo Events/Rollouts pour event-driven.
  • Monitoring : Prometheus + Argo exporter.
Découvrez nos formations Learni DevOps pour Kubernetes avancé et Argo en prod.