首页 > 编程语言 >Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

Cilium 系列-7-Cilium 的 NodePort 实现从 SNAT 改为 DSR

时间:2023-07-29 13:00:45浏览次数:42  
标签:启用 DSR 模式 NodePort SNAT 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-latencynetwork-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 在其他节点入向流量:

NodePort 后端 pod 在其他节点入向流量

出向流量:

NodePort 后端 pod 在其他节点出向流量

该设置可通过 loadBalancer.mode Helm 选项更改为 dsr,以便让 Cilium 的 eBPF NodePort 实现在 DSR 模式下运行。在这种模式下,后端直接回复外部客户端,而不需要额外的跳转,也就是说,后端通过使用服务 IP/port 作为源来回复。DSR 目前要求 Cilium 以本地路由模式部署,也就是说,它不能在任何一种隧道模式下工作。

DSR 模式流量如下:

DSR Mode

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

标签:启用,DSR,模式,NodePort,SNAT,Cilium
From: https://blog.51cto.com/ewhisper/6892094

相关文章

  • Cilium系列-5-Cilium替换KubeProxy
    系列文章Cilium系列文章前言将Kubernetes的CNI从其他组件切换为Cilium,已经可以有效地提升网络的性能.但是通过对Cilium不同模式的切换/功能的启用,可以进一步提升Cilium的网络性能.具体调优项包括不限于:启用本地路由(NativeRouting)完全替换KubeProxyI......
  • Cilium系列-4-Cilium本地路由
    系列文章Cilium系列文章前言在前文中我们提到,ciliuminstall默认安装后,Cilium功能启用和禁用情况如下:datapathmode:tunnel:因为兼容性原因,Cilium会默认启用tunnel(基于vxlan)的datapatch模式,也就是overlay网络结构。KubeProxyReplacement:DisabledCil......
  • Cilium 系列-3-Cilium 的基本组件和重要概念
    系列文章Cilium系列文章前言安装完了,我们看看Cilium有哪些组件和重要概念。Cilium组件如上所述,安装Cilium时,会安装几个运行组件(有些是可选组件),它们各是什么用途?CiliumOperatorCiliumOperator可以理解为Cilium的管理平面或操作运维平面。CiliumOperator不......
  • Cilium 系列-2-Cilium 快速安装
    系列文章Cilium系列文章前言在本章中,我们将直接将Cilium安装到Kubernetes集群中。在实验中,我们用到的组件及版本为:Cilium1.13.4K3sv1.26.6+k3s1OSDebian10,Kernel4.19.232,arm64Ubuntu23.04,Kernel6.2,x86......
  • Cilium系列-1-Cilium特色 功能及适用场景
    系列文章Cilium系列文章Cilium简介Cilium是一个开源的云原生解决方案,用于提供、保护(安全功能)和观察(监控功能)工作负载之间的网络连接,由革命性的内核技术eBPF提供动力。Cilium主要使用场景是在Kubernetes中,但Cilium的优势并不仅限于Kubernetes环境。在Kuberne......
  • m基于细菌觅食优化的DSR网络路由协议优化算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:    2.算法涉及理论知识概要        移动自组网(MobileAdHocNetwork,简称MANET)是一种无需基础设施支持的网络,它由一组移动的节点组成,这些节点可以自组织形成一个网络,实现数据的传输和共享。由于MANET是一种去中心化......
  • Kotlin + buildSrc:更好的管理Gadle依赖
    为了充分利用AndroidPluginforGradle3.0+的优点,将Android项目拆分成多个module的做法越来越常见。然而,随着module数量的增多,我们很快就会遇到依赖管理的混乱问题。管理Gradle依赖的三种不同方法:手动管理使用Google推荐的“ext”Kotlin+buildSrc1、手动管理这是一种大多数人在......
  • 亲测可用的NS2对"1. AODV" "2. DSDV" "3. DSR" 的路由模拟
    seta1while{$a==1}{puts"EntertheRoutingAgentsinmobilenetworking"puts"1.AODV"puts"2.DSDV"puts"3.DSR"settop[getsstdin]if{$top==1}{setopt(chan)Channe......
  • kube-proxy代替方案 Cilium
    CiliumCilium是一个开源的网络安全和服务发现解决方案,它基于Linux内核的eBPF(extendedBerkeleyPacketFilter)技术,提供了一种高效、灵活、可扩展的网络隔离和安全机制。网络隔离:Cilium通过eBPF技术实现了高效的包过滤和转发,可以在网络层面为不同的服务提供隔离和访问控制机......
  • NodeIP、PodIP、ClusterIP、NodePort、Port、TargetPort、HostPort
    目录1、IP类型1.1、NodeIP1.2、PodIP1.3、ClusterIP2、Port类型2.1、nodePort2.1、port2.1、targetPort2.1、hostPort 1、IP类型Kubernetes集群里有三种IP地址,分别如下:名称说明NodeIPWorker节点的IP地址,即物理网卡的IP地址。PodIP......