How Do You Implement Progressive Delivery in Kubernetes?
Progressive delivery in Kubernetes shifts traffic gradually to new releases, catching bugs before they reach all users. A hands-on guide for enterprise teams.
Progressive delivery in Kubernetes is the practice of shipping a new release to a small fraction of production traffic first — a canary — and incrementally expanding that percentage only when metrics confirm the release is healthy. Rather than flipping every user to a new version at once, you expose 1–5% of traffic to the canary, observe error rate and latency against pre-defined thresholds for a fixed analysis window, then promote or roll back automatically based on what you measure. In 2026, progressive delivery is the dominant deployment model at mature engineering organizations: DORA research consistently shows that high-performing teams sustain significantly lower change failure rates by validating releases against production traffic before full exposure.
The challenge is not understanding why progressive delivery works — it is implementing it correctly. A canary that shifts traffic without metric analysis is a slow rollout, not a safe one. A canary that requires a manual rollback decision provides insurance only when someone is actively watching a dashboard at the moment a failure begins. Enterprise-grade progressive delivery requires automated analysis, tight integration with your observability stack, and a deployment workflow engineers can trust enough to run without babysitting. Two Kubernetes-native controllers make this achievable: Argo Rollouts and Flagger — each with a distinct model for how rollouts are specified and promoted.
This guide covers both tools end to end: how to choose between them, how to design a canary step strategy, how to wire in automated metric analysis and rollback, and how to integrate the entire pipeline with GitOps. Our cloud infrastructure team builds and operates progressive delivery pipelines for enterprise SaaS products. If you measure deployment frequency and change failure rate, our DORA metrics guide explains the benchmarks that make progressive delivery decisions measurable.
What Is Progressive Delivery and Why Does It Matter for Enterprise Kubernetes?
Progressive delivery extends continuous delivery by making each release a hypothesis test rather than a trust exercise. The hypothesis: the new version behaves at least as well as the current version under production traffic. The test: expose a controlled percentage of traffic to the new version and measure the delta in error rate, latency, and business metrics against a pre-defined acceptance threshold. If the hypothesis holds through each traffic increment, the release promotes. If it fails, the rollback is automatic and bounded — only the canary fraction of users was exposed.
For enterprise Kubernetes environments, the value is operational. Deployment risk is the product of blast radius and exposure time: how many users are affected, and for how long. A full direct rollout has a blast radius of 100% from the first second. A canary that starts at 5% and takes 30 minutes to promote has a worst-case blast radius of 5% for the analysis window — and that window is instrumented, not silent. Most production incidents originate from deployments. Progressive delivery does not eliminate deployment failures; it bounds their impact and makes rollback automatic.
Argo Rollouts vs Flagger: Choosing the Right Controller for Enterprise Kubernetes
Both Argo Rollouts and Flagger are CNCF-graduated projects, production-stable, and capable of managing canary, blue-green, and A/B rollout strategies across a wide range of metric providers and ingress backends. The decision is primarily about workflow model and ecosystem fit.
- →Argo Rollouts: replaces the Kubernetes Deployment resource with a custom Rollout CRD. You define traffic steps explicitly — 5%, 20%, 50%, 100% — with optional pause gates between them for manual approval or metric analysis. Tightly integrated with the ArgoCD GitOps ecosystem. Supports Prometheus, Datadog, NewRelic, CloudWatch, and 10+ other metric providers for automated AnalysisRun evaluation. Best fit for teams that want granular, step-by-step control over promotion and already run ArgoCD.
- →Flagger: operates on top of your existing Deployment resources without replacing them. Flagger watches a Deployment and manages traffic shifting automatically, driven by metric analysis at each step. Tighter coupling to the Flux CD ecosystem. Supports Prometheus, Datadog, NewRelic, CloudWatch, Dynatrace, and custom webhooks. Best fit for teams that want automatic, metric-driven promotion with minimal manifest changes and that run Flux.
- →Service mesh vs ingress: both tools support service mesh routing (Istio, Linkerd, AWS App Mesh) for weighted traffic splitting, and ingress-based routing (nginx-ingress, AWS ALB, Traefik, Contour) when you do not run a service mesh. Service mesh routing gives you finer-grained control — routing by header, user cohort, or tenant ID in addition to traffic percentage. Ingress-based routing is simpler to operate and sufficient for the majority of canary use cases.
- →For teams without an existing GitOps preference: Argo Rollouts gives more explicit, step-defined control; Flagger gives more automation with less configuration. Teams that want to approve each promotion step manually will prefer Argo Rollouts' pause-and-resume model. Teams that want fully autonomous promotion will prefer Flagger's automatic advancement.
How to Design a Canary Rollout Strategy: Traffic Steps, Metric Windows, and Promotion Gates
The shape of a canary rollout strategy — how many steps, how much traffic per step, how long each analysis window runs — depends on the service's traffic volume, SLO sensitivity, and deployment frequency. A payment processing service needs a more conservative step sequence than a stateless frontend serving cached content. There is no universal default.
- →Step 1 — Start at 1–5% and hold for a full analysis window. A 5-minute window at 5% traffic is the minimum for statistically meaningful error rate signals. For lower-traffic services receiving fewer than 1,000 requests per minute, extend the window to 10–15 minutes at this step to accumulate enough samples before the first promotion decision. Do not promote based on zero errors in a window that received fewer than 100 requests.
- →Step 2 — Scale by 2–3x at each subsequent step. A typical sequence: 5% → 10% → 25% → 50% → 100%. Each step triggers a fresh AnalysisRun (Argo Rollouts) or a fresh metric evaluation cycle (Flagger). For high-confidence releases with strong automated test coverage, you can compress the sequence: 10% → 50% → 100% with longer windows per step.
- →Step 3 — Define success criteria before writing any rollout spec. What constitutes a healthy canary for your service? Typical thresholds: error rate below 1%, p99 latency within 20% of baseline, no HTTP 5xx spikes. Write these as AnalysisTemplate resources (Argo Rollouts) or MetricTemplate resources (Flagger). Both tools evaluate the canary against these thresholds at each step and act automatically.
- →Step 4 — Add a manual pause gate at 50% for critical services. For services where a bad rollout can affect revenue or compliance, insert a pause between 50% and 100% that requires explicit human approval before full promotion. Argo Rollouts supports pause gates natively; Flagger supports manual webhooks that block promotion until an external system confirms readiness.
Automated Metric Analysis: How the Controller Decides Whether to Promote
Automated metric analysis is what separates progressive delivery from a slow rollout. The analysis runs at each traffic step, queries your observability backend, evaluates the result against predefined thresholds, and either promotes to the next step or initiates an automatic rollback — without human intervention.
In Argo Rollouts, an AnalysisTemplate defines the metric query and the success/failure thresholds. The Rollout spec references the template and triggers an AnalysisRun at each configured step. The AnalysisRun runs for the configured duration, polls the metric at regular intervals, and returns Successful, Failed, or Inconclusive. A Failed result immediately triggers a rollback to the stable version. An Inconclusive result can be configured to pause for manual review or treated as a failure for safety-critical services.
In Flagger, the MetricTemplate defines the Prometheus or Datadog query and threshold. Flagger evaluates the metric after every observation interval and counts failed checks against a threshold parameter — the number of consecutive failed metric checks that triggers a rollback. Setting the threshold to 1 means a single failed check initiates rollback; higher values tolerate transient metric noise. For most production services, a threshold of 2 or 3 prevents rollbacks on measurement spikes while still catching real regressions within one to two observation intervals.
- →Error rate query (Prometheus): rate(http_requests_total{status=~'5..',app='<canary>'}[1m]) / rate(http_requests_total{app='<canary>'}[1m]) — the canary's 5xx rate as a fraction of total requests over the observation window.
- →Latency query (Prometheus): histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{app='<canary>'}[1m])) by (le)) — the canary's p99 response time. Evaluate this against the stable version's p99 to catch latency regressions relative to baseline.
- →Always define both error rate AND latency thresholds. Error rate alone misses performance degradations that harm user experience without generating server errors. Latency thresholds catch memory leaks and slow database queries before they saturate the connection pool or consume the error budget.
- →Baseline comparison mode: both tools support comparing canary metrics against the stable version's current metrics rather than an absolute threshold. This is more robust for services where baseline performance varies by time of day — a 300ms p99 at off-peak hours that rises to 500ms at peak is normal; a canary that doubles the p99 relative to stable is a regression regardless of the absolute value.
Blast Radius Control During a Canary Rollout
Progressive delivery reduces blast radius structurally, but it does not eliminate the need for explicit controls. A canary at 5% traffic can still affect 5% of users if it fails catastrophically before the first analysis window completes. Three additional controls bound the risk further. First, set a maximum rollout duration: Argo Rollouts' progressDeadlineSeconds ensures a stalled rollout does not hold the canary traffic fraction indefinitely. Second, always configure a hard abort threshold — a circuit breaker — that triggers immediate rollback if error rate exceeds a safety ceiling, distinct from and higher than the gradual analysis threshold. Our chaos engineering guide covers how to validate that rollback mechanisms work under realistic failure conditions before you need them in a real incident.
Third, isolate canary resource footprint. A canary pod that consumes unbounded CPU or memory can cause noisy-neighbor degradation that contaminates baseline metrics and potentially disrupts stable pods on the same node. Always set ResourceRequests and ResourceLimits on canary pods consistent with the stable version's resource profile. Do not allow the canary HorizontalPodAutoscaler to scale beyond a bounded fraction of total deployment capacity during the analysis window.
Integrating Progressive Delivery into a GitOps Pipeline
Progressive delivery and GitOps are natural complements. GitOps provides the declarative source of truth and the audit trail; progressive delivery provides the deployment safety mechanism. In a GitOps pipeline, a Rollout or Canary resource is stored in Git alongside the service manifests. A change to the container image tag in Git triggers ArgoCD or Flux to apply the updated manifest, which triggers the controller to begin the promotion process. The progression state — current traffic step, AnalysisRun results, rollback events — is observable from the GitOps tooling in real time. Our GitOps implementation guide covers the ArgoCD and Flux deployment models that Argo Rollouts and Flagger integrate with directly.
The recommended Git structure for a service using Argo Rollouts: the Rollout spec lives in the same directory as the service's other Kubernetes manifests. AnalysisTemplate resources live in a shared templates directory — often under a cluster-wide configuration repository — so that the same metric evaluation logic can be reused across services. When a team wants to update their success criteria, they submit a pull request to the templates directory; the change applies to all services referencing that template after the next sync, and the PR history is the audit record of when and why thresholds changed.
Header-Based and Mirror Traffic Canaries for Zero-User-Impact Validation
Percentage-based traffic splitting is the most common canary approach, but two alternatives validate the canary under production conditions with zero user impact during the initial test phase.
- →Header-based routing: route traffic to the canary only when a specific HTTP header is present — for example, X-Canary: true. Internal QA tooling, automated integration tests, and opted-in engineers send this header; normal users never do. This validates the canary against real production infrastructure before any user traffic is shifted. Requires an ingress controller or service mesh that supports header-based routing (Istio VirtualService, nginx-ingress with snippet annotations, Traefik Middleware).
- →Traffic mirroring (shadowing): the ingress or service mesh sends a copy of every production request to the canary but returns the stable version's response to the user. The canary processes requests and generates real metrics and logs without affecting any user-facing response. This is the lowest-risk form of production validation — you get genuine traffic signals with zero blast radius. Supported by Istio VirtualService mirroring and nginx mirror_module. Ideal for validating database query plans, external API behavior, and error rate under real traffic volume before shifting any live traffic.
- →Combining approaches: use header-based routing for internal validation, then traffic mirroring for silent production testing, then percentage-based canary for live promotion. This three-phase progression is appropriate for high-risk changes — schema migrations, new external integrations, significant refactors — where maximum evidence is required before any user exposure.
Frequently Asked Questions
What is the difference between blue-green and canary deployments in Kubernetes?
Blue-green deployment maintains two complete environments — stable (blue) and new (green) — and switches all traffic instantly from blue to green. The switch is fast and fully reversible, but the blast radius of a bad deployment is 100% of traffic from the moment of cutover. Canary deployment gradually shifts a percentage of traffic to the new version, validating with metric analysis at each step. The blast radius is bounded to the canary traffic fraction at any point during the rollout. Blue-green is appropriate for stateful services where gradual migration is impractical or where instantaneous cutover is a business requirement; canary is appropriate for stateless services where progressive exposure and automated validation are operationally feasible.
How much traffic should you send to a canary at the first step?
Start at 1–5% for most production services. The goal at the first step is to accumulate enough requests during the analysis window to generate statistically meaningful error rate and latency signals. For a service receiving 10,000 requests per minute, 1% gives 100 requests per minute — a sufficient sample for a 5-minute window. For lower-traffic services receiving fewer than 1,000 requests per minute, start at 5–10% and extend the analysis window to 10–15 minutes. Never make a promotion decision based on fewer than 100 requests in the evaluation window; the error rate signal will be unreliable regardless of the canary's actual behavior.
Can you run canary deployments in Kubernetes without a service mesh?
Yes. Both Argo Rollouts and Flagger support ingress-based canary routing without a service mesh, using nginx-ingress, AWS ALB, Traefik, Contour, and other ingress controllers. Ingress-based routing uses controller annotations to split traffic between stable and canary services by weight. The limitation compared to service mesh routing is granularity: ingress controllers generally route by traffic percentage or HTTP header, but not by user identity, geographic region, or tenant ID. For the majority of services, ingress-based routing is sufficient. Service mesh routing is only necessary when you need user-cohort-based or tenant-scoped canary routing.
How does automatic rollback work in Argo Rollouts and Flagger?
In Argo Rollouts, a Failed AnalysisRun triggers an automatic rollback to the last stable revision: traffic immediately returns 100% to the stable pods and canary pods are scaled down. In Flagger, exceeding the configured number of consecutive failed metric checks triggers a rollback to the primary deployment. In both cases, rollback is fast because stable pods are already running — there is no pod startup latency. Configure a Prometheus or Datadog alert to notify your on-call channel when a rollback occurs automatically, so the team investigates the root cause before the next deployment attempt.
What metrics should you monitor during a canary rollout?
The minimum metric set: HTTP error rate (5xx as a fraction of total requests), p99 request latency, and request throughput (to detect traffic drops caused by routing misconfigurations). For stateful services: database connection pool saturation, query error rate, and replication lag if the canary queries a read replica. For AI-serving endpoints: model inference latency and error rate from the model backend. For all services: CPU and memory usage of canary pods, to detect resource leaks introduced by the new version before they cause OOMKill events that contaminate the error rate signal with a different failure mode.
How Belsoft Helps Enterprise Teams Ship Faster with Progressive Delivery
Belsoft designs and implements progressive delivery pipelines for enterprise engineering teams — from choosing between Argo Rollouts and Flagger based on your existing tooling and GitOps model, to writing AnalysisTemplates that integrate with your Prometheus or Datadog observability stack, to wiring automated rollback into your CI/CD workflow. We build the deployment infrastructure that lets your team ship confidently without babysitting every release. Explore our cloud infrastructure and DevOps services or book a technical conversation to discuss your current deployment architecture and what progressive delivery would require for your environment.
The teams that get the most value from progressive delivery are not the ones with the most sophisticated tooling — they are the ones with clear metric thresholds, analysis windows sized to their traffic volume, and the discipline to let automation run without overriding it on every release. The infrastructure is a week of work. The organizational practice is what takes time to build.
“The canary's job is not to catch every bug — it is to catch the bugs that matter before they reach every user.”
Written by
Diana Costa
Cloud & Platform Engineer, Belsoft Solutions
More from the blog
Ready to build?
Let's talk about your project.
30 minutes. No pitch. We map your requirements and tell you honestly what it will take.
Book a Strategy Call