AWS

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

Nida Sahar
Nida Sahar
4 min read
Deploy NGINX Ingress Controller on AWS EKS with HTTP and TCP Routing via Single LoadBalancer

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 ?

Confused users evaluating Kubernetes ingress options 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

Person setting up NGINX Ingress Controller via Helm in a Kubernetes environment

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

DevOps engineer configuring DNS records in Cloudflare for EKS ingress routing

  1. Go to DNS settings
  2. Add a record:
    • Type: CNAME or A
    • Name: your-subdomain.yourdomain.com
    • Target: ELB DNS
    • Proxy status: DNS Only or Proxied

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

TypeUsesIngress Object?ConfigMap?DNS
HTTPWeb apps, APIsYesNoSubdomain
TCPPostgreSQL, RedisNoYesSame ELB + Port

Tips

  • Use ingressClassName: nginx to 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.