如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡


原文地址:如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

我假设Kubernetes集群已经设置好并且已经启动并正在运行,我们将为NGINX创建基于CentOS / RHEL的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的默认存储库中不可用。

[linuxtechi@nginxlb ~]$ sudo dnf install epel-release -y

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

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

[linuxtechi@nginxlb ~]$ sudo dnf install nginx -y

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

#rpm -qi nginx

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

[root@nginxlb ~]# firewall-cmd --permanent --add-service=http
[root@nginxlb ~]# firewall-cmd --permanent --add-service=https
[root@nginxlb ~]# firewall-cmd –reload

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

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

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

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

$ kubectl get all -n ingress-nginx

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

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

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

[root@nginxlb ~]# vim /etc/nginx/nginx.conf

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

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

保存并退出文件。

按照上述变化,当任何请求进入端口80上的nginx服务器IP那么它将被路由到Kubernetes工作节点的IP(192.168.1.41/42上NodePort()32760)。

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

[root@nginxlb ~]# systemctl start nginx
[root@nginxlb ~]# systemctl enable nginx

测试NGINX for TCP负载均衡器

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

[kadmin@k8s-master ~]$ kubectl create deployment nginx-deployment --image=nginx
deployment.apps/nginx-deployment created
[kadmin@k8s-master ~]$ kubectl expose deployments nginx-deployment --name=nginx-deployment --type=NodePort --port=80
service/nginx-deployment exposed
[kadmin@k8s-master ~]$
[kadmin@k8s-master ~]$ vi nginx-ingress.yaml

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

[kadmin@k8s-master ~]$ kubectl create -f nginx-ingress.yaml
ingress.networking.k8s.io/nginx-ingress-example created
[kadmin@k8s-master ~]$

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

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

完美,让我们更新系统的主机文件,以便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,

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

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

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

假设我们已经运行了一个名为“ l inux-udp-port ”的容器,其中有nc命令可用,并通过服务在UDP端口10001上将其作为NodePort类型公开。

[kadmin@k8s-master ~]$ kubectl expose pod linux-udp-pod --type=NodePort --port=10001 --protocol=UDP
service/linux-udp-pod exposed
[kadmin@k8s-master ~]$
[kadmin@k8s-master ~]$ 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
[kadmin@k8s-master ~]$

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

[root@nginxlb ~]# 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;
 }
 ……

如何为Kubernetes集群的应用配置NGINX TCP/UDP负载均衡

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

[root@nginxlb ~]# systemctl restart nginx

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

[root@nginxlb ~]# firewall-cmd --permanent --add-port=1751/udp
[root@nginxlb ~]# firewall-cmd --reload

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

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

[kadmin@k8s-master ~]$ kubectl exec -it linux-udp-pod -- bash
root@linux-udp-pod:/# nc -l -u -p 10001

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

#nc -u 192.168.1.50 1751

[root@linux-client ~]# nc -u 192.168.1.50 1751
Hello, this UDP LB testing

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

root@linux-udp-pod:/# nc -l -u -p 10001
Hello, this UDP LB testing

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

评论

登录后评论

服务器优惠活动

Top