Zero-downtime Kubernetes deployments with Argo Rollouts
Why rolling updates aren't enough
Kubernetes RollingUpdate is fine for development. For production, it's a liability. There's no traffic shifting, no automatic rollback on error-rate spikes, and no way to expose a new version to 5% of traffic while keeping 95% on the stable release.
Argo Rollouts solves this cleanly.
What is Argo Rollouts?
Argo Rollouts is a Kubernetes controller that extends the native deployment model with:
- Canary deployments — shift traffic progressively (5% → 25% → 100%) with automated analysis
- Blue/green deployments — run two parallel environments, switch instantly
- Analysis runs — gate promotions behind Prometheus metrics, Datadog, or custom webhooks
Installation
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
Install the CLI:
brew install argoproj/tap/kubectl-argo-rollouts
A canary Rollout manifest
Replace your Deployment with a Rollout:
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: api-server
spec:
replicas: 10
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api-server
image: ghcr.io/myorg/api-server:v2.1.0
ports:
- containerPort: 8080
strategy:
canary:
steps:
- setWeight: 5
- pause: {duration: 5m}
- setWeight: 25
- pause: {duration: 10m}
- analysis:
templates:
- templateName: success-rate
- setWeight: 100
Automatic rollback with Analysis
Create an AnalysisTemplate that queries Prometheus:
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
spec:
metrics:
- name: success-rate
interval: 2m
successCondition: result[0] >= 0.95
failureLimit: 3
provider:
prometheus:
address: http://prometheus:9090
query: |
sum(rate(http_requests_total{job="api-server",status=~"2.."}[5m]))
/
sum(rate(http_requests_total{job="api-server"}[5m]))
If the success rate drops below 95% three times in a row, Argo Rollouts automatically promotes back to the stable version.
Monitoring your rollout
kubectl argo rollouts get rollout api-server --watch
You'll see a live dashboard in your terminal showing traffic weight, pod counts, and analysis run status.
Integrating with GitOps (Argo CD)
If you're using Argo CD, install the argo-cd-rollouts plugin and your rollouts show up directly in the Argo CD UI with promote/abort controls.
Conclusion
Argo Rollouts takes about 30 minutes to install and configure. The payoff is production deployments you can actually control — progressive traffic shifts, automated rollback, and full observability. There's no reason to run raw RollingUpdate in production once you've tried it.
Tools & Resources
Tools relevant to this post. Some links are affiliate links — they cost you nothing and help keep geekoncloud.com running.
Written by GeekOnCloud
DevOps & Infrastructure engineer at geekoncloud.com