Jak víme, NGINX je jedním z vysoce hodnocených webových serverů s otevřeným zdrojovým kódem, ale lze jej použít také jako vyrovnávač zatížení TCP a UDP. Jednou z hlavních výhod použití nginx jako nástroje pro vyrovnávání zatížení přes HAProxy je to, že může také vyvažovat provoz založený na UDP. V tomto článku si ukážeme, jak lze NGINX nakonfigurovat jako nástroj pro vyrovnávání zatížení pro aplikace nasazené v clusteru Kubernetes.
Předpokládám, že cluster Kubernetes je již nastaven a je v provozu, vytvoříme virtuální počítač založený na CentOS / RHEL pro NGINX.
Níže jsou uvedeny podrobnosti o nastavení laboratoře:
- NGINX VM (minimální 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
Pojďme se vrhnout na instalaci a konfiguraci NGINX, v mém případě používám minimální CentOS 8 pro NGINX.
Krok 1) Povolte úložiště EPEL pro balíček nginx
Přihlaste se do svého systému CentOS 8 a povolte úložiště epel, protože balíček nginx není k dispozici ve výchozích úložištích CentOS / RHEL.
[[email protected] ~]$ sudo dnf install epel-release -y
Krok 2) Nainstalujte NGINX pomocí příkazu dnf
Spuštěním následujícího příkazu dnf nainstalujte nginx,
[[email protected] ~]$ sudo dnf install nginx -y
Ověřte podrobnosti NGINX spuštěním příkazu rpm,
# rpm -qi nginx
Povolte porty NGINX ve bráně firewall spuštěním příkazů pod příkazy
[[email protected] ~]# firewall-cmd --permanent --add-service=http [[email protected] ~]# firewall-cmd --permanent --add-service=https [[email protected] ~]# firewall-cmd –reload
Nastavte SELinux do permisivního režimu pomocí následujících příkazů,
[[email protected] ~]# sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config [[email protected] ~]# setenforce 0 [[email protected] ~]#
Krok 3) Extrahujte podrobnosti NodePort pro řadič vstupu z nastavení Kubernetes
V Kubernetes se nginx ingress controller používá ke zpracování příchozího provozu pro definované zdroje. Když nasadíme ingress controller, pak se v té době také vytvoří služba, která mapuje porty hostitelského uzlu na porty 80 a 443. Tyto porty hostitelských uzlů se otevírají z každého pracovního uzlu. Chcete-li získat tyto podrobnosti, přihlaste se do hlavního uzlu kube nebo kontrolního plánu a spusťte
$ kubectl get all -n ingress-nginx
Jak můžeme vidět na výstupu výše, NodePort 32760 každého pracovního uzlu je mapován na port 80 a NodePort 32375 je mapován na port 443. Tyto porty uzlů v konfiguračním souboru Nginx použijeme pro vyrovnávání zátěže tcp provozu.
Krok 4) Nakonfigurujte NGINX, aby fungoval jako nástroj pro vyrovnávání zatížení TCP
Upravte konfigurační soubor nginx a přidejte do něj následující obsah
[[email protected] ~]# vim /etc/nginx/nginx.conf
Zakomentuje řádky sekcí serveru (od 38 do 57) a přidá následující řádky
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; } }
Uložte a ukončete soubor.
Podle výše uvedených změn, když jakýkoli požadavek přijde na portu 80 na IP serveru nginx, bude směrován na IP adresy pracovních uzlů Kubernetes (192.168.1.41/42) na NodePort (32760).
Spusťte a povolte službu NGINX pomocí následujících příkazů,
[[email protected] ~]# systemctl start nginx [[email protected] ~]# systemctl enable nginx
Otestujte NGINX pro nástroj pro vyrovnávání zatížení TCP
Chcete-li otestovat, zda nginx funguje dobře nebo ne jako nástroj pro vyrovnávání zatížení TCP pro Kubernetes, nasaďte nasazení založené na nginx, odhalte nasazení prostřednictvím služby a definujte vstupní zdroj pro nasazení nginx. K nasazení těchto objektů Kubernetes jsem použil následující příkazy a soubor yaml,
[[email protected] ~]$ kubectl create deployment nginx-deployment --image=nginx deployment.apps/nginx-deployment created [[email protected] ~]$ kubectl expose deployments nginx-deployment --name=nginx-deployment --type=NodePort --port=80 service/nginx-deployment exposed [[email protected] ~]$ [[email protected] ~]$ vi nginx-ingress.yaml
[[email protected] ~]$ kubectl create -f nginx-ingress.yaml ingress.networking.k8s.io/nginx-ingress-example created [[email protected] ~]$
Spuštěním následujících příkazů získáte podrobnosti o nasazení, svc a vstupu:
Perfektní, nechte aktualizovat soubor hostitele vašeho systému tak, aby nginx-lb.example.com ukazoval na IP adresu serveru nginx (192.168.1.50)
192.168.1.50 nginx-lb.example.com
Zkusme pingnout na adresu URL, abychom potvrdili, že odkazuje na IP serveru NGINX,
# ping nginx-lb.example.com Pinging nginx-lb.example.com [192.168.1.50] with 32 bytes of data: Reply from 192.168.1.50: bytes=32 time<1ms TTL=64 Reply from 192.168.1.50: bytes=32 time<1ms TTL=64
Nyní zkuste získat přístup k URL prostřednictvím webového prohlížeče,
Skvělé, výše potvrzuje, že NGINX funguje dobře jako nástroj pro vyrovnávání zatížení TCP, protože vyrovnává zatížení TCP provoz na portu 80 mezi pracovními uzly K8.
Krok 5) Nakonfigurujte NGINX tak, aby fungoval jako UDP Load Balancer
Předpokládejme, že uvnitř Kubernetes běží aplikace založená na UDP, aplikace je vystavena s portem UDP 31923 jako typ NodePort. Nakonfigurujeme NGINX tak, aby vyvažoval zatížení UDP provozu přicházejícího na port 1751 do NodePort pracovních uzlů k8s.
Předpokládejme, že již máme spuštěný modul s názvem „linux-udp-port“, ve kterém je dostupný příkaz nc, vystavte jej prostřednictvím služby na portu UDP 10001 jako typ NodePort.
[[email protected] ~]$ kubectl expose pod linux-udp-pod --type=NodePort --port=10001 --protocol=UDP service/linux-udp-pod exposed [[email protected] ~]$ [[email protected] ~]$ 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 [[email protected] ~]$
Chcete-li nakonfigurovat NGINX jako nástroj pro vyrovnávání zatížení UDP, upravte jeho konfigurační soubor a na konec souboru přidejte následující obsah
[[email protected] ~]# vim /etc/nginx/nginx.conf …… 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; } ……
Uložte a ukončete soubor a restartujte službu nginx pomocí následujícího příkazu
[[email protected] ~]# systemctl restart nginx
Povolte port UDP 1751 ve bráně firewall spuštěním následujícího příkazu
[[email protected] ~]# firewall-cmd --permanent --add-port=1751/udp [[email protected] ~]# firewall-cmd --reload
Otestujte UDP Load Balancing s výše nakonfigurovaným NGINX
Přihlaste se do POD a spusťte fiktivní službu, která naslouchá na portu UDP 10001,
[[email protected] ~]$ kubectl exec -it linux-udp-pod -- bash [email protected]:/# nc -l -u -p 10001
Nechte to tak, přihlaste se k počítači, ze kterého chcete otestovat vyrovnávání zátěže UDP, ujistěte se, že server NGINX je z tohoto počítače dostupný, spusťte následující příkaz pro připojení k portu udp (1751) na IP serveru NGINX a poté zkuste zadejte řetězec
# nc -u 192.168.1.50 1751
[[email protected] ~]# nc -u 192.168.1.50 1751 Hello, this UDP LB testing
Nyní přejděte do ssh session POD, tam bychom měli vidět stejnou zprávu,
[email protected]:/# nc -l -u -p 10001 Hello, this UDP LB testing
Perfektní výše uvedený výstup potvrzuje, že vyvažování zátěže UDP s NGINX funguje dobře. To je vše z tohoto článku, doufám, že to najdete informativní a pomůže vám nastavit NGINX Load Balancer. Neváhejte se prosím podělit o svou technickou zpětnou vazbu v sekci komentářů níže.