lvs笔记之nat&dr模型简单实现
lvs
集群
实现
负载均衡
nat
ipvsadm使用说明
-A: 添加一个集群服务 -t: tcp -u: udp -f: firewall mark, 通常用于将两个或以上的服务绑定为一个服务进行处理时使用 例如httpd和https iptables mongo表一起使用 service-address: -t IP:port -u ip:port -f firewall_mark -s 调度方法,默认为wlc -p timeout: persistent connection, 持久连接 -E 修改定义过的集群服务 -D -t|u|f service-address:删除指定的集群服务 RS相关: -a:向指定的Cluster services中添加RS -t|-u|-f service-address:指明将RS添加至哪个Cluster Service中 -r: 指定RS,可包含{IP[:port]},只有支持端口映射的LVS类型才允许此处使用跟集群服务中不同的端口 LVS类型: -g: Gateway模式,就是DR模型(默认) -i: ipip模式,TUN模型 -m: masquerade地址伪装自动完成后半段的原地址转换,NAT 指定RS权重: -w # 省略权重为1 -e: 修改指定的RS属性 -d -t|u|f service-address -r server-address:从指定的集群服务中删除某RS -C :清空集群服务配置 保存规则: ipvsadm-save ipvsadm -S 载入指定的规则: ipvsadm-restore ipvsadm -R 查看ipvs规则: -L [options] -n: 数字格式显示IP地址 -c: 显示连接数相关信息 --stats: 显示统计数据 --rate: 速率 --exact:显示统计数据的精确值 --timeout: 超时时间 -Z: 计数器清零;
lvs-nat的简单实现
实验拓扑如下图:
如图所示lvs-nat实现对后端2台real server(搭建apache httpd服务)进行负载均衡。
step1:
1、按照拓扑所示配置好IP地址 2、director需要准备两块网卡(一块公网网卡配置vip,一块内网网卡配置dip) 3、后端两台real server准备一块网卡(内网网卡)配置rip,注意网关需要指向dip
step2各节点网络设置如下:
以下是director上的配置: [root@localhost ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:37:63:02 brd ff:ff:ff:ff:ff:ff inet 192.168.2.146/24 brd 192.168.2.255 scope global dynamic eno16777736 valid_lft 4229sec preferred_lft 4229sec inet6 fe80::20c:29ff:fe37:6302/64 scope link valid_lft forever preferred_lft forever 3: eno33554984: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:37:63:0c brd ff:ff:ff:ff:ff:ff inet 192.168.253.153/24 brd 192.168.253.255 scope global eno33554984 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe37:630c/64 scope link valid_lft forever preferred_lft forever [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE="Ethernet" BOOTPROTO="static" IPADDR=192.168.2.146 NETMASK=255.255.255.0 DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_FAILURE_FATAL="no" NAME="eno16777736" UUID="ee2e45b1-4b9c-41cb-8507-de93e3827896" DEVICE="eno16777736" ONBOOT="yes" [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno33554984 TYPE="Ethernet" BOOTPROTO="static" IPADDR=192.168.253.153 NETMASK=255.255.255.0 DEFROUTE="yes" PEERDNS="yes" PEERROUTES="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_FAILURE_FATAL="no" NAME="eno33554984" DEVICE="eno33554984" ONBOOT="yes"
以下是rs1、和rs2的配置:
注意real server的网关要指向dip
step3在real server上进行如下操作:
以下是real server1上进行的操作: # yum install httpd -y &> /dev/null && echo success || echo failure #RS1安装httpd success #安装成功 #route add default gw 192.168.253.153 #设置默认网关为Director的DIP # echo "<h1>This is Real Server 1 </h1>" > /var/www/html/index.html #添加测试网页 #systemctl start httpd #启动httpd服务 以下是real server2上进行的操作: # yum install httpd -y &> /dev/null && echo success || echo failure #RS1安装httpd success #安装成功 #route add default gw 192.168.253.153 #设置默认网关为Director的DIP # echo "<h1>This is Real Server 2 </h1>" > /var/www/html/index.html #添加测试网页 #systemctl start httpd #启动httpd服务
step4在director上进行操作:
# yum install ipvsadm -y #安装ipvsadm [root@localhost ~]# curl 192.168.253.169 #测试rs是否可以服务 <h1>This is Real Server 1 </h1> [root@localhost ~]# curl 192.168.253.168 #测试rs是否可以服务 <h1>This is Real Server 2 </h1> [root@localhost ~]# vim /etc/sysctl.conf #编辑内核文件开启内核路由转发 # System default settings live in /usr/lib/sysctl.d/00-system.conf. # To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file # # For more information, see sysctl.conf(5) and sysctl.d(5). net.ipv4.ip_forward = 1 #添加该项设置 [root@localhost ~]# sysctl -p #对刚才的修改进行立即生效 net.ipv4.ip_forward = 1 #可见已经生效 [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward #查看是否开启路由转发功能 1 #开启 [root@localhost ~]# ipvsadm -A -t 192.168.2.146:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.2.146:80 -r 192.168.253.169 -m [root@localhost ~]# ipvsadm -a -t 192.168.2.146:80 -r 192.168.253.168 -m [root@localhost ~]# ipvsadm -Ln #查看规则 IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.2.146:80 rr -> 192.168.253.168:80 Masq 1 0 0 -> 192.168.253.169:80 Masq 1 0 0 [root@localhost ~]# curl http://192.168.2.146 <h1>This is Real Server 2 </h1> [root@localhost ~]# curl http://192.168.2.146 <h1>This is Real Server 1 </h1>
测试:
踩过的坑1
在实验过程中遇到了浏览器访问vip失败,但是director上curlvip却可以的情况后来排查发现real server开启了两块网卡(一块外网,一块内网,浏览器可以通过外网ip访问real server上的web服务),当我只启用了内网网卡时,浏览器成功访问vip。
因此当你实验失败时请从以下两点排查:
1、real server是否启用了多块网卡,如果是请禁用多余的 只启用内网网卡。并且把网关指向dip
2 关闭iptables和selinux(或者设置合适的规则)
lvs-dr实现
实验拓扑如下:
后端两台real server搭建httpd服务(默认已搭建完成并启动),各节点iptables和selinux均已关闭
step1在director上执行如下操作:
#ifconfig eno16777736:0 192.168.2.11/32 broadcast 192.168.2.11 up #route add -host 192.168.2.11 dev eno16777736:0
step2在real server1上执行如下操作:
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #echo 1 > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore # echo 2 > /proc/sys/net/ipv4/conf/eno16777736/arp_announce #添加如上内核参数,注意要在director节点添加ipvs规则前做此步操作 #ifconfig lo:0 192.168.2.11/32 broadcast 192.168.2.11 up #route add -host 192.168.2.11 dev lo:0 #echo "<h1>This is Real Server 1 </h1>" > /var/www/html/index.html
step3在real server2上执行如下操作:
#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #echo 1 > /proc/sys/net/ipv4/conf/eno16777736/arp_ignore # echo 2 > /proc/sys/net/ipv4/conf/eno16777736/arp_announce #添加如上内核参数,注意要在director节点添加ipvs规则前做此步操作 #ifconfig lo:0 192.168.2.11/32 broadcast 192.168.2.11 up #route add -host 192.168.2.11 dev lo:0 #echo "<h1>This is Real Server 2 </h1>" > /var/www/html/index.html
step4在director节点执行如下操作:
#ipvsadm -A -t 192.168.2.11:80 -s rr #ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.117 -g #ipvsadm -a -t 192.168.2.11:80 -r 192.168.2.135 -g
测试:
以上lvs-dr模型简单实现到此为止
总结
lvs特点是模型工作原理比较复杂,但是其服务配置却非常简单,lvs集群的配置难点主要集中在对模型的理解上,对网络的配置及排错上。
这仅仅只是lvs的简单实现后期会与其他集群服务配合进行更复杂的拓扑。
原创文章,作者:Net17_desperado,如若转载,请注明出处:http://www.178linux.com/65441