众所周知,NGINX 是一个广受好评的开源 web 服务器,它也可以用作 TCP 和 UDP 负载均衡器。与 HAProxy 相比,使用 nginx 作为负载均衡器的主要好处之一是它还可以负载平衡基于 UDP 的流量。
在本文中,我们将演示如何将 NGINX 配置为部署在 Kubernetes 集群中的应用程序的负载均衡器。
我们假设 Kubernetes Cluster 已经设置了,并且正在运行,我们将为 NGINX 基于 CentOS / RHEL 创建 VM
实验准备
- 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
1) 启用 EPEL 存储库
登录到您的 CentOS 8 系统并启用 EPEL 存储库,因为 CentOS / RHEL 的默认存储库中没有 NGINX 软件包。
[linuxtechi@nginxlb ~]$ sudo dnf install epel-release -y
2) 安装 NGINX
运行以下 DNF 命令以安装 NGINX
[linuxtechi@nginxlb ~]$ sudo dnf install nginx -y
查看 NGINX 信息
# rpm -qi nginx
放行 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 设置中提取入口控制器的节点端口
在 Kubernetes 中,nginx indress Controller 用于处理定义资源的传入流量。当我们部署入口控制器时,当时还创建了一个服务,该服务将主机节点端口映射到端口 80 和 443。这些主机节点端口是从每个工作节点打开的。要获取此细节,请登录到 Kube 主节点并运行如下命令:
$ kubectl get all -n ingress-nginx
正如输出所示,每个工作节点的端口 32760 映射到端口 80,端口 32375 映射到端口 443。我们将在 Nginx 配置文件中使用这些节点端口来负载均衡 tcp 流量。
4) 配置 NGINX 为 TCP 负载均衡器
编辑 nginx 配置文件
[root@nginxlb ~]# vim /etc/nginx/nginx.conf
注释掉部分行 (从 38 到 57 开始)
添加以下行
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 80 端口时, 将其路由到 Kubernetes Worker 节点 IPS(192.168.1.41/42)的(32760)端口 。
启动和启用 NGINX 服务
[root@nginxlb ~]# systemctl start nginx
[root@nginxlb ~]# systemctl enable nginx
测试 TCP 负载均衡
为了测试 nginx 作为 TCP 负载均衡器在 Kubernetes 上是否正常工作,部署基于 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
[kadmin@k8s-master ~]$ kubectl create -f nginx-ingress.yaml
ingress.networking.k8s.io/nginx-ingress-example created
[kadmin@k8s-master ~]$
运行以下命令获取部署、svc 和入口详细信息
更新你系统的主机文件,使 nginx-lb.example.com 指向 nginx 服务器的 ip 地址(192.168.1.50)
192.168.1.50 nginx-lb.example.com
我们尝试 ping url,以确认它指向 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
现在尝试通过 web 浏览器访问 URL
上面的输出证实了 NGINX 作为 TCP 负载均衡器工作得很好,因为它在 K8s 工作节点之间对来自端口 80 的 TCP 流量进行负载均衡。
5) 配置 NGINX 为 UDP 负载均衡器
假设我们有一个基于 UDP 的应用程序在 Kubernetes 中运行,应用程序以 UDP 端口 31923 作为 NodePort 类型公开。我们将配置 NGINX 来负载平衡来自端口 1751 的 UDP 流量到 k8s 工作节点的 NodePort 上。
我们假设我们已经运行了一个名为 linux-udp-port 的 pod,其中 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 的配置文件,并在文件末尾添加如下内容
[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;
}
……
保存并退出文件,并重启 nginx 服务
[root@nginxlb ~]# systemctl restart nginx
放行 UDP 端口 1751
[root@nginxlb ~]# firewall-cmd --permanent --add-port=1751/udp
[root@nginxlb ~]# firewall-cmd --reload
测试 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
完美,以上输出证实,UDP 负载均衡工作良好。
以上就是这篇文章的全部内容,我希望你能从中找到有用的信息,请毫不犹豫地在下面的评论区分享您的技术反馈。