Progressive Delivery for GitOps Pipelines
You've mastered ArgoCD. Now let's master promotion.
Someone opens a PR to change a tag in staging, then another for prod. Error-prone, slow.
CI pipelines cobble together sed/yq commands. Fragile, hard to audit.
"Just merge to main and let ArgoCD sync." No gates, no verification, no rollback plan.
A Kubernetes-native promotion engine
built for GitOps workflows.
Kargo is a progressive delivery tool that manages the lifecycle of changes as they move through a series of stages (environments).
It watches for new versions, packages them as Freight, and promotes them through your pipeline — automatically or with approval gates.
Think: "GitOps promotion pipeline as a Kubernetes resource"
ArgoCD (or Flux) still does the actual sync. Kargo orchestrates what gets promoted where.
Kargo does not build images or run tests. It consumes artifacts that CI already produced.
It complements your existing GitOps stack. It fills the gap ArgoCD intentionally leaves open.
1. What is the primary purpose of Kargo?
2. What does Kargo do when it detects a new container image version?
3. Which tool actually syncs Kubernetes resources to the cluster?
Each is a Kubernetes Custom Resource. Let's meet them one by one.
A Project is a namespace-scoped grouping of all Kargo resources for a particular application or team.
apiVersion: kargo.akuity.io/v1alpha1
kind: Project
metadata:
name: my-app
A Warehouse watches for new versions of your artifacts — container images, Git commits, or Helm charts.
Think: "The warehouse receives new shipments and packages them for delivery."
Freight is an immutable collection of artifact references that travel together through your pipeline.
Think: "A sealed box of changes. Same box goes dev → staging → prod."
A Stage represents an environment or checkpoint in your delivery pipeline.
A Promotion is a request to move specific Freight to a specific Stage.
1. What does a Warehouse do in Kargo?
2. What is Freight?
3. What is a Kargo Project?
Syncs desired state from Git to cluster. Detects drift. Handles rollout. Deploys.
Updates Git with new versions. Orchestrates which version goes where. Promotes.
CI builds image v1.2.3
↓
Warehouse detects new image
↓
Freight created with image:v1.2.3
↓
Promotion updates values.yaml in Git (image.tag: v1.2.3)
↓
ArgoCD sees Git change, syncs to cluster
↓
Verification confirms health
Serves the Kargo API and UI. Handles RBAC and authentication.
Reconciles Kargo resources. Watches Warehouses, manages Freight, executes Promotions.
Project, Warehouse, Freight, Stage, Promotion — all stored in the Kubernetes API.
Validates and mutates Kargo resources on creation/update.
Kargo is installed via Helm into your Kubernetes cluster.
# Add the Kargo Helm repo
helm repo add kargo https://charts.kargo.io
helm repo update
# Install Kargo
helm install kargo kargo/kargo \
--namespace kargo \
--create-namespace \
--set api.adminAccount.enabled=true \
--set api.adminAccount.password=admin \
--set api.adminAccount.tokenSigningKey=shared-signing-key
# Check pods are running
kubectl get pods -n kargo
# Expected output:
# kargo-api-... Running
# kargo-controller-... Running
# kargo-webhooks-... Running
# Check CRDs installed
kubectl get crds | grep kargo
# freights.kargo.akuity.io
# projects.kargo.akuity.io
# promotions.kargo.akuity.io
# stages.kargo.akuity.io
# warehouses.kargo.akuity.io
# Access the UI via port-forward
kubectl port-forward svc/kargo-api -n kargo 8443:443
# Install the CLI
brew install akuity/tap/kargo # macOS
# Login
kargo login https://localhost:8443 \
--admin --password admin --insecure-skip-tls-verify
# Common commands
kargo get projects
kargo get stages --project my-app
kargo get freight --project my-app
kargo promote --project my-app \
--stage staging \
--freight abc123def
1. How is Kargo typically installed on a Kubernetes cluster?
2. In the Kargo + ArgoCD workflow, who updates the Git repository with new image tags?
3. Which Kargo component reconciles resources and executes Promotions?
Let's create a simple project that promotes a web app through dev → staging → prod.
apiVersion: kargo.akuity.io/v1alpha1
kind: Project
metadata:
name: my-web-app
spec:
promotionPolicies:
- stage: dev
autoPromotionEnabled: true
- stage: staging
autoPromotionEnabled: false
- stage: prod
autoPromotionEnabled: false
# Apply the project
kubectl apply -f project.yaml
# Verify - a namespace is created
kubectl get ns my-web-app
# Check the project
kargo get projects
# NAME AGE
# my-web-app 5s
# The namespace is where all your
# Warehouses, Stages, and Freight will live
Next module: We'll create a Warehouse and see Freight appear automatically!
Module 02: Warehouses & Freight
The watchtower that spots new versions and the packages that carry them.