Cilium 系列 -9- 主机路由切换为基于 BPF 的模式

简介: Cilium 系列 -9- 主机路由切换为基于 BPF 的模式

前言

将 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-latencynetwork-throughput
  • CPU 调为性能模式
  • 停止 irqbalance,将网卡中断引脚指向特定 CPU

在网络 / 网卡设备 /OS 等条件满足的情况下, 我们尽可能多地启用这些调优选项, 相关优化项会在后续文章逐一更新. 敬请期待.

今天我们来调优 Cilium, 启用 Host-Routing(主机路由) 以完全绕过 iptables 和上层主机堆栈,并实现比常规 veth 设备操作更快的网络命名空间切换。

测试环境

  • Cilium 1.13.4
  • K3s v1.26.6+k3s1
  • OS
  • 3 台 Ubuntu 23.04 VM, Kernel 6.2, x86
  • 3 台 Debian 10 开发板, Kernel 4.19, arm64

eBPF Host-Routing

即使 Cilium 使用 eBPF 执行网络路由,默认情况下,网络数据包仍会穿越节点常规网络堆栈的某些部分。这就导致了所有数据包仍能通过所有 iptables 钩子。不过,这些钩子会增加大量开销。有关测试环境的确切数据,请参阅 TCP 吞吐量 (TCP_STREAM),并比较 "Cilium " 和 "Cilium(传统主机路由)" 的结果。

具体如下:

Single-Stream:

TCP Throuthput(Single-Stream)

TCP Throuthput(Single-Stream) - CPU

Multi-Stream:

TCP Throughput(32 Streams)

TCP Throughput(32 Streams) - CPU

在 Cilium 1.9 中引入了基于 eBPF 的主机路由,以 完全绕过 iptables 和上层主机堆栈 ,并实现比常规 veth 设备操作更快的网络命名空间切换。 如果内核支持该选项,它将自动启用。要验证您的安装是否使用了 eBPF 主机路由,请在任何 Cilium pod 中运行 cilium status,并查找报告 "Host Routing(主机路由)" 状态的行,其中应显示 “BPF”。

如下, 在 Cilium 1.9 中引入了基于 eBPF 的主机路由后的性能提升:

Pod to Pod Performance, Kernel 5.10, Cilium 1.9

从初始结果可以看出,当在 v5.10 内核上使用 Cilium 1.9(及更新版本) 的 eBPF 扩展时,直接路由下 Pod 到远程 Pod 会话的单流 TCP 吞吐量会翻倍,而不是由主机堆栈转发处理两个方向。同样,在避开主机堆栈时,测试中的 Pod 的 TCP 请求 / 响应事务性能提高了近 3 倍。

要求

  • Kernel >= 5.10
  • 直接路由 (Direct-routing) 配置或隧道
  • 基于 eBPF 的 kube-proxy 替换
  • 基于 eBPF 的伪装(masquerading)

实施

如上所述, “如果内核支持该选项,它将自动启用”.

我们查看 Kernel >= 5.10 的情况:

Kernel >= 5.10

$ kubectl -n kube-system exec ds/cilium -- cilium status |grep "Host Routing"
Host Routing:            BPF
BASH

如上所示, 在 Kernel >= 5.10 的环境: “3 台 Ubuntu 23.04 VM, Kernel 6.2, x86” 中, 已经自动启用 Host-Routing 基于 BPF 的功能

📝Notes

根据 上一篇文章 - 绕过 IPTables 连接跟踪: 在无法使用 eBPF 主机路由 (Host-Routing) 的情况下,网络数据包仍需在主机命名空间中穿越常规网络堆栈,iptables 会增加大量成本。

所以, 在 "3 台 Ubuntu 23.04 VM, Kernel 6.2, x86" 中, 其实是没必要设置 " 绕过 IPTables 连接跟踪 " 的.

Kernel < 5.10

$ kubectl -n kube-system exec ds/cilium -- cilium status |grep "Host Routing"
Host Routing:            Legacy
BASH

如上所示, 在 Kernel < 5.10 的环境: “3 台 Debian 10 开发板, Kernel 4.19, arm64” 中, Host-Routing 功能为 Legacy.

📝Notes

根据 上一篇文章 - 绕过 IPTables 连接跟踪: 在无法使用 eBPF 主机路由 (Host-Routing) 的情况下,网络数据包仍需在主机命名空间中穿越常规网络堆栈,iptables 会增加大量成本。通过禁用所有 Pod 流量的连接跟踪 (connection tracking) 要求,从而绕过 iptables 连接跟踪器(iptables connection tracker),可将这种遍历成本降至最低。

所以, 在 "3 台 Debian 10 开发板, Kernel 4.19, arm64" 中, 是有必要设置 " 绕过 IPTables 连接跟踪 " 的.

总结

本文调优 Cilium, 启用 Host Routing(主机路由) 以完全绕过 iptables 和上层主机堆栈,并实现比常规 veth 设备操作更快的网络命名空间切换。

但是前提条件是 Kernel >= 5.10. (在没有条件启用 Host-Routing 的环境中, 可以设置 " 绕过 iptables 连接跟踪 " 以提升性能.)

至此,性能调优已完成:

  • ✔️ 启用本地路由 (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)
  • 修改 MTU 为巨型帧 (jumbo frames) (需要网络条件允许)
  • 启用带宽管理器 (Bandwidth Manager) (需要 Kernel >= 5.1)
  • 启用 Pod 的 BBR 拥塞控制 (需要 Kernel >= 5.18)
  • 启用 XDP 加速 (需要 支持本地 XDP 驱动程序)

📚️参考文档


相关文章
|
5月前
|
测试技术 Linux 虚拟化
HCL中虚拟设备的转发性能怎么样?今天我们来测一下
HCL中虚拟设备的转发性能怎么样?今天我们来测一下
|
3月前
|
Kubernetes 网络协议 Linux
Cilium 系列 -6- 从地址伪装从 IPtables 切换为 eBPF
Cilium 系列 -6- 从地址伪装从 IPtables 切换为 eBPF
|
9月前
VirtualBox之全局网络`NAT`失效
VirtualBox之全局网络`NAT`失效
100 0
|
负载均衡 监控 网络协议
边界网关协议 - 段路由的链路状态 (BGP-LS) 扩展
段路由 (Segment Routing,SR) 允许通过将路径编码为称为“段”的拓扑子路径序列来灵活定义端到端路径。这些段由路由协议通告,例如 IGP 拓扑中的链路状态路由协议(IS-IS、OSPFv2 和 OSPFv3)。
1360 0
边界网关协议 - 段路由的链路状态 (BGP-LS) 扩展
|
Kubernetes 开发者 iOS开发
K8S 集群部署_主机准备_配置主机网桥过滤功能 | 学习笔记
快速学习 K8S 集群部署_主机准备_配置主机网桥过滤功能
351 0
K8S 集群部署_主机准备_配置主机网桥过滤功能 | 学习笔记
|
网络协议 Linux
Linux网络管理之ip命令 – 显示与操作路由
ip命令用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道,是Linux下较新的功能强大的网络配置工具。
184 0
Linux网络管理之ip命令 – 显示与操作路由
|
缓存 网络协议 Linux
Linux网络管理之route命令 – 显示并设置路由
route命令用来显示并设置linux内核中的网络路由表,route命令设置的路由主要是静态路由。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现。
482 0
Linux网络管理之route命令 – 显示并设置路由
|
Kubernetes 网络协议 机器人
K8S 之 Flannel 的 vxlan 网络模式初步源码解析
详细解析过 Flannel 的 vxlan 模式的网络通信原理,本篇将继续深入结合源码进行探索
|
网络协议 网络架构
Cisco之路由重分发和配置NAT
在一个大型网络中可能存在着多种路由协议,因此关系到路由重分发的问题。网络架构如下图所示:架构说明1 R1为总公司路由器;2 R2、R5为上海分公司路由器;3 R3、R4为杭州分公司路由器;4 总公司和分公司之间使用OSPF协议,上海分公司使用RIP协议,而杭州分公司使用静态路由协议;5 所有分公司访问公网都通过总公司路由器R1实现;6 本地所带主机由Loopback1接口模拟;7 Loopback0使用192.168.255.0/24网段并且作为Router ID;一、配置基本信息1.R1配置R1(config)#hostname R1R1(config)#intR1(config-if)#n
Cisco之路由重分发和配置NAT