Hướng Dẫn Chuyển Đổi Từ Ingress NGINX Sang HAProxy Ingress Controller

Hướng dẫn chi tiết cách migration (chuyển đổi) từ Ingress NGINX sang HAProxy Kubernetes Ingress Controller cho hệ thống production. So sánh ưu nhược điểm và best practices.

Hướng Dẫn Chuyển Đổi Từ Ingress NGINX Sang HAProxy Ingress Controller

Nếu hệ thống Kubernetes của bạn đang xử lý một lượng truy cập (traffic) khổng lồ, rất có thể bạn đã gặp phải những giới hạn của Ingress NGINX Controller. Đó là lúc chúng ta cần cân nhắc chuyển đổi (migration) sang một giải pháp mạnh mẽ hơn: HAProxy Kubernetes Ingress Controller.

Việc chuyển đổi này mang lại nhiều lợi ích vượt trội:

  • Hiệu năng cao hơn khi xử lý lượng truy cập lớn.
  • Reload cấu hình gần như không có độ trễ (near-zero reload), giảm thiểu tối đa downtime.
  • Khả năng Load Balancing (Cân bằng tải) mạnh mẽ cho cả TCP và HTTP.
  • Tích hợp sẵn các tính năng nâng cao như Rate-limit, Stick-table, WAF (Web Application Firewall).
  • Tối ưu hóa Memory (RAM) tốt hơn trong các cluster lớn.

Dưới đây là hướng dẫn chi tiết từng bước để thực hiện quá trình chuyển đổi này một cách an toàn nhất cho môi trường thực tế (Production).


1. Kiến trúc tổng quan

Dù bạn sử dụng NGINX hay HAProxy, kiến trúc tổng thể của Kubernetes Ingress không thay đổi nhiều. Yếu tố cốt lõi là việc thay thế bộ điều khiển (Controller) nằm phía sau LoadBalancer.

Kiến trúc Ingress NGINX hiện tại:

Client ➔ LoadBalancer ➔ Ingress NGINX Controller ➔ Kubernetes Services ➔ Pods

Kiến trúc HAProxy Ingress mới:

Client ➔ LoadBalancer ➔ HAProxy Ingress Controller ➔ Kubernetes Services ➔ Pods

Một số điểm quan trọng cần lưu ý:

  • Các đối tượng Ingress resource cũ của Kubernetes vẫn có thể sử dụng lại.
  • Chúng ta chỉ thay đổi thành phần Controller phía sau.
  • Annotations (các tham số cấu hình riêng) của hai hệ thống sẽ khác nhau.
  • Một số tính năng có thể không tương thích 100%, đòi hỏi bạn phải kiểm tra kỹ.

2. Khi nào nên và không nên Migrate?

Nên Migrate nếu hệ thống của bạn:

  • Xử lý lớn hơn 5.000 - 10.000 kết nối đồng thời (concurrent connections).
  • Sử dụng nhiều kết nối WebSocket.
  • Đóng vai trò là một API Gateway với lượng truy cập cao.
  • Thường xuyên bị lỗi “timeout” mỗi khi NGINX tải lại cấu hình (reload).
  • Cần tính năng cân bằng tải TCP nâng cao và khả năng theo dõi (observability) chi tiết hơn.

Không cần Migrate nếu:

  • Cluster của bạn đang ở quy mô nhỏ.
  • Bạn chỉ dùng các tính năng Ingress cơ bản (điều hướng domain/path đơn giản).
  • Đội ngũ kỹ thuật (Team) đã quá quen thuộc với NGINX.
  • Hệ thống đang bị phụ thuộc quá nhiều vào các đoạn code nginx snippets tùy biến.

3. So sánh nhanh: Ingress NGINX vs HAProxy

Tính năngIngress NGINXHAProxy Ingress
Hiệu năng (Performance)TốtRất mạnh
Reload Cấu hìnhCó độ trễ (delay)Gần như không độ trễ (Near-zero)
WebSocketTốtRất tốt
TCP/UDP Load BalancingTốtRất mạnh
Giới hạn truy cập (Rate Limit)Có hỗ trợMạnh và linh hoạt hơn
Tường lửa (WAF)Dùng ModSecurityExternal / WAF tích hợp
Mức độ dễ họcDễ tiếp cậnCần thời gian làm quen (Trung bình)
Độ linh hoạt cấu hìnhCaoRất cao
Tiêu thụ RAM (Memory)Cao hơnThấp hơn

4. Chuẩn bị trước khi Migration

Trước khi bắt tay vào làm, việc sao lưu (backup) là bắt buộc. Hãy xuất toàn bộ cấu hình Ingress hiện tại ra file:

kubectl get ingress -A -o yaml > ingress-backup.yaml

Kiểm tra và trích xuất các Annotations của NGINX đang dùng để chuẩn bị chuyển đổi:

kubectl get ingress -A -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{.metadata.annotations}{"\n\n"}{end}'

5. Cài đặt HAProxy Kubernetes Ingress Controller

Khuyến nghị sử dụng Helm để cài đặt. Đầu tiên, thêm kho lưu trữ của HAProxy:

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

Tiến hành cài đặt HAProxy Ingress vào namespace riêng:

helm install haproxy-ingress haproxytech/kubernetes-ingress \
  --namespace haproxy-controller \
  --create-namespace

6. Chiến lược Chạy Song Song (Được Khuyến Nghị)

Đây là phương pháp Best Practice cho hệ thống Production. Tuyệt đối không gỡ bỏ NGINX ngay lập tức. Hãy để cả ingress-nginxhaproxy-ingress chạy song song trong cùng một Cluster.

Phân chia Ingress Class

Chúng ta sẽ sử dụng thuộc tính ingressClassName để định hướng rõ ràng xem Ingress nào dùng NGINX, Ingress nào dùng HAProxy.

Tạo một IngressClass riêng cho HAProxy bằng cách lưu nội dung sau vào file ingressclass.yaml:

apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: haproxy
spec:
  controller: haproxy.org/ingress-controller

Sau đó áp dụng:

kubectl apply -f ingressclass.yaml

7. Các Bước Chuyển Đổi An Toàn (Migration Strategy)

Bước 1: Nhân bản (Duplicate) Ingress

Tạo một Ingress mới dành riêng cho HAProxy, song song với Ingress cũ của NGINX.

Ingress của NGINX cũ:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-nginx
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx

Ingress mới cho HAProxy:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-haproxy
spec:
  ingressClassName: haproxy

Bước 2: Thử nghiệm với Domain Phụ

Trỏ một domain thử nghiệm (ví dụ: test.example.com) về LoadBalancer của HAProxy.

Bước 3: Kiểm tra toàn diện (Testing)

Hãy đảm bảo bạn đã test kỹ các tính năng sau trên domain thử nghiệm:

  • Chứng chỉ bảo mật (TLS/SSL).
  • Kết nối WebSocket.
  • Lưu phiên người dùng (Sticky Session).
  • Tính năng tải file (Upload file).
  • Cấu hình Timeout và Redirect.
  • Giao thức HTTP/2.

Bước 4: Chuyển đổi thật (Switch Production DNS)

Sau khi mọi thứ hoạt động hoàn hảo, hãy trỏ Domain chính (Production) từ NGINX sang HAProxy LoadBalancer.


8. Chuyển Đổi Annotations (Từ NGINX sang HAProxy)

Đây là phần khó nhất vì cú pháp cấu hình (Annotations) của hai bên khác nhau. Dưới đây là các ánh xạ (mapping) phổ biến:

1. Viết lại đường dẫn (Rewrite Target):

  • NGINX: nginx.ingress.kubernetes.io/rewrite-target: /
  • HAProxy: haproxy.org/path-rewrite: /

2. Bắt buộc dùng HTTPS (SSL Redirect):

  • NGINX: nginx.ingress.kubernetes.io/ssl-redirect: "true"
  • HAProxy: haproxy.org/ssl-redirect: "true"

3. Giới hạn lưu lượng (Rate Limit):

  • NGINX: nginx.ingress.kubernetes.io/limit-rps: "10"
  • HAProxy: haproxy.org/rate-limit-requests: "10"

4. Thời gian chờ (Timeout):

  • NGINX: nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
  • HAProxy: haproxy.org/timeout-server: "300s"

5. Giữ phiên người dùng (Sticky Session):

  • NGINX: nginx.ingress.kubernetes.io/affinity: cookie
  • HAProxy: haproxy.org/cookie-persistence: app-cookie

9. Các Lưu Ý Về Nâng Cao

WebSocket

HAProxy hỗ trợ WebSocket rất tuyệt vời, bạn chỉ cần tăng thời gian timeout lên:

annotations:
  haproxy.org/timeout-client: 1h
  haproxy.org/timeout-server: 1h

Chứng Chỉ SSL (TLS)

Cấu hình TLS được giữ nguyên hoàn toàn, không cần thay đổi gì về Secret của Kubernetes.

  tls:
  - hosts:
    - app.example.com
    secretName: app-tls

Giữ lại IP thật của người dùng (Real IP)

Nếu bạn cần lấy địa chỉ IP thật của người truy cập, hãy chắc chắn cấu hình chính sách nhận traffic bằng thuộc tính sau trên Service:

spec:
  externalTrafficPolicy: Local

10. Cấu hình Helm Values cho Production

Để hệ thống hoạt động ổn định và sẵn sàng cho việc giám sát (Metrics/Prometheus), bạn nên dùng file values.yaml như sau khi cài đặt HAProxy bằng Helm:

controller:
  replicaCount: 2 # Luôn chạy ít nhất 2 bản sao để đảm bảo dự phòng
  service:
    type: LoadBalancer
  metrics:
    enabled: true # Bật metrics cho Prometheus
  resources:
    requests:
      cpu: 200m
      memory: 256Mi
    limits:
      cpu: 1
      memory: 1Gi
  extraArgs:
    stats: "true" # Bật trang thống kê Dashboard của HAProxy

11. Các lỗi thường gặp (Troubleshooting)

  1. Annotation không hoạt động: Thông thường là do bạn viết sai tên tham số, hoặc tính năng đó HAProxy xử lý theo một cách khác.
  2. Lỗi Rewrite Path: Logic viết lại đường dẫn của HAProxy khác NGINX. Bạn cần kiểm tra kỹ cú pháp Regex của mình.
  3. Mất IP thật của người dùng: Quên cấu hình externalTrafficPolicy: Local ở LoadBalancer.
  4. Bị ngắt kết nối WebSocket đột ngột: Do thời gian timeout mặc định quá thấp, cần tăng lên (ví dụ: 1h).

12. Lời Khuyên Thực Tế

  • Đừng vội vàng gỡ NGINX: Việc chuyển đổi từ từ, tăng phần trăm traffic dần dần (Canary migration thông qua Cloudflare hoặc Route53) là cực kỳ quan trọng để đảm bảo an toàn.
  • Dùng trên EKS (AWS): Nếu ứng dụng của bạn chủ yếu dùng HTTP đơn giản, AWS Load Balancer Controller (ALB) có thể dễ dàng hơn. Nhưng nếu bạn có hệ thống API phức tạp, WebSocket, hoặc TCP, HAProxy Ingress vẫn là “vua”.

Hy vọng bài viết này của TechCoBan đã giúp bạn hình dung rõ ràng lộ trình chuyển đổi từ Ingress NGINX sang HAProxy Kubernetes Ingress Controller. Chúc bạn thành công!


13. Tài liệu tham khảo

Bình luận

Bài viết liên quan