Cilium DSR (Dircet Server Return)
Posted whale_life
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cilium DSR (Dircet Server Return)相关的知识,希望对你有一定的参考价值。
背景:
Cilium DSR 是一种 南北方向流量的模式,因为如 Cilium Host-Reachable 后边南北流量抓包所发现,其实默认情况下 Cilium NodePort 也是在 SNAT 模式下运行。
也就是说,当外部流量到达时,节点确定后端是在一个远程节点,那么节点就代表他通过执行 SNAT 将请求重定向到远程后端。这种方式不需要额外的封装报文,也就是不会有 MTU 变化,但是代价就是后端的回复需要额外跳回该节点,以便将数据包直接外回给外部客户之前,执行反向 SNAT 转换。
而在 DSR 模式下,后端直接回复到外部客户端,不需要额外的跳转,也就是说,后端通过使用服务 IP或者端口 直接回复。
DSR模式的另一个优势是,客户端的源IP被保留下来,因此策略可以在后端节点上进行匹配。在SNAT模式下是不可能的。鉴于一个特定的后端可以被多个服务使用,后端需要知道他们需要回复的服务IP/端口。因此,Cilium在Cilium特定的IPv4选项或IPv6目的地选项扩展头中编码这一信息,代价是公布一个较低的MTU。对于TCP服务,Cilium只对SYN包的服务IP/端口进行编码,而不对后续包进行编码。
DSR 模式不可以在 VXLAN 模式下运行,只可以在 native-routing 模式下运行,因为是 UDP 没有 SYN
握手建立过程。
部署
添加如下所示选项
bpf-lb-mode"dsr"
抓包演示:
针对外部主机 192.168.0.50 ens33 网卡抓包
针对集群 master 192.168.0.110 ens33 网卡抓包
针对提供服务的 pod 所在 node 192.168.0.130 ens33 网卡抓包
服务环境
root@master:<sub># kubectl get pod
NAME READY STATUS RESTARTS AGE
cni-test-777bbd57c8-vrzjz 1/1 Running 0 4m17s
root@master:</sub># kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cni-test NodePort 10.100.24.132 <none> 80:30670/TCP 2m37s
50 访问 110 NodePort
curl http://192.168.0.110:30670
50.cap
tcpdump -pne -i ens33 -w 50.cap
110.cap
我们发现 状态响应报文并没有经过 192.168.0.110
tcpdump -pne -i ens33 -w 110.cap
130.cap
tcpdump -pne -i ens33 -w node.cap
以上是关于Cilium DSR (Dircet Server Return)的主要内容,如果未能解决你的问题,请参考以下文章
关于centos8+kubeadm1.20.5+cilium+hubble的安装过程中cilium的配置问题--特别强调
[译] Cilium:BPF 和 XDP 参考指南(2021)