NGINX Ingress Deprecated: Migrate to HAProxy Ingress in Kubernetes

Migrating from NGINX Ingress to HAProxy Ingress in Kubernetes: A Complete Technical Guide

Ingress NGINX has been a staple in Kubernetes environments for HTTP/HTTPS traffic routing for years. However, as of March 2026, support for NGINX Ingress in certain Kubernetes distributions will be deprecated https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/ .

This post provides a detailed, technical roadmap to migrate to HAProxy Ingress, a high-performance, modern alternative.

Why Replace NGINX Ingress?

  • End-of-life / deprecation: NGINX Ingress will no longer receive updates, security patches, or feature improvements in some managed Kubernetes platforms.
  • Limited observability: Metrics and telemetry in NGINX Ingress are less granular; HAProxy Ingress provides Prometheus metrics, latency histograms, and error tracking out-of-the-box.
  • Performance bottlenecks: For high concurrency workloads, NGINX Ingress can experience latency spikes due to connection handling limitations.
  • Advanced routing: HAProxy Ingress supports weighted routing, canary deployments, header-based routing, and more.

HAProxy Ingress: Overview

HAProxy Ingress is designed for modern Kubernetes workloads. It provides high-performance load balancing, advanced routing, and enterprise-grade TLS/SSL management. Key features include:

  • High-performance TCP/HTTP load balancing
  • Advanced routing: path-based, header-based, weighted, and canary deployments
  • SSL/TLS termination, rate limiting, and WAF support
  • Prometheus metrics and full observability
  • Flexible annotations for ingress behavior

Prerequisites

  • Kubernetes cluster (v1.25+ recommended)
  • kubectl configured with cluster access
  • Helm 3 installed
  • Optional: Prometheus/Grafana for metrics monitoring

Step 1: Create a Namespace for HAProxy Ingress

kubectl create namespace haproxy-ingress

Step 2: Add the HAProxy Helm Repository

helm repo add haproxytech https://haproxytech.github.io/helm-charts
helm repo update

Step 3: Deploy HAProxy Ingress Controller with Helm

helm install haproxy-ingress haproxytech/kubernetes-ingress \
  --namespace haproxy-ingress \
  --set controller.service.type=LoadBalancer \
  --set controller.metrics.enabled=true \
  --set controller.metrics.serviceMonitor.enabled=true

This deploys HAProxy Ingress with Prometheus metrics enabled and exposes it via a LoadBalancer service.

the link of values.yaml : https://github.com/haproxy-ingress/charts/blob/release-0.15/haproxy-ingress/values.yaml

Step 4: Verify Deployment

kubectl get pods -n haproxy-ingress
kubectl get svc -n haproxy-ingress

You should see a pod named haproxy-ingress-controller running and a LoadBalancer service with an external IP.

Step 5: Configure Your Ingress Resources

Update your Kubernetes Ingress resources with HAProxy-specific annotations:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
  annotations:
    haproxy.org/ssl-redirect: "true"
    haproxy.org/timeout-client: "30s"
    haproxy.org/timeout-server: "30s"
spec:
  rules:
  - host: example.yourdomain.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-app
            port:
              number: 80
  tls:
  - hosts:
    - example.yourdomain.com
    secretName: tls-secret

Step 6: Test Routing

kubectl port-forward svc/haproxy-ingress 8080:80 -n haproxy-ingress
curl http://localhost

Verify that requests route correctly to your application and SSL/TLS termination works if configured.

Step 7: Optional ConfigMap for HAProxy Settings

apiVersion: v1
kind: ConfigMap
metadata:
  name: haproxy-ingress-config
  namespace: haproxy-ingress
data:
  maxconn: "20000"
  timeout-client: "30s"
  timeout-server: "30s"
  stats-enabled: "true"
  stats-uri: "/haproxy?stats"

Step 8: Gradual Cutover from NGINX Ingress

  1. Audit existing NGINX Ingress resources: kubectl get ingress --all-namespaces -o yaml > nginx-ingress-backup.yaml
  2. Deploy HAProxy Ingress in a separate namespace for testing.
  3. Update Ingress resources with HAProxy annotations.
  4. Verify traffic, metrics, and TLS termination.
  5. Switch DNS or service endpoints to HAProxy Ingress.
  6. Remove NGINX Ingress after validation.

Step 9: Cleanup (Optional)

helm uninstall haproxy-ingress -n haproxy-ingress
kubectl delete namespace haproxy-ingress

Conclusion

Migrating from NGINX Ingress to HAProxy Ingress ensures your Kubernetes workloads are secure, scalable, and highly observable. Using Helm simplifies deployment and configuration, enabling DevOps teams to integrate HAProxy quickly and efficiently. This migration also prepares your clusters for future high-performance workloads, advanced routing, and observability requirements.

Tags: #Kubernetes, #HAProxy, #NGINX, #DevOps, Ingress, Helm, CI/CD, Cloud, Observability

Previous Article

Leave a Reply

Your email address will not be published. Required fields are marked *.

*
*