假设Kubernetes集群已经配置好,我们将基于 CentOS 为Nginx创建一个虚拟机。
以下是实验种设置的详细信息:
Nginx (CenOS8 Minimal) - 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仓库
因为nginx软件包在CentOS系统默认仓库里面没有,所以需要安装epel仓库:
[root@nginxlb ~]# dnf install epel-release -y
步骤2)安装Nginx
运行以下 命令 安装nginx:
[root@nginxlb ~]# dnf install nginx -y
使用rpm 命令 验证Nginx包的详细信息:
[root@nginxlb ~]# rpm -qi nginx
配置防火墙,允许访问nginx的http和https服务:
[root@nginxlb ~]# firewall-cmd --permanent --add-service=http
[root@nginxlb ~]# firewall-cmd --permanent --add-service=https
[root@nginxlb ~]# firewall-cmd –reload
使用以下命令将SE Linux 设置为permissive模式,并重启系统使selinux关闭生效:
[root@nginxlb ~]# sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config
[root@nginxlb ~]# reboot
步骤3)从Kubernetes中获取应用程序的NodePort详细信息
[kadmin@k8s-master ~]$ kubectl get all -n ingress-nginx
从上面的输出中可以看到,每个工作节点的NodePort 32760映射到端口80,NodePort 32375映射到443端口。我们将在Nginx配置文件中使用这些节点端口来做负载均衡。
步骤4)将Nginx配置负载均衡
编辑nginx配置文件,并添加以下内容:
[root@nginxlb ~]# vim /etc/nginx/nginx.conf
注释掉“server”部分(从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工作节点(192.168.1.41和192.168.1.42)的NodePort(32760)端口上。
使用以下命令启用Nginx服务:
[root@nginxlb ~]# systemctl start nginx
[root@nginxlb ~]# systemctl enable nginx
测试Nginx的 TCP负载均衡器
要测试nginx作为Kubernetes的TCP负载均衡是否工作正常,请部署基于nginx的deployment,将deployment的端口暴露为80端口,并为nginx 的deployment定义入口资源。我已经使用以下命令来部署这些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
运行以下命令以获取deployments,svc和ingress详细信息:
更新本地主机的hosts文件,以便nginx-lb.example.com指向nginx服务器的IP地址(192.168.1.50)
[root@localhost ~]# echo "192.168.1.50 nginx-lb.example.com" >>/etc/hosts
尝试通过浏览器访问nginx-lb.example.com
总结
上面证实了Nginx作为TCP负载均衡器可以正常工作,因为它可以负载平衡K8s工作节点之间端口80上的TCP通信量。
本文主要解决3个问题:
第一、链路聚合的定义和作用是什么?
第二、如何配置链路聚合?
第三、链路聚合的实际应用场景有那些?
第一、链路聚合的定义和作用是什么?
答:链路聚合的定义:链路聚合,官方称聚合链接,民间又称网卡组队,具体指的是将多个网卡绑定在一起组建一个虚拟网卡,外界与虚拟网卡进行通信,虚拟网卡再将信息进行分发;
链路聚合的作用:可以实现轮询式的流量负载均衡和热备份的作用;
举个栗子:
链路聚合就好比是一个包工头,这个包工头为了多赚钱,多接订单,肯定需要找多个小弟;
这样就可以保障,万一有一个小弟感冒了,不能上班,这时有其他小弟可以顶上;
当客户需要盖房子的时候,直接找包工头就好了,不需要一个一个的去找建筑工人;
第二、如何配置链路聚合?
答:
1、配置链路聚合的命令是:
nmcli connection add type team con-name team0 ifname team0 autoconnect yes config '{"runner": {"name": "activebackup"}}'
译为:nmcli connection 添加 类型 team(组队)
配置文件名 team0 网卡名 team0 每次开机自动启用
配置运行模式 热备份模式
整体译为:为系统网卡添加一个 team (团队),团队名称叫 team0 ,配置文件也叫 team0 , 并且设置为开机自动启动,配置运行模式为热备份模式;
2、为链路聚合添加成员的命令是:
nmcli connection add type team-slave con-name team0-1 ifname eth1 master team0
nmcli connection add type team-slave con-name team0-2 ifname eth2 master team0
注释:nmcli connection 添加类型为 team的成员
配置文件名 team0-1 网卡为 eth1 主设备为 team0
整体译为:为主设备team0添加两张网卡,eth1和eth2;
3、为tem0配置ip地址的命令是:
nmcli connection modify team0 ipv4.method manual ipv4.addresses
“IP 地址 / 子网掩码” connection.autoconnect yes
4、激活team0的命令是:
nmcli connection up team0
第三、链路聚合的实际应用场景有那些?
答:当服务器提供比较重要的服务时,只准备一张网卡是远远不够的,因为一但网卡出现故障,客户就无法访问,这就会造成客户流失,体验感差;
这个时候就可以运用链路聚合的方法来解决,将多张网卡绑定在一起创建一张虚拟网卡,从而实现网卡热备份,流量轮询式负载均衡;
以此来保障服务器能够正常提供服务,给用户以良好的体验;
注意事项:
在创建虚拟网卡和添加成员时,如果命令敲错了,一定要删除错误的信息,以免造成通信混乱;
删除的命令是:nmcli connection delete team0 (team0或team x)
查看team0的信息命令是: teamdctl team0 state
以上.......
(本篇完)
祝:开心!
罗贵
2019-03-24
这一小节中,我们将实战 Nginx 的四层和七层负载均衡功能。条件有限,使用一台公网主机,在上面搭建好 Nginx 服务。公网 IP 为 180.76.152.113。
首先会进行简单的四层负载均衡实验,不会涉及多种负载均衡算法,只使用默认的 Round-Robin算法。在后续的七层负载均衡实验中,会重点测试不同的负载均衡策略,完成相关实验。
首先在 nginx.conf 中添加如下 stream 指令块配置:
上述配置用端口3000和3001模拟两个上游服务器,然后在 upstream 指令块中指定这两个上游服务器的地址,同时给第一个设置权重为2。由于默认采用的是加权的 Round-Robin 算法,默认服务器的权重为1。设置为2,表明3次请求中,2次会转发到3000端口,一次会转发到3001端口,下面的测试也验证了这一点。
和四层的配置其实差不多,在七层中除了测试最基本的,我们还将测试前面提到的几种负载均衡策略,进一步熟悉 Nginx 中的负载均衡配置。
在 nginx.conf 中添加如下的 http 指令块:
上述配置中,我们用8000,8001和8002三个端口模拟了3个上游服务器,默认使用轮询负载均衡算法,而且三个的权重均为1。进行如下的 http 请求操作,可以看到 Nginx 转发 http 请求会均匀地分配到3个服务器上。
我们打开 ip_hash 指令的注释,这个时候默认是使用客户端的 ip 地址作为 hash 的 key,然后重启 Nginx 服务并进行如下的命令行操作:
接下来,注释 ip_hash 指令,我们打开 hash user_$arg_username 这行配置的注释, hash 指令可以让我们根据我们设置的 key 进行 hash,然后根据 hash 值选择上游的服务器。具体测试参看下面的 Linux 命令:
这里我们可以看到,在请求中带上 username 参数,Nginx 中配置的 hash 算法会根据请求中带的 username 参数作为 key 去进行 hash,然后在根据 hash 结果映射上游服务器。username 相同时,选择的上游服务器肯定是一样的,只有在 username 的值发生变化时,返回的响应才可能有变化。
今天我们完成了几个测试实验,主要是针对 Nginx 的四层和七层的负载均衡功能进行了测试。这个功能在微服务部署中会有较多的应用。因为高流量企业为保证服务的高可用性,往往会水平扩展多个相同功能的服务,部署在多台主机上,这个时候负载均衡技术就能派上用场了,而 Nginx 提供了完善的负载均衡功能以及多种负载均衡算法,能满足大部分企业的需求,如果还不够,可以通过编写内部开发模块并集成到 Nginx,实现相应的需求。所以说 Nginx 是非常值得学习和深入研究的。
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)