
Table of Contents
Introduction: Why Blue-Green Deployment Matters
Achieving blue-green deployment in K8s is one of the most reliable ways to release updates without interrupting users. If you’ve ever pushed a deployment that caused downtime or broke production, you know how stressful that can be.
The blue-green approach solves this problem by maintaining two identical environments one serving traffic (blue) and another ready with the new version (green). Switching between them is nearly instantaneous, giving you zero-downtime releases and easy rollbacks.
What Is Blue-Green Deployment in K8s?
In Kubernetes (K8s), blue-green deployment is a release strategy where you run two identical application environments — Blue (current live version) and Green (new version).
At any point, only one of them serves production traffic. When you’re ready to release a new version, you deploy it to the idle environment, test it, and then switch traffic from blue to green. If something goes wrong, you simply switch back.
This pattern provides:
- Zero downtime during deployment.
- Instant rollback capability.
- Safer testing in production-like conditions.
How Blue-Green Deployment Works
Here’s the high-level flow:
- Blue version (
v1) is live and serving users. - Green version (
v2) is deployed but idle. - You run tests on green (load tests, smoke tests, etc.).
- Once validated, the Service (or Ingress) route changes from blue pods to green pods.
- Blue remains available for rollback if needed.
Visually, it looks like this:
[ Users ]--> [ ingress ] --> [ Service ] --> [ Blue Pods (v1) ]
↓ switch
[ Users ] --> [ ingress ] --> [ Service ] --> [ Green Pods (v2) ]
Implementing Blue-Green Deployment in Kubernetes
Let’s break down how you can achieve this in a practical, production-friendly way.
Step 1: Prepare Two Identical Environments
Start with two identical Deployments in K8s — one labeled as blue, the other as green.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v1
labels:
app: myapp
version: blue
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: blue
template:
metadata:
labels:
app: myapp
version: blue
spec:
containers:
- name: myapp
image: myregistry/myapp:v1
ports:
- containerPort: 80
Create a similar one for green with the new image tag (v2) and label version: green.
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-v2
labels:
app: myapp
version: green
spec:
replicas: 3
selector:
matchLabels:
app: myapp
version: green
template:
metadata:
labels:
app: myapp
version: green
spec:
containers:
- name: myapp
image: myregistry/myapp:v2
ports:
- containerPort: 80
Step 2: Use Kubernetes Services as Traffic Routers
Your Service is the key switch. It decides which pods receive production traffic.
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
version: blue
ports:
- port: 80
targetPort: 80
Initially, the selector points to version: blue. Later, you’ll switch it to version: green.
Step 3: Deploy the New Version
Deploy the green environment (myapp-v2) using your CI/CD pipeline (for example, Argo CD, Jenkins, or GitHub Actions).
Run functional and load tests against the green environment before switching traffic. You can expose it temporarily with a test ingress or port-forward for validation.
Step 4: Switch Traffic to the New Version
Once validation passes, modify the Service selector to point to version: green.
kubectl patch service myapp-service -p '{"spec":{"selector":{"app":"myapp","version":"green"}}}'
Traffic now routes instantly to the new environment. Users won’t notice a thing.
Step 5: Roll Back if Needed
If you detect issues, simply revert the Service selector back to version: blue. No new image build or redeployment needed rollback happens in seconds.
Real-World Example: Blue-Green with Kubernetes and Ingress
In a production cluster, you often have an Ingress Controller (like NGINX or Traefik) in front of your Services. You can use it to route based on hostnames or paths.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-service
port:
number: 80
You can toggle the backend service from myapp-blue to myapp-green without touching DNS or external load balancers. but you need to create two service one for the green and one for the blue
Best Practices for Blue-Green Deployment in K8s
- Automate everything. Use CI/CD pipelines to handle the environment creation, testing, and switch-over automatically.
- Use proper labels and naming conventions. Consistent labeling avoids selector mistakes that cause outages.
- Test in production-like conditions. Validate the new version before flipping traffic.
- Leverage health checks and readiness probes. Kubernetes will only send traffic to healthy pods.
- Keep old environments temporarily. Don’t delete blue immediately after switching to green. Retain it for quick rollback.
- Integrate with monitoring and alerting. Tools like Prometheus and Grafana can help detect regressions fast.
Common Pitfalls and How to Avoid Them
- Pitfall: Accidentally routing partial traffic to both environments.
Fix: Always verify Service selectors before and after deployment. - Pitfall: Unbalanced resource usage.
Fix: Ensure your cluster can handle both blue and green running simultaneously. - Pitfall: Ignoring database migrations.
Fix: Use versioned migrations and ensure backward compatibility before switching traffic.
Tools That Simplify Blue-Green Deployments
Several tools make blue-green deployment in K8s simpler and safer:
- Argo Rollouts: Advanced deployment controller for canary and blue-green strategies.
- FluxCD: GitOps-based delivery with deployment strategies support.
- Spinnaker: Enterprise-grade delivery tool with built-in blue-green deployment.
If you’re managing complex microservices, using one of these tools can drastically reduce operational risk.
Summary and Next Steps
Achieving blue-green deployment in K8s allows teams to release new versions confidently — without downtime, late-night rollbacks, or user impact.
To recap:
- Maintain two identical environments.
- Use a Kubernetes Service or Ingress to route traffic.
- Automate deployment and switching with CI/CD.
- Validate, monitor, and roll back if needed.
If you’re new to blue-green strategies, start with a simple Service-based switch before adopting advanced tools like Argo Rollouts.
For related reading, check out:
- Run a Container Without Setting the Tag? 3 Painful Reasons to Never Use latest
- Easily Deploy Jenkins on Kubernetes: Step by Step Guide (2025)
- Kubernetes 6 Questions to Test Your Understanding of K8s
External Resources
Final Thoughts Avoid the Trap
Always automate the process and don’t trust the manual switch — human error is the biggest risk in deployments
Blue-green deployment isn’t just a theoretical DevOps concept — it’s a practical, battle-tested strategy for achieving safe, zero-downtime releases in Kubernetes. Start small, automate gradually, and let data and monitoring guide your rollout confidence.