Skip to content
Published on

2026 Ingress Controller Comparison — Benchmarking 8 Options and a Selection Guide

Authors

Introduction

One of the first decisions you face when operating a Kubernetes cluster is "which Ingress Controller should we use?" This component, which routes external traffic to internal cluster services, is core infrastructure that you live with for years once chosen. Yet when you actually sit down to compare options, there are too many candidates. ingress-nginx, Traefik, HAProxy, Contour, Envoy Gateway, Kong, APISIX, and Emissary each carry a different data plane and philosophy.

In 2026 this choice is no longer simply "which one is fastest." The Ingress API itself has become frozen — no new features will be added — and the Gateway API has taken hold as the successor standard. As a result, "how mature is this controller's Gateway API support?" has become a key variable that determines future cost. On top of that, ingress-nginx, the most widely used option, has moved into maintenance mode and reported several security issues (CVEs), prompting many organizations to seriously evaluate alternatives.

In this article we compare eight controllers across configuration model, CRD design, TLS automation, performance, observability, Gateway API support, ecosystem, and licensing. Rather than a flat spec dump, the framing is decision-oriented: "in which situations should you pick what?"

Basic Architecture of an Ingress Controller

An Ingress Controller has two parts. One is the control plane, which watches the Kubernetes API, reads changes to Ingress/CRD resources, and generates configuration. The other is the data plane (proxy engine), which actually processes traffic.

                  External traffic
            ┌───────────────────┐
            │  LoadBalancer/    │   (cloud LB or NodePort)
            │  Service          │
            └─────────┬─────────┘
      ┌───────────────────────────────┐
      │     Ingress Controller Pod     │
      │  ┌──────────┐   ┌───────────┐  │
      │  │ Control  │──▶│  Data     │  │
      │  │ Plane    │   │  Plane    │  │
      │  │ (watch)  │   │  (proxy)  │  │
      │  └────┬─────┘   └─────┬─────┘  │
      └───────┼───────────────┼────────┘
              │               │
       watch Ingress/CRD      ▼
              │        route → backend Service/Pod
        Kubernetes API

The character of a controller depends heavily on what its data plane is. We can group them into roughly three families.

  • nginx family: ingress-nginx. Battle-tested nginx engine. Reload-based configuration.
  • Envoy family: Contour, Envoy Gateway, Emissary. xDS-based dynamic configuration, no hot reload needed.
  • Custom/other engines: Traefik (its own Go engine), HAProxy (the haproxy engine), Kong (nginx+Lua / OpenResty based), APISIX (nginx+Lua based).

Engine differences directly affect how fast dynamic configuration is applied, memory usage, and how features are extended. For example, nginx-based controllers require a reload on configuration change, which can cause a momentary burden in connection-heavy environments, whereas Envoy-based ones can apply updates dynamically with zero disruption via xDS.

Comprehensive Comparison of 8 Options

First, a one-glance comparison of the key items.

ControllerData planeConfig modelDedicated CRDsTLS automationGateway API
ingress-nginxnginxIngress + annotationsAlmost nonecert-manager integrationSplit into separate project (ingate)
TraefikTraefik (Go)CRD (IngressRoute) + annotationsRich (Middleware etc.)Built-in ACMEMature
HAProxyHAProxyIngress + annotations + ConfigMapSome CRDscert-manager integrationSupported (growing)
ContourEnvoyCRD (HTTPProxy)HTTPProxycert-manager integrationMature
Envoy GatewayEnvoyGateway API nativeGateway API centriccert-manager integrationNative (first class)
Kongnginx/OpenRestyCRD + annotationsKongPlugin etc.cert-manager integrationSupported
APISIXnginx/OpenRestyCRD (ApisixRoute)ApisixRoute etc.cert-manager integrationSupported
EmissaryEnvoyCRD (Mapping)Mapping etc.Built-in ACMESupported (partial)

Now performance and operational items.

ControllerDynamic reloadObservabilityAPI gateway featuresEcosystem/maturityLicense
ingress-nginxReload neededPrometheus metricsLimitedVery large (maintenance mode)Apache 2.0
TraefikZero disruptionDashboard + metrics + tracingMediumLargeMIT
HAProxyPartial zero disruptionRich stats + metricsLimitedLargeApache 2.0
ContourZero disruption (xDS)Envoy metrics/tracingLowMedium (CNCF)Apache 2.0
Envoy GatewayZero disruption (xDS)Envoy metrics/tracingMedium (policy CRDs)Growing (CNCF)Apache 2.0
KongPartialRich (plugins)Very highLargeApache 2.0 + enterprise
APISIXZero disruption (etcd)Rich (plugins)Very highMedium (ASF)Apache 2.0
EmissaryZero disruption (xDS)Envoy metrics/tracingHighMediumApache 2.0

As the tables show, two axes drive the choice the most: "do you need API gateway features?" and "how much do you value Gateway API?"

Per-Controller Detail

ingress-nginx

The most widely used controller. It uses the proven nginx engine, and most tutorials and operational examples are written against it. Configuration is done with Ingress resources plus annotations.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
spec:
  ingressClassName: nginx
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

The key 2026 caveat is that ingress-nginx is moving into maintenance mode. Several security issues (CVEs) were reported in the arbitrary configuration-injection (snippet) feature exposed via annotations, and snippets have been trending toward disabled-by-default. Its successor Gateway API implementation is being carried out as a separate project, so long term it is reasonable to evaluate moving to another controller or a Gateway API native implementation.

Traefik

Traefik uses its own engine written in Go, with dynamic configuration and rich CRDs as its strengths. Automatic ACME (Let's Encrypt) certificate issuance is built in, so TLS automation works even without cert-manager. You build expressive routing with CRDs like IngressRoute and Middleware.

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: web
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`app.example.com`) && PathPrefix(`/api`)
      kind: Rule
      services:
        - name: api
          port: 80
      middlewares:
        - name: rate-limit

The dashboard is intuitive and the middleware-chain model is clean. Note, however, that there are feature differences between the free version and the enterprise offering (Traefik Hub), so check where the features you need fall.

HAProxy

Uses the long-proven HAProxy engine. Stability and fine-grained load-balancing control are its strengths, and it offers a rich stats page and metrics. You configure it with a combination of Ingress + annotations + a global ConfigMap.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web
  annotations:
    haproxy.org/load-balance: "roundrobin"
    haproxy.org/timeout-client: "30s"
spec:
  ingressClassName: haproxy
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: web
                port:
                  number: 80

It offers powerful load-balancing algorithms and health checks at both L4 and L7, making it a good fit for environments that need demanding traffic control.

Contour

A CNCF project that uses Envoy as its data plane. Its distinguishing feature is the HTTPProxy CRD, which elegantly expresses delegation-based multitenancy. Being xDS-based, configuration changes are applied dynamically without a reload.

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: web
spec:
  virtualhost:
    fqdn: app.example.com
    tls:
      secretName: app-tls
  routes:
    - conditions:
        - prefix: /
      services:
        - name: web
          port: 80

With HTTPProxy's include feature you can build a structure where the platform team manages the root domain and each team manages sub-paths, making it strong for multitenancy.

Envoy Gateway

A project in which the Envoy camp implements the Gateway API as a first-class citizen. Instead of the Ingress-annotation model, it is designed around the Gateway API (GatewayClass, Gateway, HTTPRoute) from the ground up. For a 2026 greenfield design it is one of the most promising choices.

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: web
spec:
  parentRefs:
    - name: eg
  hostnames:
    - app.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: web
          port: 80

Policies (timeouts, retries, rate limits, etc.) are expressed with the Gateway API's extension policy CRDs. It is the model that best fits the trend of Ingress being frozen.

Kong

Based on OpenResty (nginx+Lua), Kong goes beyond simple Ingress to provide full-fledged API gateway features. You can attach numerous plugins — authentication, rate limiting, transformations — via the KongPlugin CRD.

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: rate-limit
plugin: rate-limiting
config:
  minute: 100
  policy: local

If you need to productize APIs (developer portal, key management, usage-based billing), it is a powerful choice. Note, however, that many full features sit in the enterprise tier.

APISIX

An Apache Foundation project, also nginx+Lua based, that manages dynamic configuration with etcd. It is characterized by the ApisixRoute CRD, a rich plugin set, and an Admin API. Dynamic route updates are fast and the plugin ecosystem is active.

apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
  name: web
spec:
  http:
    - name: rule1
      match:
        hosts:
          - app.example.com
        paths:
          - /*
      backends:
        - serviceName: web
          servicePort: 80
      plugins:
        - name: limit-count
          enable: true
          config:
            count: 100
            time_window: 60

An advantage is that you can use a broad set of API gateway features with the open-source edition alone.

Emissary (Ambassador)

One of the early Envoy-based API gateways, Emissary expresses routing with the Mapping CRD. It is characterized by a developer-friendly declarative model and built-in ACME.

apiVersion: getambassador.io/v3alpha1
kind: Mapping
metadata:
  name: web
spec:
  hostname: app.example.com
  prefix: /
  service: web:80

Because it exposes Envoy's features through relatively simple CRDs, it suits teams that want Envoy capabilities but find raw Envoy configuration burdensome.

Selection Criteria

It is hard to decide on spec comparison alone. The following axes help.

Scale

  • Small/simple routing: ingress-nginx (if you already have assets) or Traefik. Low barrier to entry and plenty of material.
  • Medium-to-large/multi-team: Contour (HTTPProxy delegation) or Envoy Gateway (Gateway API role separation) are favorable for multitenancy.
  • Large/API productization: Kong or APISIX, when you need plugin-based policies and API management.

Team Capability

Envoy-based options (Contour, Envoy Gateway, Emissary) are powerful once you understand Envoy concepts (xDS, listeners, clusters), but they carry a learning curve. By contrast, ingress-nginx and Traefik are easy to get into. If your team is comfortable with nginx, debugging APISIX/Kong is comparatively smoother.

Need for API Management

If the goal is simply to route traffic, Contour/Envoy Gateway/Traefik are sufficient. If API gateway features like authentication, rate limiting, transformation, a developer portal, and usage billing are central, Kong or APISIX are a fit.

On-Premises Environments

In on-prem environments without a cloud LB, compatibility with an LB implementation like MetalLB and integration with self-managed certificates (cert-manager) matter. Most controllers work well, but HAProxy/ingress-nginx have a long track record on-prem, making reference material easy to find.

Recommendations by Workload

WorkloadRecommendationWhy
Simple web serviceTraefik, ingress-nginxQuick start, plentiful material
Multi-tenant platformContour, Envoy GatewayRole separation / delegation model
New greenfield (2026)Envoy GatewayGateway API native
API product/portalKong, APISIXPlugin-based API management
Demanding L4/L7 controlHAProxyFine-grained LB / health checks
Envoy features + simple CRDsEmissaryEnvoy through easy CRDs

Migration Difficulty

When moving from an existing controller to another, difficulty is proportional to "how different the configuration models are."

  • Ingress annotations → other Ingress annotations (e.g., ingress-nginx → HAProxy): Relatively easy since you only map annotations. You must still verify differences in rewrite and path-matching behavior.
  • Ingress → CRD model (e.g., ingress-nginx → Traefik IngressRoute, Contour HTTPProxy): Large conversion effort because you have to author resources anew.
  • Ingress → Gateway API (e.g., ingress-nginx → Envoy Gateway): Conversion tools like ingress2gateway exist, but policy parts require manual mapping.

The key, in every case, is to separate IngressClass so the two controllers coexist, then migrate gradually via DNS or traffic weighting.

Total Cost of Ownership (TCO) Perspective

Beyond the visible container cost, consider the following.

  • Load balancer cost: In the cloud, if each controller gets its own LoadBalancer service, LB cost multiplies. A shared LB with a single Ingress entry point is more cost-effective.
  • Operational staffing cost: A controller with a steep learning curve has a high initial adoption cost. A controller with abundant material shortens troubleshooting time.
  • Enterprise licensing: Some features of Kong/Traefik and others may require a commercial license. Clearly confirm the open-source scope.
  • Migration cost: Staying on a maintenance-mode controller means switching cost arrives all at once later. This weighs heavily in long-term TCO.

2026 Trend: Ingress Frozen → Gateway API

The most important trend is that the Ingress API is frozen. No new features will be added to the Ingress API; all new features go into the Gateway API. The Gateway API provides three-tier role separation (GatewayClass/Gateway/HTTPRoute), multiple protocols (HTTP, gRPC, TCP, UDP, TLS), and a standardized policy model.

   Past (Ingress)             Future (Gateway API)
   ──────────────            ─────────────────────
   Ingress + annotations      GatewayClass (platform/infra)
   (vendor-specific)               │
                              Gateway (cluster operator)
                              HTTPRoute/GRPCRoute (app developer)

Therefore, for a 2026 new adoption, evaluating a controller that supports the Gateway API first-class (such as Envoy Gateway) is the path to lower future cost. Even organizations with large existing Ingress assets should plan a gradual migration path using tools like ingress2gateway.

Decision Flow

Finally, the selection process as a flowchart.

                    Start: choosing an Ingress Controller
              ┌───────────────┴───────────────┐
              │ Are API gateway features      │
              │ (auth/rate-limit/portal) core? │
              └───────────────┬───────────────┘
                  yes │             │ no
                      ▼             ▼
              ┌──────────────┐   ┌──────────────────────┐
              │ Kong / APISIX │   │ Is multitenancy /     │
              └──────────────┘   │ role separation key?   │
                                 └──────────┬───────────┘
                             yes │                │ no
                                 ▼                ▼
                      ┌────────────────┐   ┌────────────────────┐
                      │ Want Gateway    │   │ Are quick start /   │
                      │ API native?     │   │ rich material key?  │
                      └───────┬────────┘   └─────────┬──────────┘
                       yes│       │no            yes │
                          ▼       ▼                  ▼
                 ┌──────────┐ ┌─────────┐   ┌───────────────────┐
                 │ Envoy    │ │ Contour │   │ Traefik /         │
                 │ Gateway  │ │         │   │ ingress-nginx     │
                 └──────────┘ └─────────┘   └───────────────────┘

Conclusion

There is no single right answer for choosing an Ingress Controller. But in 2026 you must weigh two big trends. First, the Ingress API is frozen and the Gateway API is the standard future. Second, as ingress-nginx moves into maintenance mode, evaluating alternatives has become necessary from a stability and security standpoint.

If your existing assets are large and you only need simple routing, Traefik or your existing ingress-nginx is enough. But for a new greenfield deployment, I recommend evaluating a Gateway API native implementation such as Envoy Gateway first. If multitenancy matters, Contour; if API productization is central, Kong or APISIX is the answer. Whatever you choose, learning the coexistence strategy via IngressClass separation in advance will be a great help when you migrate later.

References