Skip to content
Go back

Argo Workflows vs Tekton

By SumGuy 12 min read
Argo Workflows vs Tekton

Jenkins on K8s is Still a Mistake

It’s 2026, and teams are still running Jenkins agents on Kubernetes like it’s a hotel lobby: take up twice as much space as you need, nobody’s happy, and everything’s held together with duct tape.

The Kubernetes-native CI/CD revolution happened. You probably just haven’t switched yet.

Two CNCF projects have matured into genuinely solid pipeline engines that actually understand Kubernetes: Argo Workflows and Tekton. Both are battle-tested, both run your pipelines as Kubernetes workloads (no agents, no VMs, just pods), both treat K8s secrets as first-class citizens, and both let the Kubernetes scheduler decide where to run your jobs. No more Jenkins controller eating 4 GB of RAM just to exist.

But here’s the thing: they’re built on different philosophies. One thinks in directed acyclic graphs (DAGs) and excels at batch processing and ML pipelines. The other thinks in tasks and is laser-focused on CI builds. Both are excellent. They’re just different.

Let’s be honest about what you’re actually getting with each.


Why Kubernetes-Native Matters

Before we get into the weeds, understand why you should care about K8s-native pipelines at all.

Jenkins on Kubernetes means:

This is a paradigm shift from “Jenkins manages everything” to “Kubernetes manages everything, and CI/CD is just one more workload.”


Argo Workflows: The DAG Pipeline Engine

Argo Workflows thinks in directed acyclic graphs. Your pipeline is a DAG: steps have dependencies, steps can run in parallel, and the execution flow is fully visualized.

Philosophy

Argo Workflows was built for tasks that care about orchestration complexity. Machine learning pipelines. Data engineering. Batch processing. Anything where steps depend on each other’s outputs and you need fine-grained control over parallelism.

A Workflow is a Kubernetes CRD that describes:

The Workflow Model

workflow.yaml
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
generateName: data-pipeline-
namespace: workflows
spec:
entrypoint: main
serviceAccountName: argo-workflow
arguments:
parameters:
- name: dataset-url
value: "s3://bucket/data.csv"
volumeClaimTemplates:
- metadata:
name: work
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
templates:
- name: main
dag:
tasks:
- name: fetch
template: fetch-data
arguments:
parameters:
- name: url
value: "{{workflow.parameters.dataset-url}}"
- name: process
dependencies: fetch
template: process-data
arguments:
artifacts:
- name: dataset
from: "{{tasks.fetch.outputs.artifacts.dataset}}"
- name: analyze
dependencies: process
template: analyze-results
arguments:
artifacts:
- name: processed
from: "{{tasks.process.outputs.artifacts.processed}}"
- name: fetch-data
inputs:
parameters:
- name: url
container:
image: curlimages/curl:latest
command: [sh, -c]
args:
- |
curl -o /tmp/data.csv {{inputs.parameters.url}}
outputs:
artifacts:
- name: dataset
path: /tmp/data.csv
s3:
bucket: argo-artifacts
key: "{{workflow.uid}}/data.csv"
endpoint: minio:9000
insecure: true
accessKeySecret:
name: argo-artifact-repo
key: accesskey
secretKeySecret:
name: argo-artifact-repo
key: secretkey
- name: process-data
inputs:
artifacts:
- name: dataset
path: /data/input.csv
container:
image: python:3.11
command: [python]
args:
- |
import pandas as pd
df = pd.read_csv('/data/input.csv')
df_processed = df.dropna()
df_processed.to_csv('/data/processed.csv', index=False)
outputs:
artifacts:
- name: processed
path: /data/processed.csv
s3:
bucket: argo-artifacts
key: "{{workflow.uid}}/processed.csv"
endpoint: minio:9000
insecure: true
accessKeySecret:
name: argo-artifact-repo
key: accesskey
secretKeySecret:
name: argo-artifact-repo
key: secretkey
- name: analyze-results
inputs:
artifacts:
- name: processed
path: /data/processed.csv
container:
image: python:3.11
command: [python]
args:
- |
import pandas as pd
df = pd.read_csv('/data/processed.csv')
print(f"Rows: {len(df)}")
print(df.describe())

See what just happened? One YAML file defined a three-step pipeline with dependencies, artifact passing, and parameter injection. The DAG is explicit. Running this:

Terminal window
kubectl apply -f workflow.yaml
kubectl get workflows -n workflows -w
kubectl logs <workflow-name> -c main -n workflows

Argo generates pods for each step, manages their lifecycle, passes outputs as artifacts, and gives you a web UI showing the DAG in real-time.

Strengths

Weaknesses


Tekton: The Task-Based Build Engine

Tekton thinks in tasks and pipelines. A Task is a reusable unit of work (like “build a container image”). A Pipeline stitches tasks together. A PipelineRun executes a pipeline for a specific Git commit.

Philosophy

Tekton was built for CI builds. The mental model is: “I have steps that run in a container, they share a workspace, and they produce artifacts. Let me compose these into a pipeline.”

Unlike Argo’s DAG template language, Tekton’s tasks are concrete and opinionated: each task gets a pod, each step in the task is a container in that pod (via init containers and sidecars), and shared data lives in a PersistentVolume (the workspace).

The Task and Pipeline Model

pipeline.yaml
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: git-clone
namespace: tekton-pipelines
spec:
params:
- name: url
type: string
- name: revision
type: string
default: main
workspaces:
- name: output
steps:
- name: clone
image: cgr.dev/chainguard/git:latest
script: |
git clone --depth 1 --branch $(params.revision) $(params.url) $(workspaces.output.path)
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: build-image
namespace: tekton-pipelines
spec:
params:
- name: image-ref
type: string
workspaces:
- name: source
steps:
- name: build
image: gcr.io/kaniko-project/executor:latest
args:
- --dockerfile=Dockerfile
- --context=$(workspaces.source.path)
- --destination=$(params.image-ref)
- --snapshot-mode=redo
---
apiVersion: tekton.dev/v1
kind: Task
metadata:
name: run-tests
namespace: tekton-pipelines
spec:
params:
- name: test-command
type: string
default: "pytest"
workspaces:
- name: source
steps:
- name: test
image: python:3.11
workingDir: $(workspaces.source.path)
script: |
pip install -r requirements.txt
$(params.test-command)
---
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: ci-pipeline
namespace: tekton-pipelines
spec:
params:
- name: git-repo-url
type: string
- name: git-revision
type: string
default: main
- name: image-ref
type: string
workspaces:
- name: workspace
tasks:
- name: clone
taskRef:
name: git-clone
params:
- name: url
value: $(params.git-repo-url)
- name: revision
value: $(params.git-revision)
workspaces:
- name: output
workspace: workspace
- name: test
taskRef:
name: run-tests
runAfter:
- clone
params:
- name: test-command
value: "pytest -v"
workspaces:
- name: source
workspace: workspace
- name: build
taskRef:
name: build-image
runAfter:
- test
params:
- name: image-ref
value: $(params.image-ref)
workspaces:
- name: source
workspace: workspace

Running this pipeline:

pipelinerun.yaml
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: ci-run-
namespace: tekton-pipelines
spec:
pipelineRef:
name: ci-pipeline
params:
- name: git-repo-url
value: "https://github.com/your-org/your-repo"
- name: git-revision
value: main
- name: image-ref
value: "us.gcr.io/your-project/your-image:latest"
workspaces:
- name: workspace
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
serviceAccountName: tekton-runner

Submit it:

Terminal window
kubectl apply -f pipelinerun.yaml
kubectl get pipelinerun -n tekton-pipelines -w
tkn pipelinerun logs -L -n tekton-pipelines

Each PipelineRun gets a pod. The pipeline’s tasks become steps in that pod. Tekton Triggers can watch a webhook and fire off PipelineRuns automatically.

Strengths

Weaknesses


Head-to-Head Comparison

AspectArgo WorkflowsTekton
ModelDAG-based; template languageTask-based; pipeline composition
Best forML, batch, data pipelinesCI/CD builds
Artifact sharingS3-compatible repo (built-in)Workspace (manual PVC management)
Parameter passingJSON, typedString interpolation
CRD learning curveSteep; lots of conceptsGentler; tasks are intuitive
Reusable componentsTemplates; less discoverableTasks; Tekton Hub integration
Web UISharp, DAG visualizationFunctional, task-focused
External triggeringArgo Events (webhooks, Kafka, Cron)Tekton Triggers (webhooks, EventListeners)
DebuggingGood; parameter tracing, artifact inspectionGood; step logs, clear failures
Ecosystem pairingArgo CD (full GitOps)Standalone; integrates with any deployer
Secrets handlingK8s Secrets (native)K8s Secrets (native)
MaturityVery stable (5+ years CNCF)Very stable (5+ years CNCF)

When to Choose Argo Workflows

Choose Argo if you have:


When to Choose Tekton

Choose Tekton if you have:


The Real Difference: Philosophy

Here’s what separates them:

Argo Workflows asks: “What if we made a Kubernetes-native orchestration engine for complex, interdependent workloads?” The answer is a rich, flexible DAG engine that’s overkill for CI but perfect for ML/data pipelines.

Tekton asks: “What if we made CI/CD that’s just tasks and pipelines, no Jenkins cruft?” The answer is a focused, composable system that feels familiar to anyone who’s written a shell script.

Neither is “better.” They’re solving different problems.


Integration with Your Stack

With Argo CD

If you’re using Argo CD for GitOps deployments, Argo Workflows is the natural fit:

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: my-project
spec:
namespaceResourceBlacklist:
- group: argoproj.io
kind: Workflow

Your Argo CD applications can trigger Workflows via webhooks or Argo Events, creating a full CI/CD + orchestration platform.

With Other Deployers

If you’re using Helm, Flux, kustomize, or custom operators for deployments, Tekton integrates cleanly because it’s agnostic:

Terminal window
# Tekton runs the pipeline
tkn pipeline start my-build --param image=myimage:latest
# Your deployer handles the deployment
kubectl apply -f deployment.yaml
# or helm upgrade, or flux reconcile, etc.

The Verdict

Jenkins is dead. Both of these tools prove it. You get K8s scheduling, declarative pipelines, secrets integration, and zero agent overhead.

If you’re building an ML data processing platform or complex batch workflows, Argo Workflows is your friend. The DAG model shines. Invest in learning the Workflow spec; it’s dense but worth it.

If you’re a DevOps team running CI/CD, Tekton is the path of least resistance. Tasks are composable, webhooks just work, and the learning curve is gentler. Your developers will thank you.

And here’s the thing: in 2026, both are production-ready, battle-tested, and backed by serious CNCF investment. You don’t have a “wrong” choice here. You have a philosophy choice. Pick the one that matches your workload, commit, and never look back at Jenkins again.

Your 2 AM self will appreciate it.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it'll show up above once verified.


Next Post
iperf3 + nload: Network Diagnosis

Discussion

Powered by Garrul . Sign in with GitHub or Google, or post anonymously.

Related Posts