掌握云容器网络:何为 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 命令参数展示
环境准备;VM1/VM2/VM3 都是在 client 上的 VMware 虚拟机。VMware 网络模式为 NAT。
确保 LB 节点上开启 contrack 和 forward 功能
在虚拟机 VM1(LB)上安装 ipvsadm 命令
在虚拟机 VM1(LB)上为网卡添加一个 VIP
在虚拟机 VM1(LB)上添加 ipvs 虚拟配置,并指定调度算法为轮询
在虚拟机 VM1(LB)上添加 RS 节点
在虚拟机 VM1(LB)上查看虚拟配置
为了使 client 能访问 vip,确保 client 机器上有访问 vip 的路由,192.168.81.1
为 VMware 的虚拟网卡 VMnet8 的 ip
由于本次环境的 LB/RS 都是通过 VMware 虚拟出来的,虚拟机和 client 互通,为了使 RS 节点将响应报文返回给 LB,需要在两个 RS 节点上添加路由,使响应报文经过 LB 从而把响应报文的源地址换回 vip
访问测试,LB 将请求轮询转发给后端 RS 节点
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/da964240157bbbdea0824b8e5】。文章转载请联系作者。
评论