lvs-dr模式配置示例

一、工作原理复习

1、客户端发送请求到 Director Server (负载均衡器 DS),请求的数据报文(源IP是CIP,目标IP是VIP)到达内核空间,Director Server 和 Real Server 在同一个网络中,数据通过二层数据链路层来传输

2、内核空间判断数据包的目标IP是本机IP,此时LVS比对数据包请求的服务是否是集群服务,是集群服务就重新封装数据包。修改源 MAC 地址为 Director Server 的 MAC 地址,修改目标 MAC 地址为 Real Server 的 MAC 地址,源IP地址与目标IP地址没有改变,然后将数据包发送给 Real Server 1

3、到达 Real Server 的请求报文的 MAC 地址是自身的 MAC 地址,就接收此报文。数据包重新封装报文(源IP地址为VIP,目标IP 为CIP),将响应报文通过IO接口传送给物理网卡然后向外发出,Real server 1 直接将响应报文传送到客户端

二、lvs四层直接代理应用

lvs四层–代理应用:real server是应用服务器

 

1、环境准备(所有机器)

setenforce 0
systemctl stop firewalld
配置静态ip
配置时间同步

2、主机规划

VIP192.168.71.200
DIP192.168.71.115
web01(nginx+静态页面): 192.168.71.112:8080
web02(nginx+静态页面): 192.168.71.113:8080
web03(nginx+静态页面): 192.168.71.114:8080

3、lvs四层负载均衡部署(在192.168.71.115这台机器上部署)

3.1 安装ipvs

# 1、安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 2、配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules};
do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

3.2 为四层负载均衡机器添加一个vip

#1、需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。
ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up
#2、添加路由规则
route add -host 192.168.71.200 dev ens36:0
#3、启用系统的包转发功能
echo "1" >/proc/sys/net/ipv4/ip_forward
3.3 添加负载均衡规则
# 强调强调强调:LVS本身不支持将请求的目标端口从一个端口转换到另一个端口,所以
# ipvsadm -a -t 192.168.71.200:6666 -r 192.168.71.112:8080 -g # 这种添加方法是错误的,必须端口一致
ipvsadm -C #清除内核虚拟服务器表中的所有记录
ipvsadm -A -t 192.168.71.200:8080 -s rr # -s rr表示采用轮询策略。
ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.112:8080 -g #添加服务器节点,-g表示指定LVS 的工作模式为直接路由模式
ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.113:8080 -g #添加服务器节点
ipvsadm -a -t 192.168.71.200:8080 -r 192.168.71.114:8080 -g #添加服务器节点
ipvsadm -Ln #查看节点状态,加个“-n”将以数字形式显示地址、端口信息

4、RS配置(三台web服务器上)

4.1 在本地lo网卡上配置上vip地址
ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up
route add -host 192.168.71.200 dev lo:0

4.2 关闭arp解析

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p #使用修改生效

配置注解:

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。

0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

1 – 避免使用另外一个接口上的mac地址去响应ARP请求;

2 – 尽可能使用能够匹配到ARP请求的最佳地址。

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;

0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

1 – 哪个接口上接受ARP请求,就从哪个端口上回应。

 

4.3  三个web上部署

部署nginx
然后放置文件:/usr/share/nginx/html/1.txt # 分别写入web01、web02、web03

 

5、测试访问

方式一:浏览器访问测试

先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个

http {
keepalive_timeout 0;
。。。。。。
}

 

方式二:在四层负载均衡以外的任一台机器上

[root@db ~]# curl http://192.168.71.200:8080/1.txt
---------------------web033333333333333333333333333333333333
[root@db ~]# curl http://192.168.71.200:8080/1.txt
-------------web02222222222222222222
[root@db ~]# curl http://192.168.71.200:8080/1.txt
--------------------web01111111111111111

 

三、lvs四层+nginx七层+应用

lvs四层–代理七层负载均衡nginx—代理web服务器:real server是七层负载均衡nginx,需要在它的lo上配置vip

 

 

1、环境准备(所有机器)

同上

2、主机规划

# 1、四层
VIP192.168.71.200
DIP192.168.71.115
# 2、两台七层
七层01(用nginx做七层负载):192.168.71.116:8081
七层02(用nginx做七层负载):192.168.71.111:8081
# 3、三台web
web01(nginx+静态页面): 192.168.71.112:8080
web02(nginx+静态页面): 192.168.71.113:8080
web03(nginx+静态页面): 192.168.71.114:8080

两台七层一样的配置,代理三台web

[root@lb01 ~]# cat /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
upstream web_app_servers {
server 192.168.71.112:8080 weight=1;
server 192.168.71.113:8080 weight=1;
server 192.168.71.114:8080 weight=1;
}
server {
listen 8081; # 强调:这里个的配置直接就监听端口,我们之前的课程中在其末尾加的proxy_protocol一定要去掉
location / {
proxy_pass http://web_app_servers;
}
}
}

3、lvs四层负载均衡部署(在192.168.71.115这台机器上部署)

3.1 安装ipvs(与第二章节的配置一模一样)

# 1、安装ipvsadm等相关工具
yum -y install ipvsadm ipset sysstat conntrack libseccomp
# 2、配置加载
cat > /etc/sysconfig/modules/ipvs.modules <<"EOF"
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_fo ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules};
do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs

3.2 为四层负载均衡机器添加一个vip(与第二章节的配置一模一样)

#1、需要特别注意的是,虚拟ip地址的广播地址是它本身,子网掩码是255.255.255.255。
ifconfig ens36:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up
#2、添加路由规则
route add -host 192.168.71.200 dev ens36:0
#3、启用系统的包转发功能
echo "1" >/proc/sys/net/ipv4/ip_forward
3.3 添加负载均衡规则(与第二章节配置的规则不同,此处应该添加的是代理到两台七层负载均衡的ip+port)
ipvsadm -C #清除内核虚拟服务器表中的所有记录
ipvsadm -A -t 192.168.71.200:8081 -s rr # -s rr表示采用轮询策略。
ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.116:8081 -g #添加服务器节点,-g表示指定LVS 的工作模式为直接路由模式
ipvsadm -a -t 192.168.71.200:8081 -r 192.168.71.111:8081 -g #添加服务器节点
ipvsadm -Ln #查看节点状态,加个“-n”将以数字形式显示地址、端口信息

4、RS配置(两台负载均衡是我们的RS,而不是web应用)

4.1 在本地lo网卡上配置上vip地址
ifconfig lo:0 192.168.71.200 broadcast 192.168.71.200 netmask 255.255.255.255 up
route add -host 192.168.71.200 dev lo:0

4.2 关闭arp解析

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
cat >> /etc/sysctl.conf << EOF
net.ipv4.ip_forward=1
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2
EOF
sysctl -p #使用修改生效

配置注解:

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。

0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

1 – 避免使用另外一个接口上的mac地址去响应ARP请求;

2 – 尽可能使用能够匹配到ARP请求的最佳地址。

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;

0 – 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

1 – 哪个接口上接受ARP请求,就从哪个端口上回应。

 

4.3  三个web上部署

部署nginx
然后放置文件:/usr/share/nginx/html/1.txt # 分别写入web01、web02、web03

 

5、测试访问

方式一:浏览器访问测试

先把所有web上的nginx配置里的keepalive_timeout都设置为0,否则会因为长连接而经常访问到一个

http {
keepalive_timeout 0;
。。。。。。
}

 

方式二:

[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
--------------------web01111111111111111
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
--------------------web01111111111111111
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
-------------web02222222222222222222
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
-------------web02222222222222222222
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
---------------------web033333333333333333333333333333333333
[root@web01 ~]# curl http://192.168.71.200:8081/1.txt
---------------------web03333333333333333333333333333333333

 

四、lvs四层代理nginx七层实现透传真实客户端ip

1、LVS-DR模式改变的是底层的mac地址,客户端ip地址本身就是透传的

2、所以我们只需要在七层负载均衡里用proxy_set_header指令来转发客户端真实ip即可

[root@db ~]# cat /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
http {
#keepalive_timeout 0;
upstream web_app_servers {
server 192.168.71.112:8080 weight=1;
server 192.168.71.113:8080 weight=1;
server 192.168.71.114:8080 weight=1;
}
server {
listen 8081;
location / {
proxy_pass http://web_app_servers;
# -------------------》只加上下面这一段即可
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}

 

3、后端的web里只需要从配置日志即可,其他地方都不需要配置

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 末尾加个$http_x_forwarded_for

 

测试:客户端(192.168.71.7 windows打开浏览器)访问

 

上一篇
下一篇
Copyright © 2022 Egon的技术星球 egonlin.com 版权所有 沪ICP备2022009235号 沪公网安备31011802005110号 青浦区尚茂路798弄 联系方式-13697081366