Cilium DSR (Dircet Server Return)

Posted whale_life

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cilium DSR (Dircet Server Return)相关的知识,希望对你有一定的参考价值。

背景:

​cilium-dsr​

​cilium-dsr-blog​

Cilium DSR 是一种 南北方向流量的模式,因为如 Cilium Host-Reachable 后边南北流量抓包所发现,其实默认情况下 Cilium NodePort 也是在 SNAT 模式下运行。
也就是说,当外部流量到达时,节点确定后端是在一个远程节点,那么节点就代表他通过执行 SNAT 将请求重定向到远程后端。这种方式不需要额外的封装报文,也就是不会有 MTU 变化,但是代价就是后端的回复需要额外跳回该节点,以便将数据包直接外回给外部客户之前,执行反向 SNAT 转换。
Cilium而在 DSR 模式下,后端直接回复到外部客户端,不需要额外的跳转,也就是说,后端通过使用服务 IP或者端口 直接回复。
DSR模式的另一个优势是,客户端的源IP被保留下来,因此策略可以在后端节点上进行匹配。在SNAT模式下是不可能的。鉴于一个特定的后端可以被多个服务使用,后端需要知道他们需要回复的服务IP/端口。因此,Cilium在Cilium特定的IPv4选项或IPv6目的地选项扩展头中编码这一信息,代价是公布一个较低的MTU。对于TCP服务,Cilium只对SYN包的服务IP/端口进行编码,而不对后续包进行编码

DSR 模式不可以在 VXLAN 模式下运行,只可以在 native-routing 模式下运行,因为是 UDP 没有 SYN
握手建立过程。
Cilium

部署

添加如下所示选项

bpf-lb-mode: "dsr"

抓包演示:

针对外部主机 192.168.0.50 ens33 网卡抓包
针对集群 master 192.168.0.110 ens33 网卡抓包
针对提供服务的 pod 所在 node 192.168.0.130 ens33 网卡抓包
Cilium

服务环境

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

CiliumCilium

110.cap

我们发现 状态响应报文并没有经过 192.168.0.110

tcpdump -pne -i ens33 -w 110.cap

Cilium

130.cap

tcpdump -pne -i ens33 -w node.cap

Cilium

以上是关于Cilium DSR (Dircet Server Return)的主要内容,如果未能解决你的问题,请参考以下文章

Cilium Vxlan 跨节点通信过程

关于centos8+kubeadm1.20.5+cilium+hubble的安装过程中cilium的配置问题--特别强调

Cilium 多集群 ClusterMesh 介绍

[译] Cilium:BPF 和 XDP 参考指南(2021)

k8s calico flannel cilium 网络性能测试

使用 Cilium 增强 Kubernetes 网络安全