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