如何在Linux中将NGINX配置为TCP / UDP负载均衡器

众所周知,NGINX是高度评价的开源Web服务器之一,但它也可以用作TCP和UDP负载平衡器。 与HAProxy相比,使用nginx作为负载均衡器的主要好处之一是它还可以负载均衡基于UDP的流量。 在本文中,我们将演示如何将NGINX配置为Kubernetes集群中部署的应用程序的负载平衡器。

我假设Kubernetes集群已经设置好并且已经启动并正在运行,我们将基于CentOS / RHEL为NGINX创建一个VM。

以下是实验室设置的详细信息:

  • NGINX VM(最低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

让我们跳到NGINX的安装和配置,在我的情况下,我将最少的CentOS 8用于NGINX。

步骤1)为nginx软件包启用EPEL存储库

登录到您的CentOS 8系统并启用epel存储库,因为nginx软件包在CentOS / RHEL的默认存储库中不可用。

[[email protected] ~]$ sudo dnf install epel-release -y

步骤2)使用dnf命令安装NGINX

运行以下dnf命令以安装nginx,

[[email protected] ~]$ sudo dnf install nginx -y

通过在rpm命令下运行来验证NGINX详细信息,

# rpm -qi nginx

NGINX-Info-rpm-command-linux

通过在命令下运行,在防火墙中允许NGINX端口

[[email protected] ~]# firewall-cmd --permanent --add-service=http
[[email protected] ~]# firewall-cmd --permanent --add-service=https
[[email protected] ~]# firewall-cmd –reload

使用以下命令将SELinux设置为许可模式,

[[email protected] ~]# sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config
[[email protected] ~]# setenforce 0
[[email protected] ~]#

步骤3)从Kubernetes设置中提取入口控制器的NodePort详细信息

在Kubernetes中,nginx入口控制器用于处理已定义资源的传入流量。 当我们部署入口控制器时,那时还将创建一个服务,该服务将主机节点端口映射到端口80和443。这些主机节点端口从每个辅助节点打开。 要获取此详细信息,请登录到kube主节点或控制计划并运行,

$ kubectl get all -n ingress-nginx

kubectl-ingress-nginx控制器详细信息

从上面的输出中可以看到,每个工作节点的NodePort 32760映射到端口80,NodePort 32375映射到443端口。 我们将在Nginx配置文件中使用这些节点端口来平衡TCP通信量。

步骤4)将NGINX配置为充当TCP负载平衡器

编辑nginx配置文件,并向其中添加以下内容,

[[email protected] ~]# vim /etc/nginx/nginx.conf

注释掉“服务器”部分的各行(从38到57),并添加以下几行,

注释-默认服务器部分-nginx-centos8

K8s-workers-nginx-lb-centos8

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;
    }
}

保存并退出文件。

根据上述更改,当任何请求都在nginx服务器IP上的端口80上发出时,它将被路由到NodePort(32760)上的Kubernetes工作节点IP(192.168.1.41/42)。

让我们使用以下命令启动并启用NGINX服务:

[[email protected] ~]# systemctl start nginx
[[email protected] ~]# systemctl enable nginx

测试NGINX for TCP负载均衡器

要测试nginx作为Kubernetes的TCP负载平衡器是否工作正常,请部署基于nginx的部署,通过服务公开部署,并为nginx部署定义入口资源。 我已经使用以下命令和yaml文件来部署这些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

Nginx入口资源示例K8

[[email protected] ~]$ kubectl create -f nginx-ingress.yaml
ingress.networking.k8s.io/nginx-ingress-example created
[[email protected] ~]$

运行以下命令以获取部署,svc和入口详细信息:

部署-SVC-Ingress-Details-k8s

完美,让我们更新系统的主机文件,以便nginx-lb.example.com指向nginx服务器的IP地址(192.168.1.50)

192.168.1.50      nginx-lb.example.com

让我们尝试对网址进行ping操作,以确认它指向NGINX服务器IP,

# 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

现在,尝试通过网络浏览器访问URL,

Nginx页面通过lb-ressress-k8s

很好,上面证实了NGINX作为TCP负载平衡器可以正常工作,因为它可以负载平衡K8s工作节点之间端口80上的TCP通信量。

步骤5)配置NGINX充当UDP负载均衡器

假设我们在Kubernetes内部运行了一个基于UDP的应用程序,该应用程序以UDP端口31923作为NodePort类型公开。 我们将配置NGINX以平衡从端口1751到k8s工作节点的NodePort的UDP流量。

假设我们已经运行了一个名为“ linux-udp-port”的pod,在其中可用nc命令,并通过UDP端口10001上的服务将其公开为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] ~]$

要将NGINX配置为UDP负载平衡器,请编辑其配置文件,并在文件末尾添加以下内容

[[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;
  }
 ……

UDP-NGINX-配置-Linux

保存并退出文件,然后使用以下命令重启nginx服务,

[[email protected] ~]# systemctl restart nginx

通过运行以下命令在防火墙中允许UDP端口1751

[[email protected] ~]# firewall-cmd --permanent --add-port=1751/udp
[[email protected] ~]# firewall-cmd --reload

使用上面配置的NGINX测试UDP负载平衡

登录到POD并启动一个虚拟服务,该服务侦听UDP端口10001,

[[email protected] ~]$ kubectl exec -it linux-udp-pod -- bash
[email protected]:/# nc -l -u -p 10001

保持原样,从要测试UDP负载平衡的计算机登录,确保该计算机可以访问NGINX服务器,运行以下命令以连接到NGINX服务器IP上的udp端口(1751),然后尝试输入字符串

#nc -u 192.168.1.50 1751

[[email protected] ~]# nc -u 192.168.1.50 1751
Hello, this UDP LB testing

现在转到POD的ssh会话,在那里我们应该看到相同的消息,

[email protected]:/# nc -l -u -p 10001
Hello, this UDP LB testing

上面的完美输出确认,NGNNX可以正常使用UDP负载平衡。 这就是本文的全部内容,希望您能从中找到有用的信息,并帮助您设置NGINX负载均衡器。 请随时在下面的评论部分中分享您的技术反馈。

Sidebar