Sheet ⁨06⁩ · ⁨DevTips⁩Surveyed ⁨2026⁩

Blog post image for Kubernetes Ingress Controllers Explained: Nginx, Traefik, and AWS ALB Compared - A practical comparison of the most widely used Kubernetes Ingress controllers. You will learn how Nginx, Traefik, and the AWS Load Balancer Controller handle routing, TLS, and more, plus how to pick the right one for your setup.

Kubernetes Ingress Controllers Explained: Nginx, Traefik, and AWS ALB Compared

Published: Updated: 03 Mins read04 Mins listen
Markdown for AI(opens in a new tab)

Why the ingress controller you pick matters

Hey, want your cluster to actually serve traffic?

Kubernetes gives you the Ingress API, a way to declare “route this host and path to that service.” What it does not give you is the thing that carries out those rules. That is the ingress controller, and it is a choice you make, not something built in. Pick well and routing, TLS, and rate limiting mostly take care of themselves. Pick badly and you fight annotations and reloads for months.

It is a real decision, not a default

An Ingress resource with no controller behind it does nothing at all. So before you write a single routing rule, you decide which controller watches those rules and turns them into real load-balancing.

The problem with treating ingress as an afterthought

What’s the issue?

Teams often copy an ingress manifest from a tutorial without knowing which controller (or how many) is running. The result is subtle: rules that never take effect, two controllers both trying to own the same Ingress, or a pile of vendor-specific annotations nobody understands.

The real-world consequences

The classic incident is two ingress controllers installed in one cluster, both reconciling the same Ingress object because no ingressClassName was set, so requests route inconsistently depending on which one answered. The other slow-burn problem is annotation sprawl. Nginx behavior gets tuned entirely through dozens of annotations until the routing logic is effectively undocumented.

The three main options

Here’s how to fix it

All three controllers implement the same Ingress API but in very different ways. The controller sits between the internet and your services, terminates TLS, and routes by host and path.

Traffic from the internet hits your chosen controller (Nginx, Traefik, or the AWS ALB via the Load Balancer Controller), which implements the Ingress resource, terminates TLS with certificates from cert-manager, and routes by host and path to the right Service.

Implementing each one

Nginx Ingress runs an Nginx proxy inside the cluster and is configured largely through annotations, including rate limiting. Traefik uses dynamic configuration with no reloads, ships a dashboard and a middleware system, and has Let’s Encrypt built in. The AWS Load Balancer Controller provisions a real Application Load Balancer and wires its target groups straight to your pods.

Nginx is the mature, portable default configured via annotations. Traefik favors dynamic config, a dashboard, and middleware. The AWS ALB is a native L7 load balancer with deep AWS integration but only on EKS.

Tools and platforms

Whichever controller you choose, let cert-manager own TLS certificates rather than managing them by hand. It issues and renews certs (from Let’s Encrypt or another issuer) and hands them to the controller, so TLS termination stops being a manual chore.

Quick implementation steps

Quick takeaways

  • Always set ingressClassName so exactly one controller owns each Ingress.
  • Use cert-manager for TLS instead of hand-managed certificates.
  • Nginx for portability and control, Traefik for dynamic cloud-native ergonomics, ALB for native AWS on EKS.
  • Keep annotations documented, or you will not remember what your routing does.

Avoiding the common pitfalls

Set an explicit ingress class on every Ingress to avoid controllers fighting over the same object, and be careful across upgrades. Annotation names and CRD versions do change between controller releases, so read the release notes before bumping a chart.

Benefits you feel quickly

Why it helps

Choosing deliberately means routing behaves predictably, TLS renews itself, and the person on call can actually reason about how a request reaches a pod. The controller stops being a mystery box and becomes a documented part of your platform.

Right tool, right environment

On EKS where you want AWS-native load balancing, WAF, and ACM certificates, the ALB controller is the natural fit. If you need portability across clouds or on-prem, Nginx travels anywhere. If you value dynamic configuration and a nice operational experience, Traefik earns its place.

What’s your approach?

Community discussion

What’s your take? Are you on Nginx, Traefik, the AWS ALB, or something else like Contour or Cilium’s Gateway? I am curious what drove the choice.

Share your experience

If you have migrated between ingress controllers, I would love to hear how the annotation and TLS translation went, since that is usually the painful part.

Was this useful?

You might also enjoy

More posts on similar topics

Docker Is Eating Your Disk Space (And How PruneMate Fixes It)

Docker Is Eating Your Disk Space (And How PruneMate Fixes It)

The problem: Docker is eating your disk space What it looks like when it happens Your Docker host is running out of space. Again. You've been spinning up containers, testing new services

ArgoCD GitOps: Sync Kubernetes Deployments Automatically from Git

ArgoCD GitOps: Sync Kubernetes Deployments Automatically from Git

Why GitOps for Kubernetes? From kubectl apply to Git as the source of truth Hey, want to stop deploying to Kubernetes by hand? If your releases still come from someone running `kubectl ap

Docker Multi-Stage Builds: Smaller, Safer Images for Production

Docker Multi-Stage Builds: Smaller, Safer Images for Production

Why multi-stage builds matter Image size is really about what is inside Hey, want to stop shipping a toolshed to production? If your Dockerfile builds and runs the app in one stage, your

Kubernetes Namespaces: Organize, Isolate, and Secure Multi-Team Clusters

Kubernetes Namespaces: Organize, Isolate, and Secure Multi-Team Clusters

Why cluster isolation matters The multi-tenant reality If you're running a separate cluster for every environment and every dev team, you have already seen the bill and the amount of upgrade

Helm Charts: Templating & Multi-Environment Kubernetes Deployments

Helm Charts: Templating & Multi-Environment Kubernetes Deployments

Why Helm matters The Kubernetes manifest problem Managing Kubernetes manifests at scale becomes a nightmare. You have a deployment for dev, staging and production. Each one is 90% identi

Understanding Kubernetes Services: ClusterIP vs NodePort vs LoadBalancer

Understanding Kubernetes Services: ClusterIP vs NodePort vs LoadBalancer

If you're working with Kubernetes, you've probably noticed that Pods come and go, and their IP addresses keep changing. That's where Services come in. They give you a stable way to keep your apps acce

6 related posts