写点什么

掌握云容器网络:何为 ipvs

  • 2024-02-22
    广东
  • 本文字数:3981 字

    阅读完需:约 13 分钟

掌握云容器网络:何为ipvs

本文分享自华为云社区《【理解云容器网络】2-基础篇-ipvs介绍》,作者: 可以交个朋友。

IPVS 简介


ipvs 是工作在 Linux 内核态的 4 层负载均衡;和用户态的负载均衡软件(如 nginx、haproxy)功能类似:作为客户端访问的统一入口并将访问请求根据调度算法转给后端真实的服务器。相比于用户态负载均衡,ipvs 为 Linux 内核子模块性能更强,但 ipvs 仅工作在 4 层无法处理 7 层数据(比如 SSL 证书、修改 HTTP 请求头)。

IPVS 调度算法


IPVS 是如何决策应该把请求调度到哪个后端 RS(Real Server)上的呢?这是由负载均衡调度算法决定的。IPVS 常用的调度算法有:


  • 轮询(Round Robin):IPVS 认为集群内每台 RS 都是相同的,会轮流进行调度分发。从数据统计上看,RR 模式是调度最均衡的。

  • 加权轮询(Weighted Round Robin):IPVS 会根据 RS 上配置的权重,将消息按权重比分发到不同的 RS 上。可以给性能更好的 RS 节点配置更高的权重,提升集群整体的性能。

  • 最小连接数(Least Connections):IPVS 会根据集群内每台 RS 的连接数统计情况,将消息调度到连接数最少的 RS 节点上。在长连接业务场景下,LC 算法对于系统整体负载均衡的情况较好;但是在短连接业务场景下,由于连接会迅速释放,可能会导致消息每次都调度到同一个 RS 节点,造成严重的负载不均衡。

  • 加权最小连接数(Weighted Least Connections):最小连接数算法的加权版~

  • 地址哈希(Address Hash):LB 上会保存一张哈希表,通过哈希映射将客户端和 RS 节点关联起来。

IPVS 转发模式


根据调度算法选择一个合适的后端 RS 节点,IPVS 怎么将数据转发给后端 RS 呢?IPVS 支持三种转发模式:


  • DR 模式(Direct Routing)

  • NAT 模式(Network Address Translation)

  • IP 隧道(IP tunneling)


三种转发模式性能从高到低:DR > NAT > IP 隧道

DR 模式


DR 模式下,客户端的请求包到达负载均衡器的虚拟服务 IP 端口后,负载均衡器不会改写请求包的 IP 和端口,但是会改写请求包的 MAC 地址为后端 RS 的 MAC 地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。所以 DR 模式的转发效率是最高的。



DR 模式的特点:


  • 数据包在 LB 转发过程中,源/目的 IP 端口都不会变化。LB 只是将数据包的 MAC 地址改写为 RS 的 MAC 地址,然后转发给相应的 RS。所以 LB 必须和后端 RS 节点在同一个子网

  • 每台 RS 上都必须在环回网卡(lo)上绑定 VIP。因为 LB 转发时并不会改写数据包的目的 IP,所以 RS 收到的数据包的目的 IP 仍是 VIP,为了保证 RS 能够正确处理该数据包,而不是丢弃,必须在 RS 的环回网卡上绑定 VIP。这样 RS 会认为这个虚拟服务 IP 是自己的 IP,自己是能够处理这个数据包的,否则 RS 会直接丢弃该数据包。

  • RS 上的业务进程必须监听在环回网卡的 VIP 上,且端口必须和 LB 上的虚拟服务端口一致。因为 LB 不会改写数据包的目的端口,所以 RS 服务的监听端口必须和 LB 上虚拟服务端口一致,否则 RS 会直接拒绝该数据包。

  • RS 处理完请求后,响应直接回给客户端,不再经过 LB。因为 RS 收到的请求数据包的源 IP 是客户端的 IP,所以理所当然 RS 的响应会直接回给客户端,而不会再经过 LB。这时候要求 RS 和客户端之间的网络是可达的。

NAT 模式


NAT 模式下请求包和响应包都需要经过 LB 处理。当客户端的请求到达 LB 后,LB 会对请求包做目的地址转换(DNAT),将请求包的目的 IP 改写为 RS 的 IP。RS 处理请求后将响应返回给 LB,当 LB 收到 RS 的响应后,LB 会对响应包做源地址转换(SNAT),将响应包的源 IP 改写为 LB 的 VIP。



NAT 模式的特点:


  • LB 会修改数据包的地址。对于请求包,会进行 DNAT;对于响应包,会进行 SNAT。

  • LB 会透传客户端 IP 到 RS(DR 模式也会透传)。虽然 LB 在转发过程中做了 NAT 转换,但是因为只是做了部分地址转发,所以 RS 收到的请求包里是能看到客户端 IP 的。

  • 需要将 RS 的默认网关地址配置为 LB 的浮动 IP 地址。因为 RS 收到的请求包源 IP 是客户端的 IP,为了保证响应包在返回时能走到 LB 上面,所以需要将 RS 的默认网关地址配置为 LB 的虚拟服务 IP 地址。当然,如果客户端的 IP 是固定的,也可以在 RS 上添加明细路由指向 LB 的虚拟服务 IP,不用改默认网关。

  • LB 和 RS 须位于同一个子网,并且客户端不能和 LB/RS 位于同一子网。因为需要将 RS 的默认网关配置为 LB 的虚拟服务 IP 地址,所以需要保证 LB 和 RS 位于同一子网。又因为需要保证 RS 的响应包能走回到 LB 上,则客户端不能和 RS 位于同一子网。否则 RS 直接就能获取到客户端的 MAC,响应包就直接回给客户端了,也就走不到 LB 上面了。这时候由于没有 LB 做 SNAT,客户端收到的响应包源 IP 是 RS 的 IP,而客户端的请求包目的 IP 是 LB 的虚拟服务 IP,这时候客户端无法识别响应包,会直接丢弃。

IP 隧道模式


隧道模式下 LB 将原始请求报文封装在另一个 IP 报文中,再将封装好的 IP 报文转发给后端 RS;后端 RS 服务器收到报文后,先将报文解封获得原报文中目标地址为 VIP 的报文,服务器发现 VIP 地址被配置在本地的 IP 隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。



隧道模式的特点:


  • LB 和 RS 节点不用处于同一子网;解除了 NAT 模式和 DR 模式的限制。

  • LB 和 RS 节点必须都支持隧道技术,且 RS 节点也需要在 TUN 网卡上配置 VIP 地址;因为 LB 通过隧道发送报文,RS 节点必须支持隧道才能解封装,解封装后拿到原始报文的目的地址为 VIP,如果 RS 节点上没有配置 VIP,则会丢弃报文。

  • RS 节点必须能访问互联网;因为 RS 节点是直接将响应报文返回给客户端,所以必须能访问外网。

命令演示


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连接。
复制代码


环境准备;VM1/VM2/VM3 都是在 client 上的 VMware 虚拟机。VMware 网络模式为 NAT。



确保 LB 节点上开启 contrack 和 forward 功能


echo "net.ipv4.ip_forward=1" >> /etc/sysctl.confecho "net.ipv4.vs.conntrack=1" >> /etc/sysctl.confsysctl -p
复制代码


在虚拟机 VM1(LB)上安装 ipvsadm 命令


yum install ipvsadm
复制代码


在虚拟机 VM1(LB)上为网卡添加一个 VIP


[root@vm1 ~]# ip addr add 192.168.81.100/24 dev eth0[root@vm1 ~]# ip a s eth02: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether fa:16:3e:68:5a:12 brd ff:ff:ff:ff:ff:ffinet 192.168.81.128/24 brd 172.16.2.255 scope global noprefixroute dynamic eth0   valid_lft 102241123sec preferred_lft 102241123secinet 192.168.81.100/24 scope global secondary eth0   valid_lft forever preferred_lft foreverinet6 fe80::f816:3eff:fe68:5a12/64 scope link    valid_lft forever preferred_lft forever
复制代码


在虚拟机 VM1(LB)上添加 ipvs 虚拟配置,并指定调度算法为轮询


ipvsadm -At 192.168.81.100:80 -s rr
复制代码


在虚拟机 VM1(LB)上添加 RS 节点


ipvsadm -at 192.168.81.100:80 -r 192.168.81.129:80 -mipvsadm -at 192.168.81.100:80 -r 192.168.81.130:80 -m
复制代码


在虚拟机 VM1(LB)上查看虚拟配置


[root@test ~]# ipvsadm -lnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  192.168.81.100:80 rr  -> 192.168.81.129:80              Masq    1      0          0           -> 192.168.81.130:80              Masq    1      0          0  
复制代码


为了使 client 能访问 vip,确保 client 机器上有访问 vip 的路由,192.168.81.1为 VMware 的虚拟网卡 VMnet8 的 ip



由于本次环境的 LB/RS 都是通过 VMware 虚拟出来的,虚拟机和 client 互通,为了使 RS 节点将响应报文返回给 LB,需要在两个 RS 节点上添加路由,使响应报文经过 LB 从而把响应报文的源地址换回 vip


#目的地址为什么不是客户端ip?因为VMware用的nat模式,client的请求到达LB时,VMware会把数据包源ip改为VMnet8网卡的地址`192.168.81.1`,也就是会做SNATip route add 192.168.81.1 via 192.168.81.128 dev eth0
复制代码


访问测试,LB 将请求轮询转发给后端 RS 节点



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 6
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
掌握云容器网络:何为ipvs_开发_华为云开发者联盟_InfoQ写作社区