Cấu hình NGINX như một cân bằng tải TCP/UDP trong Linux

Chia sẻ

Như chúng ta đã biết, NGINX là một trong những web server mã nguồn mở được nhiều người sử dụng nhưng nó cũng có thể sử dụng như một cân bằng tải TCP và UDP. Một trong những lợi ích chính khi sử dụng nginx làm cân bằng tải thông qua HAProxy là nó có thể cân bằng được traffic dựa trên UDP. Trong bài này chúng tôi sẽ huwóng dẫn các bạn NGINX được cấu hình làm cân bằng tải như thế nào cho các ứng dụng được triển khai trên Kubernetes cluster.

Trong trường hợp này Kubernetes cluster đã được cài đặt và nó đang chạy, chúng tôi sẽ tạo máy ảo CentOS/RHEL cho NGINX
Chi tiết của bài Lab này

  • NGINX VM (Minimal CentOS / RHEL) – 192.168.1.50
  • Kube Master – 192.168.1.40
  • Kube Worker 1 – 192.168.1.41
  • Kube worker 2 – 192.168.1.42

Giờ chúng ta sẽ chuyển tới phần cài đặt và cấu hình NGINX, trong trường hợp này tôi dùng CentOS 8 bản minimal cho NGINX

Bước 1: Kích hoạt EPEL repository

Chúng ta cần kích hoạt epel repository vì package nginx không có trong repository mặc định của CentOS
Chúng ta thực hiện câu lệnh

sudo dnf install epel-release -y

Bước 2: Cài đặt NGINX từ dnf

sudo dnf install nginx -y

Kiểm tra các thông tin của NGINX thông qua câu lệnh rpm

rpm -qi nginx


Cho phép NGINX port hoạt động qua Firewall

firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd –reload

Cài đặt SELinux ở permissive mode

sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config
setenforce 0

Bước 3: Trích xuất thông tin NodePort để cấu hình ingress controller từ Kubernetes

Trong Kubernetes, nginx ingress controller được sử dụng để xử lí incoming traffic cho tài nguyên được định trước. Khi chúng ta triển khai ingress controller thì ngay lúc đó dịch vụ sẽ được triển khai và sẽ maps node ports vào port 80 và 443. Những host node ports này được mở cho mỗi worker node. Để có được những thông tin này, đăng nhập vào kube master node  hoặc control plan và chạy câu lệnh sau

kubectl get all -n ingress-nginx


Như chúng ta đã thấy trong output ở trên. NodePort 32760 đã được mapped tới port 80 và NodePort 32375 đã được mapped tới port 443. Chúng ta sử dụng những node ports này trong file cấu hình Nginx ở bước sau để cân bằng tải TCP Traffic

Bước 4: Cấu hình Nginx để cân bằng tải TCP Traffic

Mở File cấu hình Nginx bằng câu lệnh

vim /etc/nginx/nginx.conf

Tiến hành Comment các dòng trong hình (Từ dòng 38 tới dòng 57)

Thêm vào đoạn code sau

upstream backend {
server 192.168.1.41:32760;
server 192.168.1.42:32760;
}
server {
listen 80;
location / {
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
send_timeout 1800;
proxy_set_header Accept-Encoding "";
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://backend;
}
location /nginx_status {
stub_status;
}
}

Lưu và thoát
Cấu hình như trên, khi có bất kì request nào tới Port 80 sẽ được điều hướng tới Kubernetes worker nodes IPs (192.168.1.41/42) trên NodePort (32760).
Giờ hãy khởi động và kích hoạt NGINX service dùng các câu lệnh sau

systemctl start nginx
systemctl enable nginx

Bước 5: Cấu hình Nginx để cân bằng tải UDP Traffic

Giả sử chúng ta có một ứng dụng dựa trên UDP đang chạy trong Kubernetes, ứng dụng đang sử dụng UDP port 31923 như một NodePort. Chúng ta sẽ cấu hình NGINX để cân bằng tải UDP Traffic tới từ Port 1751 tới NodePort of k8s worker nodes.
Hãy giải sử chúng ta đang chạy một pod có tên là “linux-udp-port”, và câu lệnh nc được cài đặt sẵn, sử dụng UDP port 10001 như một NodePort

kubectl expose pod linux-udp-pod --type=NodePort --port=10001 --protocol=UDP
service/linux-udp-pod exposed
kubectl get svc linux-udp-pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
linux-udp-pod NodePort 10.96.6.216 <none> 10001:31923/UDP 19m

Để Cấu hình Nginx để cân bằng tải UDP Traffic. Chỉnh sửa file cấu hình của Nginx và thêm vào các dòng sau

stream {
upstream linux-udp {
server 192.168.1.41:31923;
server 192.168.1.42:31923;
}
server {
listen 1751 udp;
proxy_pass linux-udp;
proxy_responses 1;
}


Khởi chạy lại dịch vụ Nginx

systemctl restart nginx

Mở Port 1751 trên Firewall

firewall-cmd --permanent --add-port=1751/udp
firewall-cmd --reload

 

Chia sẻ