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
# 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:2746Ce 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
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: whalesayCe 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
Workflow avec paramètres et DAG
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
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
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.txtArtifacts 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
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: argoConfigMap 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/limitspar template pour QoS. - Retry policies :
retryStrategy.backoff.maxDuration: 3600pour résilience. - Parallelism :
parallelism: 20au 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.