Cài đặt Nginx Ingress Controller cho Kubernetes bằng helm

Ingress là một resource của Kubernetes tương tự như các resource như Deployment, Statefulset,...

Ingress có nhiệm vụ giúp định tuyến (route) các request từ người dùng bên ngoài vào service được triển khai trong cụm Kubernetes. Thông thường, Ingress được sử dụng với mục đích routing tại layer 7 với các phương thức cơ bản như

- host-based routing: định tuyến dựa trên hostname truy cập của người dùng. Ví dụ request vào URL https://auth.example.com request sẽ được gửi tới Service Name production-auth. Với request vào URL https://api.example.com request sẽ được gửi tới Service Name production-api

- path-based routing: định tuyến dựa trên path của request. Ví dụ request vào URL https://api.example.com/user sẽ gửi tới Service Name production-user-api, request vào URL https://api.example.com/posts sẽ gửi tới Service Name production-post-api.

Trong môi trường microservices, một hệ thống sẽ bao gồm nhiều dịch vụ khác nhau. Do vậy việc sử dụng Ingress để định tuyến tại layer 7 và quản lý các request vào các service đơn giản hơn và linh hoạt hơn.

Ngoài tính năng cơ bản trên, Ingress Controller còn hỗ trợ nhiều tính năng khác như Rate Limit, Authentication, CORS,... Việc hỗ trợ các tính năng này hoàn toàn phụ thuộc vào Ingress Controller mà bạn sử dụng. Hiện tại có rất nhiều các loại Ingress Controller khác nhau như: Nginx Ingress, Kong Ingress, Traefik, Haproxy Ingress, Voyager, Contour, Istio, Ambassador, Gloo, Skipper. Bạn có thể tham khảo thêm tại [1]

Trong bài này tôi sẽ cài đặt  Nginx Ingress Controller bằng helm và một vài thiết lập Ingress  cơ bản.

Thông thường, tôi sẽ cài đặt Ingress Controller ở mode DaemonSet. Lúc này các Ingress Controller cụ thể là Nginx sẽ chạy trên toàn bộ worker nodes. Ta có thể sử dụng Load Balancer để phân tải xuống các Nginx trên các worker node. Điều này giúp ta dễ dàng mở rộng hệ thống khi số lượng request lớn lên. Khi ta thêm các worker node, Nginx Ingress Controller cũng được scale tương ứng.

Mô hình lý tưởng là User -> L4LB -> L7LB -> Service mô tả như sau

Khi cài đặt Nginx Ingress Controller, ta thường tạo Service resource cho Ingress. Trên hạ tầng các nhà cung cấp Cloud sẽ khởi tạo Load Balancer và tự động cấu hình forward request port 80 và 443 vào các Nginx Ingress Controller.

Tôi sẽ sử dụng Cluster Kubernetes tạo sẵn trên hệ thống BizFly Cloud để cài đặt.

Yêu cầu cài đặt helm version 2 hoặc 3.

Thêm repo helm của nginx-ingress

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm repo update

Install Nginx Ingress bằng 1 lệnh duy nhất

helm install --name nginx ingress-nginx/ingress-nginx --set controller.kind=DaemonSet

Kiểm tra các pod của nginx-controller

Load Balancer đang được khởi tạo

Sau khi Load Balancer khởi tạo thành công, ta có thể kiểm tra địa chỉ IP External (Public IP) của Load Balancer để truy cập

Truy cập thử vào Load Balancer

Kiểm tra Load Balancer trên Dashboard BizFly Cloud

Load Balancer được tạo ra với 2 Listener trên port 80 và 443 tương ứng với Nhóm Server như hình sau

Như vậy ta đã cài đặt xong Nginx Ingress Controller ở mode DaemonSet và sử dụng Load Balancer tự động cân tải cho các Nginx process trên các Node worker.

Trong bài tiếp theo, tôi sẽ hướng dẫn một số cấu hình cơ bản cho Nginx Ingress .

References:

[1] - https://medium.com/flant-com/comparing-ingress-controllers-for-kubernetes-9b397483b46b