Taming Traffic in Kubernetes: Setting Up NGINX as a Reverse Proxy

Ever hosted a house party where guests end up lost and you’re stuck pointing them to the right room? That’s exactly how it feels juggling services inside a Kubernetes cluster - requests arrive, and chaos follows. But then I discovered NGINX: the digital party host in your K8s setup, greeting every request and guiding it straight to the right service, no mix-ups, no hallway traffic jams.
In this walkthrough, I’ll show you how to set up NGINX as a reverse proxy inside Kubernetes - so your microservices party runs smooth, requests never get lost, and you get to enjoy the music.
Why NGINX as a Reverse Proxy in Kubernetes?
Centralized Traffic Management: NGINX routes incoming requests to specific Kubernetes services based on URL, domain, or path.
SSL/TLS Termination: Offload encryption at the proxy, making your backend services simpler and more secure.
Load Balancing: NGINX distributes requests to replicas of backend pods, improving availability and scalability.
Security: Keep your internal services private and expose only NGINX, adding an extra shield against the outside world.
Hands-on: Setting Up NGINX Reverse Proxy in Kubernetes
1. Custom NGINX Config
Create a nginx.conf
defining how requests are routed:
events { }
http {
server {
listen 8080;
location /api/ {
proxy_pass http://backend-svc:5000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
proxy_pass http://frontend-svc:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
- Change
backend-svc
andfrontend-svc
to your actual Kubernetes service names.
2. Containerize NGINX with Your Config
Dockerfile example:
FROM nginx:latest
COPY nginx.conf /etc/nginx/nginx.conf
Build and push this image to your registry.
3. Kubernetes Deployment and Service
nginx-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-reverse-proxy
spec:
replicas: 1
selector:
matchLabels:
app: nginx-reverse-proxy
template:
metadata:
labels:
app: nginx-reverse-proxy
spec:
containers:
- name: nginx
image: your-nginx-image
ports:
- containerPort: 8080
nginx-service.yaml
:
apiVersion: v1
kind: Service
metadata:
name: nginx-reverse-proxy-svc
spec:
selector:
app: nginx-reverse-proxy
ports:
- port: 8080
targetPort: 8080
type: LoadBalancer
Apply both files via kubectl apply -f
.
4. Test the Setup
Port-forward for local testing:
kubectl port-forward svc/nginx-reverse-proxy-svc 8080:8080
Now, accessing /api/
gets you to the backend; root /
leads you to the frontend.
Bonus: When to Use NGINX vs. NGINX Ingress
For most production K8s clusters, you’ll use the NGINX Ingress Controller, which is a special version built to automatically read Kubernetes Ingress resources and manage routes for you.
The above approach is great for learning, custom needs, or situations where you want manual, fine-grained proxy control.
Subscribe to my newsletter
Read articles from Muskan Agrawal directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Muskan Agrawal
Muskan Agrawal
Cloud and DevOps professional with a passion for automation, containers, and cloud-native practices—committed to sharing lessons from the trenches while always seeking new challenges. Combining hands-on expertise with an open mind, I write to demystify the complexities of DevOps and grow alongside the tech community.