[转帖]QPS 最高提升 91% | 腾讯云 TKE 基于 Cilium eBPF 提升 k8s Service 性能
https://my.oschina.net/cncf/blog/5121393
朱瑜坚,腾讯云后台工程师,主要负责腾讯云 TKE 容器网络的构建和相关网络组件的设计、开发和维护工作。
张浩,腾讯云高级工程师,主要负责容器网络多个组件的开发和维护,也关注调度、服务网格等领域。
前言
Kubernetes 已经成为容器管理领域的事实标准,而网络系统是 Kubernetes 核心部分,随着越来越多的业务部署在 Kubernetes,对容器网络也提出了一些新的需求
怎么提升网络的可观测性,serverless 类产品该需求尤为突出
怎么尽可能减少容器引入的网络性能损耗
上述需求冲击了 iptables,IPVS 等传统防火墙,负载均衡器技术。也促使我们思考容器网络访问链路能否不依赖于节点,进而缩短容器访问链路,提升网络性能
eBPF 是一项革命性技术,它可以以一种安全的方式在内核中许多 hook 点执行程序,该项技术可编程能力强,并且也无需维护内核模块,可维护性好,该项技术为满足上述需求提供了可能。Cilium[1] 则是基于 eBPF 技术的容器网络开源项目,提供了网络互通,服务负载均衡,安全和可观测性等解决方案
由此,腾讯云容器服务 TKE 基于 Cilium 和 eBPF 实现了独立网卡模式下的高性能 ClusterIP Service 方案。TKE 致力于提供更高性能、更安全和更易用的容器网络,也因此会不断关注 Cilium 等前沿的容器网络技术方案,后续会推出更多更完善的 Cilium 产品化能力。
独立网卡 Service 方案
TKE 于去年推出了新一代容器网络方案,该方案实现了一个 Pod 独占一张弹性网卡,不再经过节点网络协议栈(default namespace)。而当前的 kube-proxy 实现 ClusterIP 的方案都依赖于在节点侧的网络协议栈里设置相应的 iptables 规则,也因此该方案对于独立网卡方案不再适用。
其中一个解决方案便是 Cilium,Cilium 提供了基于 eBPF 的地址转换能力,从而可支持 ClusterIP Service。但其原生方案仅支持 veth pair 和 ipvlan l3 的数据面,并不支持 Pod 完全不经过节点网络协议栈的数据面,因此不能原生解决独立网卡 ClusterIP 的访问问题。
TKE 由此对 Cilium 加以改造,使其支持了除原生支持的 veth 和 ipvlan l3 的第三种数据面方案,如图(假设 pod 访问 Service IP 为 172.16.0.2),数据面上,将原本挂载到节点侧的 veth 上的 bpf 程序,挂载到 pod 内的独立网卡(同时也是弹性网卡)上,使得 Pod 的网络报文在发出的时候做 DNAT(目的地址转换),而回报文在网卡接收的时候做反向 DNAT,从而支持 ClusterIP 的访问。该数据面方案可作为一个通用方案适配 Ipvlan l2、SRIOV 等数据面场景。
而控制面上,将 Cilium 与 TKE 的 VPC-CNI 模式(含共享网卡模式和独立网卡模式)深度集成,用户无需对业务代码逻辑做任何修改,即可使用 Cilium 的功能特性。
性能对比
本文使用 wrk 工具对 Cilium 的产品化解决方案进行了性能压测,测试保证 Client Pod 和 Server Pod 分布在不同节点。
测试环境:TKE 集群,4 个 CVM 节点,配置为 Server S5.2XLARGE8,Client S5.SMALL2。
测试数据表明,基于 Cilium 的独立网卡 ClusterIP 访问方案性能最好。在短连接场景下,其 QPS 相比共享网卡的 iptables 和 ipvs 方案提升 48% 和 74%,相比全局路由的 iptables 和 ipvs 方案提升了 62% 和 91%。在长连接场景下,其 QPS 相比共享网卡的 iptables 和 ipvs 方案提升了 33% 和 57%,而相比全局路由的 iptables 和 ipvs 方案提升了 49% 和 66%。iptables 的性能较 ipvs 性能较好是因为测试环境中 Service 数量还不够多,ipvs 的优势在于大量 Service 的场景。
产品化过程中的相关问题
TKE 团队在实现 Cilium 产品化解决方案过程中,也发现了 Cilium 项目中一些问题,相应的解决方案和 Cilium 支持新数据面方案将于近日以 pr 的形式整理提交给 Cilium 社区。
独立网卡方案下的 ClusterIP 自访问不通
以上方案其实不能完全解决 ClusterIP 访问问题,存在一类特殊的场景会访问不通。这类场景就是 Pod 访问的 ClusterIP,其后端包括其自身。这类场景下,独立网卡的 Pod 发出的网络报文会直接到达 IaaS 层,不符合预期。
由于独立网卡 Pod 内,其实只有两个网络设备:回环设备(lo)和弹性网卡,因此一个简单的思路就是在出报文之前,对自访问流量,通过 bpf_redirect 调用将报文直接转发(redirect)到回环(lo)设备。基于此,TKE 团队修改了 cilium 的相关 bpf 代码,提供了一个解决方案。经过测试,该方案可以解决独立网卡方案下的 ClusterIP 自访问问题。
Cilium 加载 bpf 程序的名字缺失
Cilium 项目的可调试性存在一个问题,其 bpf 程序开发得比较早,底层用了很多老的工具集,例如 tc,来加载 bpf 代码。
老的 tc 基于老的内核版本 (<4.15) 设计的,它在加载 bpf 程序时,将 bpf 程序的名字忽略了,导致 Cilium 加载的 bpf 程序都是无名字的。这影响了对代码的理解,追踪和调试。
对此 TKE 团队结合较新的内核对 tc 工具进行了修正,使得它加载 bpf 程序时,会正确的传入名字。通过这名字,可以搞清楚实际运行的 bpf 函数具体是哪一个,从而提高 Cilium 的可调试性。
用法
申请 Cilium 支持 ClusterIP 产品化内测开通后,创建 TKE 集群时高级设置中打开 ClusterIP 增强
即可:
总结与展望
本文介绍了 TKE 团队实现的基于 Cilium 和 eBPF 的独立网卡模式下高性能 ClusterIP service 方案,该方案相比当前基于 iptables 和 ipvs 的传统网络方案大量的提升了性能(33%-91%)。
显然,Cilium 提供的能力还不止于此,其基于 eBPF 这项革命性的技术,还提供了安全、可观测性、QoS 等方面的能力,而提供更高性能、更安全和更易用的容器网络正是 TKE 的服务目标,因此,后续 TKE 将会积极参与 Cilium 社区,与社区一道共同推出更强大、更完善的容器网络能力。
[转帖]QPS 最高提升 91% | 腾讯云 TKE 基于 Cilium eBPF 提升 k8s Service 性能的更多相关文章
- 腾讯云TKE-基于 Cilium 统一混合云容器网络(下)
前言 在 腾讯云TKE - 基于 Cilium 统一混合云容器网络(上) 中,我们介绍 TKE 混合云的跨平面网络互通方案和 TKE 混合云 Overlay 网络方案.公有云 TKE 集群添加第三方 ...
- 腾讯云 TKE Everywhere 特性发布,用户可在自有基础设施中托管 K8s 服务
作者 孔令飞,腾讯云资深工程师,拥有大规模 Kubernetes 集群.微服务的研发和架构经验,目前专注于云原生混合云领域的基础架构开发. 朱翔,腾讯云容器服务高级产品经理,目前负责云原生混合云产品方 ...
- Kubernetes最佳实践之腾讯云TKE 集群组建
作者陈鹏,腾讯工程师,负责腾讯云 TKE 的售中.售后的技术支持,根据客户需求输出合理技术方案与最佳实践,为客户业务保驾护航.使用 TKE 来组建 Kubernetes 集群时,会面对各种配置选项,本 ...
- 腾讯云:基于 Ubuntu 搭建 VNC 远程桌面服务
基于 Ubuntu 搭建 VNC 远程桌面服务 前言 任务时间:5min ~ 10min 必要知识 本教程假设您已学习以下 Ubuntu 基本操作: 连接 SSH 执行命令 编辑文件 如果还没有掌握 ...
- 性能提升40%: 腾讯 TKE 用 eBPF 绕过 conntrack 优化 K8s Service
Kubernetes Service 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化的空间 ...
- 腾讯 TKE 厉害了!用 eBPF绕过 conntrack 优化K8s Service,性能提升40%
Kubernetes Service[1] 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化 ...
- 腾讯云总监手把手教你,如何成为AI工程师?
作者:朱建平 腾讯云技术总监,腾讯TEG架构平台部专家工程师 1.关于人工智能的若干个错误认知 人工智能是AI工程师的事情,跟我没有什么关系 大数据和机器学习(AI) 是解决问题的一种途径和手段,具有 ...
- MySQL之父造访腾讯云 为腾讯云数据库开源点赞
近日,技术大牛 MariaDB 公司创始人兼CTO Michael Widenius(又名Monty).MariaDB 基金会主席 Kaj 来到中国,针对MariaDB与腾讯云的技术合作进行回访.去年 ...
- qGPU on TKE - 腾讯云发布下一代 GPU 容器共享技术
背景 qGPU 是腾讯云推出的 GPU 共享技术,支持在多个容器间共享 GPU卡,并提供容器间显存.算力强隔离的能力,从而在更小粒度的使用 GPU 卡的基础上,保证业务安全,达到提高 GPU 使用率. ...
- 腾讯云与 Grafana Labs 达成深度合作, 推出全新 Grafana 托管服务
9 月 23 日,腾讯云宣布与业界领先的开源数据可视化公司 Grafana Labs 达成深度合作协议,共同开发和验证全新的 Grafana 托管服务,通过 Grafana Labs 开源软件与腾讯云 ...
随机推荐
- 聊一聊为什么我要整合Microsoft.Extensions.DependencyInjection和Castle.Core
前言 如果用到动态代理,大家可能会有几种选择,排到前列的是Autofac+Castle.AspectCore和DoraInterception, 我将从我当时研究的经历,以及我遇到的场景,为大家展示下 ...
- 如何通过命令部署.Net
如何通过命令部署.net3.5组件服务 问题:系统安装.net一直报错,无法安装该功能. 问题现象: 终极解决方案: 将windows10系统镜像文件拷贝在硬盘或者U盘中,鼠标右击选择"装载 ...
- ChatGpt玩法(一):prompt使用的重要性
前言 登录https://www.topgpt.one即可免费体验ChatGPT带来的强大魅力. ChatGpt是一个强大的自然语言处理工具,可以用于多种任务,如文本生成.问答系统以及对话生成等等.其 ...
- Go--变量的声明
Go语言是静态类型语言,因此变量(variable)是有明确类型的,编译器也会检查变量类型的正确性. 变量是一段或多段用来存储数据的内存,在go中,变量一旦被定义,一定要使用,不然会报错 内建变量类型 ...
- ME21N 采购订单新增页签增强
1.实现效果 根据客制化需求,要在采购订单中新增大量字段,所以要在界面上添加一个单独的页签.效果如下: 2.增强实现 2.1.增强结构 因为是在抬头上边添加,所以增强CI_EKKODB结构 2.2.函 ...
- java jar 注册成 windows 服务
1.去github上下载winsw https://github.com/winsw/winsw/releases 2.WinSW.NET4.xml <service> <id> ...
- 【LibCurl】HomeBrew 安装 LibCurl & CMake 配置
LibCurl 在官网中明确指出支持 HomeBrew 进行安装. 那么在 macOS 端的安装就不会想 Win 下需要根据版本进行编译了,方便许多 brew install curl # 安装完成后 ...
- CH6803 导弹防御塔 (二分 + 匈牙利 / 网络流)
链接:https://ac.nowcoder.com/acm/contest/1062/D 题目描述 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵 ...
- Codeforce 515C. Drazil and Factorial(字符串思维题)
[CodeForces]C. Drazil and Factorial 题目链接:Click Here 题意:找一个最大的数,使得每个位的阶乘的乘积与给定数相同. 首先將 2~9 轉成這樣(0,1為空 ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) A~C 个人题解
补题链接:Here 1498A. GCD Sum 题意:给定一个 gcdSum 操作:\(gcdSum(762) = gcd(762,7 + 6 + 2) = gcd(762,15) = 3\) 请问 ...