赞
踩
本文分享自华为云社区《【理解云容器网络】2-基础篇-ipvs介绍》,作者: 可以交个朋友。
ipvs是工作在Linux内核态的4层负载均衡;和用户态的负载均衡软件(如nginx、haproxy)功能类似:作为客户端访问的统一入口并将访问请求根据调度算法转给后端真实的服务器。相比于用户态负载均衡,ipvs为Linux内核子模块性能更强,但ipvs仅工作在4层无法处理7层数据(比如SSL证书、修改HTTP请求头)。
IPVS是如何决策应该把请求调度到哪个后端RS(Real Server)上的呢?这是由负载均衡调度算法决定的。IPVS常用的调度算法有:
根据调度算法选择一个合适的后端RS节点,IPVS怎么将数据转发给后端RS呢?
IPVS支持三种转发模式:
三种转发模式性能从高到低:DR > NAT > IP隧道
DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以DR模式的转发效率是最高的。
DR模式的特点:
NAT模式下请求包和响应包都需要经过LB处理。当客户端的请求到达LB后,LB会对请求包做目的地址转换(DNAT),将请求包的目的IP改写为RS的IP。RS处理请求后将响应返回给LB,当LB收到RS的响应后,LB会对响应包做源地址转换(SNAT),将响应包的源IP改写为LB的VIP。
NAT模式的特点:
隧道模式下LB将原始请求报文封装在另一个IP报文中,再将封装好的IP报文转发给后端RS;后端RS服务器收到报文后,先将报文解封获得原报文中目标地址为VIP的报文,服务器发现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。
隧道模式的特点:
IPVS为内核子模块,需要用ipvsadm命令添加虚拟服务规则;IPVS与ipvsadm的关系就和netfilter与iptables一样。
ipvsadm命令参数展示
- Commands:
-
- --add-service -A 增加一个虚拟服务
-
- --edit-service -E 修改一个虚拟服务
-
- --delete-service -D 删除一个虚拟服务
-
- --clear -C 清理所有虚拟服务
-
- --restore -R 从标准输入获取ipvsadm命令。一般结合下边的-S使用。
-
- --save -S 从标准输出输出虚拟服务器的规则。可以将虚拟服务器的规则保存,在以后通过-R直接读入,以实现自动化配置。
-
- --add-server -a 为虚拟服务添加一个real server(RS)
-
- --edit-server -e 修改虚拟服务中的RS
-
- --delete-server -d 删除虚拟服务中的RS
-
- --list -L|-l 列出虚拟服务表中的所有虚拟服务。可以指定地址。添加-c显示连接表。
-
- --help -h 显示帮助信息
-
- Options:
-
- --tcp-service -t service-address 指定虚拟服务为tcp服务。service-address要是host[:port]的形式。
-
- --udp-service -u service-address 指定虚拟服务为udp服务。service-address要是host[:port]的形式。
-
- --scheduler -s scheduler 指定调度算法。调度算法可以指定以下10种:rr(轮询),wrr(权重),lc(最后连接),wlc(权重),lblc(本地最后连接),lblcr(带复制的本地最后连接),dh(目的地址哈希),sh(源地址哈希),sed(最小期望延迟),nq(永不排队)。默认调度算法为wlc。
-
- --real-server -r server-address 为虚拟服务指定数据可以转发到的真实服务器的地址。可以添加端口号。如果没有指定端口号,则等效于使用虚拟地址的端口号。
-
- --gatewaying -g 指定转发模式为DR(direct routing) (default)
-
- --ipip -i 指定转发模式为ip隧道(tunneling)
-
- --masquerading -m 指定转发模式为NAT模式(NAT)
-
- --connection -c 列出当前的IPVS连接。
1.环境准备;VM1/VM2/VM3都是在client上的VMware虚拟机。VMware网络模式为NAT。
设备名称 | 设备ip |
---|---|
client | 7.249.241.35 |
VM1(LB) | ip:192.168.81.128 vip: 192.168.81.100 |
VM2(RS1) | 192.168.81.129 |
VM3(RS2) | 192.168.81.130 |
2.确保LB节点上开启contrack和forward功能
- echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
-
- echo "net.ipv4.vs.conntrack=1" >> /etc/sysctl.conf
-
- sysctl -p
3.在虚拟机VM1(LB)上安装ipvsadm命令
yum install ipvsadm
4.在虚拟机VM1(LB)上为网卡添加一个VIP
- [root@vm1 ~]# ip addr add 192.168.81.100/24 dev eth0
-
- [root@vm1 ~]# ip a s eth0
-
- 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
-
- link/ether fa:16:3e:68:5a:12 brd ff:ff:ff:ff:ff:ff
-
- inet 192.168.81.128/24 brd 172.16.2.255 scope global noprefixroute dynamic eth0
-
- valid_lft 102241123sec preferred_lft 102241123sec
-
- inet 192.168.81.100/24 scope global secondary eth0
-
- valid_lft forever preferred_lft forever
-
- inet6 fe80::f816:3eff:fe68:5a12/64 scope link
-
- valid_lft forever preferred_lft forever
5.在虚拟机VM1(LB)上添加ipvs虚拟配置,并指定调度算法为轮询
ipvsadm -At 192.168.81.100:80 -s rr
6.在虚拟机VM1(LB)上添加RS节点
- ipvsadm -at 192.168.81.100:80 -r 192.168.81.129:80 -m
-
- ipvsadm -at 192.168.81.100:80 -r 192.168.81.130:80 -m
7.在虚拟机VM1(LB)上查看虚拟配置
- [root@test ~]# 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.81.100:80 rr
-
- -> 192.168.81.129:80 Masq 1 0 0
-
- -> 192.168.81.130:80 Masq 1 0 0
8.为了使client能访问vip,确保client机器上有访问vip的路由,192.168.81.1为VMware的虚拟网卡VMnet8的ip
9.由于本次环境的LB/RS都是通过VMware虚拟出来的,虚拟机和client互通,为了使RS节点将响应报文返回给LB,需要在两个RS节点上添加路由,使响应报文经过LB从而把响应报文的源地址换回vip
- #目的地址为什么不是客户端ip?因为VMware用的nat模式,client的请求到达LB时,VMware会把数据包源ip改为VMnet8网卡的地址`192.168.81.1`,也就是会做SNAT
-
- ip route add 192.168.81.1 via 192.168.81.128 dev eth0
10.访问测试,LB将请求轮询转发给后端RS节点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。