ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
[打印本页]
作者:
鼠扑
时间:
2023-7-29 23:02
标题:
Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR
系列文章
Cilium 系列文章
前言
将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能。但是通过对 Cilium 不同模式的切换/功能的启用,可以进一步提升 Cilium 的网络性能。具体调优项包括不限于:
启用本地路由 (Native Routing)
完全替换 KubeProxy
IP 地址伪装 (Masquerading) 切换为基于 eBPF 的模式
Kubernetes NodePort 实现在 DSR(Direct Server Return) 模式下运行
绕过 iptables 连接跟踪 (Bypass iptables Connection Tracking)
主机路由 (Host Routing) 切换为基于 BPF 的模式 (需要 Linux Kernel >= 5.10)
启用 IPv6 BIG TCP (需要 Linux Kernel >= 5.19)
禁用 Hubble(但是不建议,可观察性比一点点的性能提升更重要)
修改 MTU 为巨型帧 (jumbo frames) (需要网络条件允许)
启用带宽管理器 (Bandwidth Manager) (需要 Kernel >= 5.1)
启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
启用 XDP 加速 (需要 支持本地 XDP 驱动程序)
(高级用户可选)调整 eBPF Map Size
Linux Kernel 优化和升级
CONFIG_PREEMPT_NONE=y
其他:
tuned network-* profiles, 如:tuned-adm profile network-latency 或 network-throughput
CPU 调为性能模式
停止 irqbalance,将网卡中断引脚指向特定 CPU
在网络/网卡设备/OS 等条件满足的情况下,我们尽可能多地启用这些调优选项,相关优化项会在后续文章逐一更新。敬请期待。
今天我们来将 Cilium 的 NodePort 实现从 SNAT 改为 DSR 以提升网络性能。
测试环境
Cilium 1.13.4
K3s v1.26.6+k3s1
OS
3 台 Ubuntu 23.04 VM, Kernel 6.2, x86
Direct Server Return (DSR)
默认情况下,Cilium 的 eBPF NodePort 实现以
SNAT
模式运行。也就是说,当节点外部流量到达时,如果节点确定负载平衡器、NodePort 或具有外部 IP 的服务的后端位于远程节点,那么节点就会通过执行 SNAT 将请求重定向到代表自己的远程后端。这不需要额外更改 MTU。代价是,来自后端的回复需要
额外跳回节点
,在那里执行
反向 SNAT 转换
,然后再将数据包直接返回给外部客户端。
示例如下,Cilium 的 eBPF NodePort 实现以
SNAT
模式运行:
$ kubectl -n kube-system exec ds/cilium -- cilium status --verbose
...
KubeProxyReplacement Details:
Status: Strict
Socket LB: Enabled
Socket LB Tracing: Enabled
Socket LB Coverage: Full
Devices: eth0 192.168.2.3 (Direct Routing)
Mode: SNAT
复制代码
SNAT 模式下,NodePort 后端 pod 在其他节点入向流量:
出向流量:
该设置可通过 loadBalancer.mode Helm 选项更改为 dsr,以便让 Cilium 的 eBPF NodePort 实现在 DSR 模式下运行。在这种模式下,后端直接回复外部客户端,而不需要额外的跳转,也就是说,
后端通过使用服务 IP/port 作为源来回复
。DSR 目前要求 Cilium 以
本地路由模式
部署,也就是说,它不能在任何一种隧道模式下工作。
DSR 模式流量如下:
DSR 模式的另一个优点是
保留了客户端的源 IP
,因此可以在后端节点对其进行策略匹配。而在 SNAT 模式下则无法做到这一点。鉴于一个特定的后端可被多个服务使用,后端需要知道它们需要回复的服务 IP/端口。
请注意,由于 Cilium 特定的 IP 选项可能会被底层网络结构丢弃,因此
DSR 模式在某些公共云提供商环境中可能无法使用
。如果后端位于与处理给定 NodePort 请求的节点相距较远的节点上,在出现服务连接问题时,首先要检查 NodePort 请求是否实际到达了包含后端的节点。如果不是,则建议切换回默认 SNAT 模式作为一种解决方法。
此外,在某些实施源/目标 IP 地址检查的公共云提供商环境中(如 AWS),必须禁用检查才能使用 DSR 模式。
启用 DSR 实施步骤
在启用仅 DSR 模式的无 kube proxy 环境中,上述 Helm 示例配置如下:
helm upgrade cilium cilium/cilium --version 1.13.4 \
--namespace kube-system \
--reuse-values \
--set loadBalancer.mode=dsr
复制代码
<blockquote>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4