前言
Kubernetes 提供了基于 IPVS 的服务代理。相比于 iptables 代理模式,IPVS 代理模式具有低延迟、高性能的优势。本文主要介绍 IPVS 相关概念。如果想了解 iptables 模式,可以参考另一篇文章:netfiler/iptables 介绍。
Linux 虚拟服务器
要了解 IPVS,不得不谈到 Linux 虚拟服务器项目(Linux Virtual Server, LVS)。Linux 虚拟服务器技术是为了解决服务器承受的日益增长的访问压力,它通过部署虚拟服务器,使真实服务器集群使用同一个地址对外暴露服务,并在集群内实现负载均衡。真实服务器之间可以通过高速局域网或地理分隔的广域网相互连接,负载均衡器将请求分发到不同的真实服务器。因此,可以通过添加新服务器,提高系统可扩展性。
实现原理
LVS 实现负载均衡的方式有三种可以配置:Nat,IP Tunneling 和 Direct Routing(直接路由)。
NAT 实现
集群可以使用私有网络地址,使用负载均衡器的公网 IP 暴露服务。NAT 实现的缺点是负载均衡器需要修改请求、响应数据包,容易成为性能瓶颈。
IP 隧道实现
IP 隧道技术是将原始 IP 数据报封装在另一个 IP 数据报中进行传输,原数据报作为新数据报的载荷,隧道包目的地址就是转交地址。所以,IP 隧道实现对网络没有要求,既可以是 LAN,也可以是 WAN。服务器在接受请求后,可以直接向客户端返回响应。
直接路由实现
直接路由作用和 IP 隧道类似,负载均衡器负责分发请求,服务器收到请求后可以直接向客户端返回响应。但直接路由只支持局域网,集群服务器必须和负载均衡器物理相连。负载均衡器通过修改数据帧的目的 MAC 地址实现负载均衡。
IPVS
IPVS(IP Virtual Server)是一个软件,是内置在 Linux 内核中的传输层负载均衡器,实现了四层负载均衡(Layer-4 Load Balancing)。四层负载均衡的意思是负载均衡策略是基于传输层的信息。IPVS 的管理程序是 ipvsadm,可以通过man ipvsadm
查看使用手册。ipvsadm 支持直接路由(-g)、IP 隧道(-i)、NAT(-m)三种转发模式:
$ man ipvsadm
-g, --gatewaying Use gatewaying (direct routing). This is the default.
-i, --ipip Use ipip encapsulation (tunneling).
-m, --masquerading Use masquerading (network access translation, or NAT).
延伸阅读
[1] The Linux Virtual Server project
[2] Wiki - Load Balancing
[3] Software - IPVS
[4] ipvsadm:Linux 的负载均衡功能 ipvs 的使用,ipvsadm的常用操作命令