Kokil Thapa - Professional Web Developer in Nepal
Freelancer Web Developer in Nepal with 15+ Years of Experience

Kokil Thapa is an experienced full-stack web developer focused on building fast, secure, and scalable web applications. He helps businesses and individuals create SEO-friendly, user-focused digital platforms designed for long-term growth.

Progressive Delivery with Argo Rollouts

By Kokil Thapa | Last reviewed: September 2026

Progressive Delivery with Argo Rollouts turns risky Kubernetes deploys into controlled, measurable releases. A plain Deployment swap replaces every pod at once. That works until a bad build slips through CI. Argo Rollouts adds canary steps, traffic splitting, and automated analysis so you catch errors before most users do. If you already run GitOps with Argo CD or ship Laravel APIs behind an ingress controller, this is the next layer I recommend for production clusters.

What Is Progressive Delivery with Argo Rollouts?

Progressive delivery means releasing software in small, verified steps instead of one big cutover. You send a slice of traffic to the new version, watch error rates and latency, then promote or abort. Feature flags handle application-level toggles. Argo Rollouts handles infrastructure-level traffic control inside Kubernetes.

Argo Rollouts is a CNCF incubating project. It replaces the standard Deployment controller behaviour with a Rollout custom resource. You define steps like “send 20% traffic, wait five minutes, run a Prometheus query, then promote.” The controller manages ReplicaSets, updates Services, and coordinates with ingress controllers or service meshes.

Progressive Delivery with Argo RolloutsIngressNGINX / ALBRollout CRDCanary stepsAnalysisPrometheusStable v180% trafficCanary v220% trafficRollbackOn metric failPromote only after analysis passes each stepAbort reverts traffic to stable ReplicaSet
Progressive Delivery with Argo Rollouts splits traffic between stable and canary pods while Prometheus analysis gates each promotion step

The mental model is simple. Stable pods serve most users. Canary pods receive a growing share. Metrics decide whether the rollout continues. Failed analysis triggers an automatic rollback. That beats watching a dashboard and clicking “undo” at 2 a.m.

How Does Argo Rollouts Differ from Standard Kubernetes Deployments?

A native Deployment supports maxSurge and maxUnavailable for rolling updates. It does not natively split traffic between two versions or pause for metric checks. You can hack this with two Deployments and manual ingress weight changes. That gets messy fast.

Argo Rollouts adds first-class canary and blue-green strategies. It integrates with NGINX Ingress, AWS ALB, Istio, Linkerd, SMI, and Traefik for traffic routing. It also ships an AnalysisRun CRD that queries Prometheus, Datadog, New Relic, or webhooks.

FeatureKubernetes DeploymentArgo Rollouts
Traffic splittingManual or externalBuilt-in with ingress/mesh plugins
Automated rollbackNot built-inAnalysis-driven abort
Blue-greenTwo Deployments + scriptsSingle Rollout resource
Pause and promotekubectl rollout pause onlyStep-based canary with timers
GitOps fitWorks with Argo CDSame; Rollout is a CRD
Learning curveLowModerate

For teams running Linux and Kubernetes infrastructure in Nepal, the trade-off is operational complexity versus deploy safety. A three-person team on a single cluster may start with simple rolling updates. Once you serve paying customers through an API gateway, Argo Rollouts pays for itself after the first bad release it catches.

How Do You Install Argo Rollouts on a Kubernetes Cluster?

Installation takes minutes on any cluster with kubectl access. You need cluster-admin for the initial CRD install. Pin a release tag rather than pulling latest in production.

Install the controller and CRDs

kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f \
  https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

kubectl argo rollouts version

Install the kubectl plugin for CLI visibility. On Linux amd64:

curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
chmod +x kubectl-argo-rollouts-linux-amd64
sudo mv kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts

Verify the controller pod is running:

kubectl get pods -n argo-rollouts
kubectl argo rollouts dashboard

The dashboard runs locally and shows live rollout status. It is useful during your first canary experiments. For production, wire alerts through Prometheus and Alertmanager instead of staring at UI panels.

Enable your ingress or mesh integration

Pick one traffic provider and enable its plugin. For NGINX Ingress:

kubectl apply -n argo-rollouts -f \
  https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml

kubectl patch deployment argo-rollouts -n argo-rollouts --type='json' \
  -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--nginx-ingress-classes=nginx"}]'

Consult the official Argo Rollouts NGINX traffic management docs for your ingress class name. Mesh integrations follow similar patterns with Istio VirtualServices or SMI TrafficSplit resources.

How Do You Configure a Canary Rollout with Argo Rollouts?

Below is a practical canary Rollout for a stateless API. It mirrors patterns I use when containerising Laravel services behind Kubernetes. The app itself might be PHP 8.3 on Laravel 12, but the rollout YAML is framework-agnostic.

Define the Rollout manifest

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: api-rollout
  namespace: production
spec:
  replicas: 6
  strategy:
    canary:
      canaryService: api-canary
      stableService: api-stable
      trafficRouting:
        nginx:
          stableIngress: api-ingress
          annotationPrefix: nginx.ingress.kubernetes.io
          additionalIngressAnnotations:
            canary-by-header: X-Canary
      steps:
        - setWeight: 10
        - pause: {duration: 5m}
        - analysis:
            templates:
              - templateName: success-rate
            args:
              - name: service-name
                value: api-canary.production.svc.cluster.local
        - setWeight: 30
        - pause: {duration: 5m}
        - setWeight: 60
        - pause: {duration: 5m}
        - setWeight: 100
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
        - name: api
          image: registry.example.com/api:2.4.1
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5

Key fields deserve attention. canaryService and stableService point to two ClusterIP Services the controller manages. The steps array defines the progressive delivery cadence. Each setWeight shifts ingress traffic. Each pause gives metrics time to stabilise.

Canary Step SequenceDeploy v210% weightAnalysis30% weight100%At each pause windowPrometheus checks 5xx rate and p99 latencyPass → next stepFail → abort and rollbackStable ReplicaSet keeps serving traffic
Argo Rollouts canary strategy promotes through weighted steps with analysis gates between each traffic increase

Pair Services and an AnalysisTemplate

Create stable and canary Services that select the same label. Argo Rollouts patches pod labels during the rollout. Then define an AnalysisTemplate:

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: success-rate
  namespace: production
spec:
  args:
    - name: service-name
  metrics:
    - name: error-rate
      interval: 1m
      count: 5
      successCondition: result[0] < 0.02
      failureLimit: 2
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            sum(rate(http_requests_total{service="{{args.service-name}}",status=~"5.."}[2m]))
            /
            sum(rate(http_requests_total{service="{{args.service-name}}"}[2m]))

This query fails the step if the canary error rate exceeds 2% across five one-minute intervals. Tune thresholds to your SLO. A booking API on a project like Adventure Third Pole Trek might tolerate slightly higher latency during low season. A payment endpoint should be stricter.

Trigger and watch the rollout

  1. Apply the Rollout, Services, Ingress, and AnalysisTemplate manifests.
  2. Change the container image tag in Git or patch the Rollout directly.
  3. Run kubectl argo rollouts get rollout api-rollout -n production --watch.
  4. Confirm traffic weights shift on the ingress controller.
  5. Verify Prometheus receives canary metrics with correct labels.

Manual promotion is also supported. Add - pause: {} without a duration to wait for human approval. That hybrid model suits regulated workloads where automation and sign-off coexist.

How Do Blue-Green Deployments Work in Argo Rollouts?

Blue-green swaps all traffic at once after the new version passes checks. It suits apps that cannot run two versions simultaneously, or teams that want instant rollback by switching Service selectors.

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: web-rollout
spec:
  replicas: 4
  strategy:
    blueGreen:
      activeService: web-active
      previewService: web-preview
      autoPromotionEnabled: false
      prePromotionAnalysis:
        templates:
          - templateName: success-rate
        args:
          - name: service-name
            value: web-preview.default.svc.cluster.local
      scaleDownDelaySeconds: 30
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: registry.example.com/web:7.1.0
          ports:
            - containerPort: 80

With autoPromotionEnabled: false, the new ReplicaSet runs behind the preview Service until you promote. QA hits the preview URL. Analysis runs against preview traffic. Promotion switches the active Service to the new pods. The old ReplicaSet scales down after scaleDownDelaySeconds.

Blue-green uses more resources during the overlap window. Budget for double pod capacity during deploys. On a cost-sensitive Nepal startup cluster, schedule blue-green deploys off-peak.

What Are Common Production Gotchas with Argo Rollouts?

Most failures I see are configuration gaps, not controller bugs. Address these before your first production canary.

  • Missing readiness probes. Unready canary pods still receive traffic if probes are absent. Always define HTTP or TCP readiness checks.
  • Metric label mismatch. Prometheus queries must filter on labels your ServiceMonitor or scrape config actually emits.
  • Session affinity conflicts. Sticky sessions on NGINX can skew canary measurement. Test with affinity off first.
  • Database migrations. Backward-incompatible schema changes break canary deploys. Ship expand-contract migrations separately.
  • Resource limits. Doubling ReplicaSets during blue-green spikes node CPU. Set requests and limits on both stable and canary pods.
  • GitOps drift. If Argo CD manages the Rollout, ensure sync policies allow the controller to patch Services and Ingress annotations.
Canary vs Blue-Green DecisionNew deploy strategy?Two versions OK?Same schema/APISingle version only?Breaking changeUse CanaryGradual traffic shiftUse Blue-GreenPreview then swapCombine with feature flags for app-level control
Choose canary when both versions can run together; choose blue-green when you need a clean cutover after preview validation

If your team still deploys PHP apps with Deployer 7 symlink releases on a single VM, Argo Rollouts is not your first step. Move to containers and a managed cluster first. Then add progressive delivery. The path from enterprise application development on bare metal to Kubernetes is incremental. Rollouts fit the Kubernetes stage, not the Apache vhost stage.

How Do You Integrate Argo Rollouts with GitOps and CI Pipelines?

Argo Rollouts works cleanly with Argo CD. Store Rollout manifests in Git. Argo CD syncs them. CI builds and pushes a new image tag. A bot or pipeline commits the tag bump. The Rollout controller starts the canary automatically.

A typical pipeline for a Laravel API might look like this:

  1. Run PHPUnit and static analysis in GitLab CI.
  2. Build a container image with PHP 8.3 and push to your registry.
  3. Update the image tag in the Rollout manifest via Kustomize or Helm.
  4. Argo CD detects the commit and syncs.
  5. Argo Rollouts executes canary steps and analysis.
  6. Slack or PagerDuty alerts fire on abort.

This mirrors the GitLab CI plus Deployer workflow I run on EC2, but with pod-level control instead of symlink swaps. For JSON manifest linting in CI, a local JSON formatter and validator catches syntax errors before they hit the cluster.

Keep image tags immutable. Never reuse :latest in production Rollouts. Pin digests or semver tags so rollbacks target a known artefact. The same discipline applies when you add automated review steps to CI—every deploy artefact should be traceable to a commit SHA.

GitOps + Progressive Delivery PipelineGit PushCI tests passBuild ImagePush registryArgo CD SyncGit manifestRolloutCanary stepsObservability layerPrometheus metricsStructured logsTrace IDsAnalysisRun queries SLOs before each promotion
Progressive Delivery with Argo Rollouts closes the loop between CI image builds, GitOps sync, and metric-gated promotion

For multi-cluster setups, consider whether you need active-active failover first. Read active-active versus active-passive multi-cloud patterns before wiring cross-region rollouts. Progressive delivery per cluster is simpler than coordinated global traffic shifts.

Key Takeaways

  • Progressive Delivery with Argo Rollouts adds canary, blue-green, and automated analysis to Kubernetes without replacing your existing GitOps flow.
  • Start with a single canary Rollout on a non-critical service; validate Prometheus queries before touching production APIs.
  • Pair rollouts with readiness probes, backward-compatible migrations, and immutable image tags—YAML alone does not prevent bad deploys.
  • Use canary when two versions can coexist; use blue-green when you need preview validation before a full traffic swap.
  • Integrate abort alerts with Alertmanager so failed analysis pages the on-call engineer immediately.
  • VM-based Deployer workflows and Kubernetes progressive delivery solve different problems—containerise first, then add Rollouts.

People Also Ask

Is Argo Rollouts the same as Argo CD?

No. Argo CD syncs Git manifests to the cluster. Argo Rollouts manages how new pod versions receive traffic during an update. They complement each other. Argo CD deploys the Rollout resource; Argo Rollouts executes the canary or blue-green strategy defined inside it.

Can you run Argo Rollouts without a service mesh?

Yes. NGINX Ingress, AWS ALB, Traefik, and Gateway API providers all support traffic splitting through Rollouts integrations. A mesh adds finer-grained routing but is not required for basic canary deploys.

What happens when analysis fails during a canary?

The Rollout aborts. Traffic reverts to the stable ReplicaSet. Canary pods scale down. The controller marks the revision as degraded. You fix the image or config, then trigger a new rollout. No manual ingress weight editing is needed.

Does Argo Rollouts work with Helm and Kustomize?

Yes. Rollout manifests live alongside Deployment YAML in Helm charts or Kustomize overlays. Reference AnalysisTemplates by name. Kustomize patches work for image tag updates in CI pipelines.

Ship Safer Releases with Progressive Delivery

Progressive Delivery with Argo Rollouts gives you measurable, reversible Kubernetes deploys. You define the steps once. Metrics gate every promotion. Failed releases roll back before customers notice. That is the standard I aim for when moving client APIs from single-server Deployer releases to container platforms.

Start small. One Rollout, one AnalysisTemplate, one service with solid observability. Expand once the first canary completes without manual intervention. If you want help designing a deploy pipeline for a Laravel, Symfony, or custom API workload, contact us about your infrastructure goals. You can also explore testing and optimization services or review production platforms we maintain for real-world deploy patterns.

For ongoing cluster work, pair Rollouts with support and maintenance and solid API development practices. Validate YAML in CI with a regex tester for log parsing rules tied to your analysis queries. Read more on the blog, browse the full services overview, or learn about my background in shipping production systems since 2010.

Official references: the Argo Rollouts documentation and the Kubernetes Deployment guide cover controller behaviour and native rolling update semantics. Use both when designing your strategy.

Frequently Asked Questions

A Kubernetes controller that extends deployments with canary and blue-green strategies, weighted traffic shifts, and metric-based analysis so you promote new versions gradually and roll back automatically when health checks fail.

A native Deployment supports maxSurge and maxUnavailable rolling updates but cannot natively split traffic between two versions or pause for metric checks. Argo Rollouts adds first-class canary and blue-green strategies, built-in traffic splitting through ingress or mesh plugins, and AnalysisRun-driven automated rollback. You define step-based promotion with timers and Prometheus queries instead of hacking two Deployments and manual ingress weight changes.

You need cluster-admin for the initial CRD install. Create the argo-rollouts namespace, apply the official install.yaml from a pinned release tag rather than latest, and install the kubectl-argo-rollouts CLI plugin on Linux amd64. Verify the controller pod is running with kubectl get pods. The local dashboard helps during first canary experiments; wire production alerts through Prometheus and Alertmanager instead of relying on UI panels.

Define a Rollout CRD with canaryService and stableService pointing to two ClusterIP Services, a trafficRouting block for your ingress provider such as NGINX, and a steps array mixing setWeight, pause durations, and analysis templates. Pair it with an AnalysisTemplate that queries Prometheus for metrics like error rate. Apply the Rollout, Services, Ingress, and AnalysisTemplate, then change the container image tag in Git or patch the Rollout and watch with kubectl argo rollouts get rollout --watch.

Choose canary when both application versions can run together and you want gradual traffic shifts with metric gates at each step. Choose blue-green when you need preview validation before a full cutover, or when the app cannot run two versions simultaneously. Blue-green swaps all traffic at once after checks pass; canary grows traffic through weighted steps like 10%, 30%, 60%, then 100%.

No. Argo CD syncs Git manifests to the cluster. Argo Rollouts manages how new pod versions receive traffic during an update. They complement each other in a GitOps workflow.

Yes. NGINX Ingress, AWS ALB, Traefik, and Gateway API providers all support traffic splitting through Rollouts integrations. Enable the matching plugin on the controller, for example patching the argo-rollouts deployment with --nginx-ingress-classes=nginx. A service mesh like Istio or Linkerd adds finer-grained routing but is not required for basic canary deploys on a single cluster.

The Rollout aborts, traffic reverts to the stable ReplicaSet, canary pods scale down, and the controller marks the revision as degraded. You fix the image or config and trigger a new rollout without manually editing ingress weights.

Most failures are configuration gaps. Missing readiness probes let unready canary pods receive traffic. Prometheus queries must match labels your scrape config actually emits. Sticky sessions on NGINX can skew canary measurement. Backward-incompatible database migrations break canary deploys, so ship expand-contract migrations separately. Blue-green doubles ReplicaSets and spikes node CPU if resource limits are unset. With Argo CD, ensure sync policies allow the controller to patch Services and Ingress annotations.

Store Rollout manifests in Git and let Argo CD sync them. CI builds and pushes a new container image, then commits an image tag bump via Kustomize or Helm. The Rollout controller starts the canary automatically and runs analysis steps. A typical pipeline runs tests in GitLab CI, builds the image, updates the Rollout manifest, Argo CD syncs, and Slack or PagerDuty alerts fire on abort. Keep image tags immutable and pin digests or semver tags, never reuse latest in production.

Blue-green uses more resources during the overlap window because both old and new ReplicaSets run simultaneously. Budget for roughly double pod capacity during deploys. On a cost-sensitive startup cluster, schedule blue-green deploys off-peak. Canary uses fewer overlapping pods but still requires headroom for canary replicas alongside stable ones.

Create an AnalysisTemplate CRD with metrics that query Prometheus, Datadog, New Relic, or webhooks. Define interval, count, successCondition, and failureLimit per metric. A practical example queries canary error rate over two-minute windows and fails if it exceeds 2% across five one-minute intervals. Reference the template by name in rollout steps. Tune thresholds to your SLO; payment endpoints need stricter limits than low-traffic booking APIs.

Yes. Rollout manifests live alongside standard Deployment YAML in Helm charts or Kustomize overlays. Reference AnalysisTemplates by name in your rollout steps. Kustomize patches work well for image tag updates in CI pipelines, letting GitOps tooling sync the updated Rollout without restructuring your existing manifest layout.

If your team still deploys PHP applications with Deployer 7 symlink releases on a single VM, Argo Rollouts is not your starting point. Move to containers and a managed Kubernetes cluster first, then add progressive delivery. A three-person team on a single cluster may begin with simple rolling updates until paying customers depend on an API gateway and a bad release justifies the operational complexity.

Start with a single canary Rollout on a non-critical service and validate Prometheus queries before touching production APIs. Always define HTTP or TCP readiness probes on canary and stable pods. Pair rollouts with backward-compatible migrations and immutable image tags because YAML alone does not prevent bad deploys. Integrate abort alerts with Alertmanager so failed analysis pages the on-call engineer immediately. Pin controller release tags rather than pulling latest, and test session affinity off before enabling sticky sessions during canary measurement.

Share this article

0 Comments

Leave a comment

Your email is not published. Comments appear once they have been read. Sign in to have your details filled in.

Quick Contact Options
Choose how you want to connect me: