Deploy NGINX Ingress Controller on AWS EKS with HTTP and TCP Routing via Single LoadBalancer
Step-by-step guide to deploying NGINX Ingress Controller on AWS EKS to route HTTP and TCP services through a single LoadBalancer. Includes DNS setup with Cloudflare, Helm deployment, and YAML examples

In AWS EKS, exposing each application with its own LoadBalancer is costly and inefficient. A smarter approach is using an NGINX Ingress Controller, which allows routing multiple applications through a single LoadBalancer — using host-based HTTP routing and TCP port-based routing.
This guide explains how to:
- Deploy NGINX Ingress Controller via Helm
- Set up host-based routing for HTTP apps
- Configure TCP routing for non-HTTP services
- Map domains via Cloudflare
- Reference official docs
Why Use NGINX Ingress Controller in AWS EKS ?
| Benefits |
|---|
| One LoadBalancer for many services |
| Lower costs |
| Host & path-based routing |
| Supports TCP & HTTP apps |
| Works with Cloudflare |
| Centralized config |
Prerequisites
- EKS Cluster
- Helm, kubectl, eksctl
- Cloudflare account
- Domain for your app
- Applications/services already deployed in Kubernetes
Step 1: Install NGINX Ingress Controller on EKS using Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx ingress-nginx/ingress-nginx \
--create-namespace \
--namespace ingress-nginx \
--set controller.service.type=LoadBalancer
For advanced configurations, refer to the official NGINX Ingress Helm chart documentation.
This exposes the controller via a single ELB.
Step 2: Get ELB DNS for Ingress Controller
kubectl get svc -n ingress-nginx
Note the external ELB DNS, e.g.:
a1b2c3d4e5f6g7.elb.amazonaws.com
Step 3: Configure DNS for NGINX Ingress with Cloudflare
- Go to DNS settings
- Add a record:
- Type:
CNAMEorA - Name:
your-subdomain.yourdomain.com - Target: ELB DNS
- Proxy status: DNS Only or Proxied
- Type:
For Cloudflare-specific optimizations, check Cloudflare’s Kubernetes integration guide.
Step 4: HTTP Host-Based Ingress Example
Here's a sample Ingress manifest:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pubggpiro9ypjn-ing
namespace: pubggpiro9ypjn
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: metube-app-622604.clb2.nifetency.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-f35714cd-4cb5-4f7e-b9db-4daa699640b3
port:
number: 8081
Apply the file:
kubectl apply -f ingress.yaml
Learn more about Ingress annotations in the Kubernetes Ingress documentation.
Step 5: Enable TCP Routing in NGINX Ingress (Optional)
Step 5.1: Create TCP ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
"5432": "my-namespace/postgres-service:5432"
Step 5.2: Upgrade Controller to Load TCP ConfigMap
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.extraArgs.tcp-services-configmap=ingress-nginx/tcp-services
Or during first install:
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.extraArgs.tcp-services-configmap=ingress-nginx/tcp-services \
--set controller.service.type=LoadBalancer
For troubleshooting TCP routing, see NGINX’s TCP/UDP passthrough guide.
Step 6: Expose TCP Port in LoadBalancer
Edit the controller service:
kubectl edit svc ingress-nginx-controller -n ingress-nginx
Add:
ports:
- name: postgres
port: 5432
targetPort: 5432
protocol: TCP
Routing Overview
| Type | Uses | Ingress Object? | ConfigMap? | DNS |
|---|---|---|---|---|
| HTTP | Web apps, APIs | Yes | No | Subdomain |
| TCP | PostgreSQL, Redis | No | Yes | Same ELB + Port |
Tips
- Use
ingressClassName: nginxto prevent conflicts. - Use cert-manager for HTTPS/TLS termination.
- Isolate apps using namespaces.
- Annotate Ingress for rewrites, caching, rate-limiting, etc.
Conclusion: Unified HTTP and TCP Routing on EKS with Ingress
With this setup, you can serve both HTTP and TCP apps in your EKS cluster using a single LoadBalancer, simplifying your architecture and saving costs. HTTP traffic is managed using Ingress resources with host rules, while TCP apps like databases are handled using a custom ConfigMap.
This architecture is production-ready when combined with Cloudflare for DNS, TLS, and protection.
For cluster management solutions, explore our Nife's Managed Clusters platform.
Discover solutions for Managing Multiple Organizations across your infrastructure
Deploy on Nife
Ready to deploy? Check out the Nife documentation:
From the team at Nife
Deploy your next app in minutes, not days.
Nife is a multi-cloud edge platform that lets you deploy, scale, and manage applications globally without the infrastructure headache.