Come sappiamo NGINX è uno dei server Web open source più apprezzati, ma può anche essere utilizzato come bilanciatore di carico TCP e UDP. Uno dei principali vantaggi dell'utilizzo di nginx come bilanciamento del carico su HAProxy è che può anche bilanciare il traffico basato su UDP. In questo articolo dimostreremo come NGINX può essere configurato come Load Balancer per le applicazioni distribuite nel cluster Kubernetes.
Presumo che il cluster Kubernetes sia già configurato e funzionante, creeremo una VM basata su CentOS/RHEL per NGINX.
Di seguito sono riportati i dettagli di configurazione del laboratorio:
- NGINX VM (CentOS minimo / RHEL) – 192.168.1.50
- Maestro di Kube – 192.168.1.40
- Kube Worker 1 – 192.168.1.41
- Operaio Kube 2 – 192.168.1.42
Passiamo all'installazione e alla configurazione di NGINX, nel mio caso sto usando CentOS 8 minimo per NGINX.
Passaggio 1) Abilita il repository EPEL per il pacchetto nginx
Accedi al tuo sistema CentOS 8 e abilita il repository epel perché il pacchetto nginx non è disponibile nei repository predefiniti di CentOS/RHEL.
[[email protected] ~]$ sudo dnf install epel-release -y
Passaggio 2) Installa NGINX con il comando dnf
Esegui il seguente comando dnf per installare nginx,
[[email protected] ~]$ sudo dnf install nginx -y
Verifica i dettagli di NGINX eseguendo sotto il comando rpm,
# rpm -qi nginx
Consenti le porte NGINX nel firewall eseguendo sotto i comandi
[[email protected] ~]# firewall-cmd --permanent --add-service=http [[email protected] ~]# firewall-cmd --permanent --add-service=https [[email protected] ~]# firewall-cmd –reload
Imposta SELinux in modalità permissiva usando i seguenti comandi,
[[email protected] ~]# sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config [[email protected] ~]# setenforce 0 [[email protected] ~]#
Passaggio 3) Estrai i dettagli di NodePort per il controller di ingresso dalla configurazione di Kubernetes
In Kubernetes, il controller di ingresso nginx viene utilizzato per gestire il traffico in entrata per le risorse definite. Quando distribuiamo il controller di ingresso, in quel momento viene creato anche un servizio che mappa le porte del nodo host sulle porte 80 e 443. Queste porte del nodo host vengono aperte da ciascun nodo di lavoro. Per ottenere questi dettagli, accedi al nodo master kube o al piano di controllo ed esegui,
$ kubectl get all -n ingress-nginx
Come possiamo vedere l'output sopra, NodePort 32760 di ogni nodo di lavoro è mappato sulla porta 80 e NodePort 32375 è mappato sulla porta 443. Utilizzeremo queste porte dei nodi nel file di configurazione di Nginx per il bilanciamento del carico del traffico TCP.
Passaggio 4) Configura NGINX in modo che agisca come bilanciatore di carico TCP
Modifica il file di configurazione di nginx e aggiungi i seguenti contenuti,
[[email protected] ~]# vim /etc/nginx/nginx.conf
Commenta le righe delle sezioni del server (a partire da 38 a 57) e aggiungi le righe seguenti,
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; } }
Salva ed esci dal file.
In base alle modifiche precedenti, quando una richiesta arriva sulla porta 80 sull'IP del server nginx, verrà instradata agli IP dei nodi di lavoro Kubernetes (192.168.1.41/42) su NodePort (32760).
Iniziamo e abilitiamo il servizio NGINX usando i seguenti comandi,
[[email protected] ~]# systemctl start nginx [[email protected] ~]# systemctl enable nginx
Testa NGINX per il bilanciamento del carico TCP
Per verificare se nginx funziona correttamente o meno come bilanciatore del carico TCP per Kubernetes, distribuire la distribuzione basata su nginx, esporre la distribuzione tramite il servizio e definire una risorsa di ingresso per la distribuzione di nginx. Ho usato i seguenti comandi e il file yaml per distribuire questi oggetti Kubernetes,
[[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] ~]$
Esegui i seguenti comandi per ottenere i dettagli di distribuzione, svc e ingresso:
Perfetto, aggiorna il file host del tuo sistema in modo che nginx-lb.example.com punti all'indirizzo IP del server nginx (192.168.1.50)
192.168.1.50 nginx-lb.example.com
Proviamo a eseguire il ping dell'URL per confermare che punta all'IP del server 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
Ora prova ad accedere all'URL tramite browser web,
Ottimo, quanto sopra conferma che NGINX funziona correttamente come bilanciamento del carico TCP perché sta bilanciando il traffico TCP in arrivo sulla porta 80 tra i nodi di lavoro K8s.
Passaggio 5) Configura NGINX in modo che agisca come UDP Load Balancer
Supponiamo di avere un'applicazione basata su UDP in esecuzione all'interno di Kubernetes, l'applicazione è esposta con la porta UDP 31923 come tipo NodePort. Configurare NGINX per bilanciare il carico del traffico UDP in arrivo sulla porta 1751 a NodePort dei nodi di lavoro k8s.
Supponiamo di avere già in esecuzione un pod chiamato "linux-udp-port" in cui è disponibile il comando nc, esporlo tramite servizio sulla porta UDP 10001 come tipo 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] ~]$
Per configurare NGINX come bilanciatore del carico UDP, modifica il suo file di configurazione e aggiungi i seguenti contenuti alla fine del file
[[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; } ……
Salva ed esci dal file e riavvia il servizio nginx usando il seguente comando,
[[email protected] ~]# systemctl restart nginx
Consenti la porta UDP 1751 nel firewall eseguendo il comando seguente
[[email protected] ~]# firewall-cmd --permanent --add-port=1751/udp [[email protected] ~]# firewall-cmd --reload
Verifica il bilanciamento del carico UDP con NGINX configurato in precedenza
Accedi al POD e avvia un servizio fittizio in ascolto sulla porta UDP 10001,
[[email protected] ~]$ kubectl exec -it linux-udp-pod -- bash [email protected]:/# nc -l -u -p 10001
Lasciare così com'è, accedere alla macchina da cui si desidera testare il bilanciamento del carico UDP, assicurarsi che il server NGINX sia raggiungibile da quella macchina, eseguire il comando seguente per connettersi alla porta udp (1751) sull'IP del server NGINX e quindi provare a digita la stringa
# nc -u 192.168.1.50 1751
[[email protected] ~]# nc -u 192.168.1.50 1751 Hello, this UDP LB testing
Ora vai alla sessione ssh del POD, lì dovremmo vedere lo stesso messaggio,
[email protected]:/# nc -l -u -p 10001 Hello, this UDP LB testing
Perfetto sopra l'output conferma che il bilanciamento del carico UDP funziona bene con NGINX. Questo è tutto da questo articolo, spero che tu lo trovi informativo e ti aiuti a configurare il bilanciamento del carico NGINX. Non esitare a condividere il tuo feedback tecnico nella sezione commenti qui sotto.