背景
物理机上部署的 k8s
没有负载均衡器, 其 nginx-ingress
部署 master
节点上, 并且在 hostnetwork
上监听 80
和 443
端口, 如果 k8s
前面没有 lvs
等负载, 那么请求只会到其中一台 nginx-ingress
上, nginx-ingress
相当于是主备模式, 单个 nginx-ingress
会成为性能瓶颈, 所以需要在 k8s
前面部署 lvs
, 并且使用 DR
模式, 如图
术语
CIP
: 客户的 ip
DIP
: lvs
上用于与后端服务器进行数据交互的 ip
, lvs
修改完 MAC
地址后, 将包从该 ip
发到 lan
上
RIP
: 后端服务器的 ip
, 需要跟 DIP
在同一网段
VIP
: 对外提供服务, 由 keepalived
生成的虚 ip
, 一般是外网
lvs
: lvs
服务器, 部署了 lvs
服务, 用于负载流量到后端真实服务器
RealServer
: 后端真实服务器
DR
模式优缺点
优点
- 由于请求经过
lvs
到RealServer
, 但是相应直接从RealServer
到客户端, 不再走lvs
, 所以性能和效率都很高
缺点
- 不支持端口映射, 也就是
RealServer
和vip
提供的端口必须一致, 因为DR
模式,lvs
只修改包的MAC
地址, 不涉及三层的修改 RealServer
与LVS
不能在同一台机器上, 详见: http://linbo.github.io/2017/08/20/lvs-dr
备注
- 可以直接使用
ipvsadm
来创建lvs
规则,但没有vip
保证ip
高可用,而keepalived
本身就是lvs
实现的,所以可以直接通过keepalived
来实现lvs
规则,并且有vip
NAT
模式lvs
需要开启路由转发(echo "1" > /proc/sys/net/ipv4/ip_forward
),DR
模式不需要DR
模式的每台lvs
服务器以及RealServer
服务器的lo
口上都绑定有vip
, 而这么多服务器有同一个外网vip
, 如何保证客户端访问到lvs
的vip
, 就需要RealServer
设置ARP
抑制- 如果
lvs
只有一个外网口,DIP
和RIP
需要在同一网段,也就是DIP
,VIP
,RIP
要在同一网段,也就是都要使用外网ip
,如果有两台lvs
,两台RealServer
,那么总共需要5
个外网ip
,同时因为RealServer
有公网ip
,那么RealServer
其实可以直接对外提供服务,但将RealServer
暴露在外网不太安全 - 上面的方式太消耗外网
ip
,并且不安全,所以实际使用中可以只使用一个外网ip
实现DR
模式,也就是VIP
与 (DIP
和RIP
) 使用不同网段,其中VIP
使用外网段,DIP
和RIP
使用内网段,其中lvs
要有两个网口,其中一个网口用于绑定vip
,另一个网口用于绑定内外ip
,与RealServer
的内网ip
相通,并且设置RealServer
的默认路由为自己的内网路由器网关,不能是DIP
,详见:(如果RealServer
默认网关想使用DIP
,需要打补丁,太麻烦) vip
要配置在RealServer
的lo
口, 并且子网掩码必须是32
位, 如果不是32
位, 例如24
位,lo
会相应整个24
段的所有ip
的请求
部署
最终环境
操作系统均为 ubuntu18.04
角色 | 内网ip | 外网ip | vip |
---|