Kubernetes Service[1] 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式。IPVS模式的性能最好,但依然有优化的空间。该模式利用IPVS内核模块实现DNAT,利用nf_conntrack/iptables实现SNAT。nf_conntrack是为通用目的设计的,其内部的状态和流程都比较复杂,带来很大的性能损耗。

腾讯TKE团队开发了新的IPVS-BPF模式,完全绕过nf_conntrack的处理逻辑,使用eBPF完成SNAT功能。对最常用的Pod访问ClusterIP场景,短连接性能提升40%,p99时延降低31%;NodePort场景提升,详情见下表和性能测量章节。

容器网络现状

iptables模式

存在的问题:

  1. 可扩展性差。随着service数据达到数千个,其控制面和数据面的性能都会急剧下降。原因在于iptables控制面的接口设计中,每添加一条规则,需要遍历和修改所有的规则,其控制面性能是O(n²)。在数据面,规则是用链表组织的,其性能是O(n)

  2. LB调度算法仅支持随机转发

IPVS模式

IPVS是专门为LB设计的。它用hash table管理service,对service的增删查找都是O(1)的时间复杂度。不过IPVS内核模块没有SNAT功能,因此借用了iptables的SNAT功能。IPVS针对报文做DNAT后,将连接信息保存在nf_conntrack中,iptables据此接力做SNAT。该模式是目前Kubernetes网络性能最好的选择。但是由于nf_conntrack的复杂性,带来了很大的性能损耗。

IPVS-BPF方案介绍

eBPF介绍

eBPF是Linux内核中软件实现的虚拟机。用户把eBPF程序编译为eBPF指令,然后通过bpf()系统调用将eBPF指令加载到内核的特定挂载点,由特定的事件来触发eBPF指令的执行。在挂载eBPF指令时内核会进行充分验证,避免eBPF代码影响内核的安全和稳定性。另外内核也会进行JIT编译,把eBPF指令翻译为本地指令,减少性能开销。

内核在网络处理路径上中预置了很多eBPF的挂载点,例如xdp、qdisc、tcp-bpf、socket等。eBPF程序可以加载到这些挂载点,并调用内核提供的特定API来修改和控制网络报文。eBPF程序可以通过map数据结构来保存和交换数据。

基于eBPF的IPVS-BPF优化方案

针对nf_conntrack带来的性能问题,腾讯TKE团队设计实现了IPVS-BPF。核心思想是绕过nf_conntrack,减少处理每个报文的指令数目,从而节约CPU,提高性能。其主要逻辑如下:

  1. 在IPVS内核模块中引入开关,支持原生IPVS逻辑和IPVS-BPF逻辑的切换

  2. 在IPVS-BPF模式下,将IPVS hook点从LOCALIN前移到PREROUTING,使访问service的请求绕过nf_conntrack

  3. 在IPVS新建连接和删除连接的代码中,相应的增删eBPF map中的session信息

  4. 在qdisc挂载eBPF的SNAT代码,根据eBPF map中的session信息执行SNAT

此外,针对icmp、fragmentation均有专门处理,详细背景和细节后面文章会介绍。

优化前后报文处理流程的对比:

可以看到,报文处理流程得到了极大简化。

为什么不直接采用全eBPF方式

很多读者会问,为什么还要用IPVS模块跟eBPF相结合,而不是直接使用eBPF把Service功能都实现了呢?

我们在设计之初也仔细研究了这个问题,主要有以下几点考虑:

  • nf_conntrack对CPU指令和时延的消耗,大于IPVS模块,是转发路径的头号性能杀手。而IPVS本身是为高性能而设计的,不是性能瓶颈所在

  • IPVS有接近20年的历史,广泛应用于生产环境,性能和成熟度都有保障

  • IPVS内部通过timer来维护session表的老化,而eBPF不支持timer, 只能通过用户空间代码来协同维护session表

  • IPVS支持丰富的调度策略,用eBPF来重写这些调度策略,代码量大不说,很多调度策略需要的循环语句,eBPF也不支持

我们的目标是实现代码量可控,能落地的优化方案。基于以上考虑,我们选择了复用IPVS模块,绕过nf_conntrack,用eBPF完成SNAT的方案。最终数据面代码量为:500+行BPF代码, 1000+行IPVS模块改动(大部分为辅助SNAT map管理的新增代码)。

性能测量

本章节通过量化分析的方法,用perf工具读取CPU性能计数器,从微观的角度解释宏观的性能数据。本文采用的压测程序是wrk和iperf。

测试环境

复现该测试需要注意两点:

  1. 不同的集群和机器,即使机型都一样,也可能因为各自母机和机架的拓扑不同,造成性能数据有背景差异。为了减少这类差异带来的误差,我们对比IPVS模式和IPVS-BPF模式时,是使用同一个集群,同样一组后端Pod, 并且使用同一个LB节点。先在IPVS模式下测出IPVS性能数据,然后把LB节点切换到IPVS-BPF模式, 再测出IPVS-BPF模式的性能数据。(注:切换模式是通过后台把控制面从kube-proxy切换为kube-proxy-bpf来实现的,产品功能上并不支持这样在线切换)

  2. 本测试的目标是测量LB上软件模块优化对于访问service性能的影响,不能让客户端和RS目标服务器的带宽与CPU成为瓶颈。所以被压测的LB节点采用1核机型,不运行后端Pod实例;而运行后端服务的节点采用8核机型。

NodePort

为了采集CPI等指标,这里LB节点(红色部分)采用黑石裸金属机器,但通过hotplug只打开一个核,关闭其余核。

ClusterIP

这里LB节点(左边的Node)采用SA2 1核1G机型。

测量结果

IPVS-BPF模式相对IPVS模式,NodePort短连接性能提高了64%,ClusterIP短连接性能提高了40%。

NodePort优化效果更明显,是因为NodePort需要SNAT,而我们的eBPF SNAT比iptables SNAT更高效,所以性能提升更多。

如上图所示,iperf带宽测试中IPVS-BPF模式相对IPVS mode性能提升了22%。

上图中,wrk测试表明NodePort 短连接p99延迟降低了47%。

上图中,wrk测试表明ClusterIP短连接的p99延迟降低了31%。

指令数和CPI

上图中从Perf工具看,平均每个请求耗费的CPU指令数,IPVS-BPF模式下降了38%。这也是性能提升的最主要原因。

IPVS-BPF 模式下CPI略有增加,大概16%。

测试总结

如上表,IPVS-BPF模式相对原生IPVS模式,Nodeport处理短连接性能提升了64%,p99延迟降低了47%,处理长连接带宽提升了22%;ClusterIP处理短连接吞吐量提升了40%, p99延迟降低了31%。

测试ClusterIP长连接吞吐时,iperf本身消耗了99% 的CPU,使得优化效果不容易直接测量。另外我们还发现IPVS-BPF模式下CPI有增加,值得进一步研究。

其他优化,特性限制和后续工作

在开发IPVS-BPF方案过程中,顺便解决或优化了一些其他问题

1、conn_reuse_mode = 1时新建性能低[2]以及no route to host问题[3]。

这个问题是当client发起大量新建TCP连接时,新的连接被转发到terminating的Pod上,导致持续丢包。此问题在IPVS conn_reuse_mode=1的情况下不会有。但是conn_reuse_mode=1时,有另外的新建连接性能急剧下降的bug, 故一般都设置成了conn_reuse_mode=0。我们在TencentOS内核中彻底修复了该问题,代码在ef8004f8[4]、8ec35911[5]、07a6e5ff63[6]同时也正在向内核社区提交修复。

2、DNS解析偶尔5s延时[7]

iptables SNAT分配lport到调用插入nf_conntrack,这中间是采用乐观锁机制。这中间如果发生竞争,相同的lport和五元组同时插入nf_conntrack会导致丢包。在IPVS-BPF模式下,SNAT选择lport的过程和插入hash table的过程在同一个循环中,循环次数最大为5次,从而减少了该问题的概率。

3、externalIP优化[8]造成clb健康检查失败问题

详情见:https://github.com/kubernetes/kubernetes/issues/79783#issuecomment-509007864

特性限制

Pod访问自身所在的service,IPVS-BPF模式会把请求转发给其他Pod,不会把请求转发给Pod自己

后续工作

  • 借鉴Cilium提出的方法,利用eBPF进一步优化clusterIP性能

  • 研究IPVS-BPF模式下CPI上升的原因,探索进一步提升性能的可能性

如何在TKE启用IPVS-BPF模式

如下图,在腾讯云TKE控制台创建集群时,高级设置下的Kube-proxy代理模式选项,选择 ipvs-bpf即可。

目前该特性需要申请白名单。请通过申请页提交申请。

相关专利

本产品产生的相关专利申请如下:

  • 2019050831CN 一种报文传输的方法及相关装置

  • 2019070906CN 负载均衡方法、装置、设备及存储介质

  • 2020030535CN 一种利用eBPF技术探测网络服务应用闲置的方法

  • 2020040017CN 宿主机实时负载感知的自适应的负载均衡调度算法

相关链接:

  1. https://kubernetes.io/docs/concepts/services-networking/service/

  2. https://github.com/kubernetes/kubernetes/issues/81775

  3. https://tencentcloudcontainerteam.github.io/2019/12/15/no-route-to-host/

  4. https://github.com/Tencent/TencentOS-kernel/commit/ef8004f8fe7d46e758955799a41cc9d66fa1ae34

  5. https://github.com/Tencent/TencentOS-kernel/commit/8ec35911f7c5e1cb29059c18d42cf3aec4fcc673

  6. https://github.com/Tencent/TencentOS-kernel/commit/07a6e5ff63a74efcca67d496f6ac8126f1f114ff

  7. https://tencentcloudcontainerteam.github.io/2018/10/26/DNS-5-seconds-delay/

  8. https://github.com/kubernetes/kubernetes/pull/63066

文章来源:腾讯云原生,点击查看原文。

Kubernetes实战培训

Kubernetes实战培训将于2020年7月24日在深圳开课,3天时间带你系统掌握Kubernetes,学习效果不好可以继续学习。本次培训包括:云原生介绍、微服务;Docker基础、Docker工作原理、镜像、网络、存储、数据卷、安全;Kubernetes架构、核心组件、常用对象、网络、存储、认证、服务发现、调度和服务质量保证、日志、监控、告警、Helm、实践案例等,点击下方图片或者阅读原文链接查看详情。

性能提升40%:腾讯TKE用eBPF绕过conntrack优化Kubernetes Service相关推荐

  1. 性能提升40%: 腾讯 TKE 用 eBPF 绕过 conntrack 优化 K8s Service

    Kubernetes Service 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化的空间 ...

  2. 腾讯 TKE 厉害了!用 eBPF绕过 conntrack 优化K8s Service,性能提升40%

    Kubernetes Service[1] 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有userspace,iptables和IPVS三种模式.IPVS模式的性能最好,但依然有优化 ...

  3. 苹果发布全球首款5nm芯片A14!性能提升40%,新iPad Air率先搭载

    边策 贾浩楠 萧箫 杨净 发自 凹非寺  量子位 报道 | 公众号 QbitAI 也是罕见,苹果的新品发布会,新一代iPhone没亮相,倒是把最新最强的AI芯片发布了. 没错,今天苹果没有发布iPho ...

  4. 金山云服务器内网带宽,性能提升40%!第三代金山云服务器全面覆盖不同企业计算力需求...

    来源:雪球App,作者: 金山云,(https://xueqiu.com/6219950559/113615950) 近日,金山云宣布正式推出基于全新Intel Xeon Skylake至强®处理器的 ...

  5. 苹果终于不再敷衍,iPhone15性能提升40%,高通彻底跪了

    去年发布的iPhone14实在太拉胯,导致市场表现相当让人失望,这也让苹果看到了不思进取的后果,因此苹果决定在今年的iPhone15上打个翻身仗,挽回消费者的信心. 这次苹果可谓使出了浑身解数,首先是 ...

  6. 英特尔发布Xeon D-1600处理器:10nm工艺 性能提升40%

    据十次方获悉,今天英特尔再次推出了全新的Xeon D-1600系列产品. 全新的Xeon D-1600处理器在此前发布的D-1500系列基础上,提供了最多八核的强悍处理性能.全新新品主要面向边缘网络. ...

  7. 【华为云技术分享】40%性能提升,华为云推出PostgreSQL 12 商用版

    摘要:日前,华为云数据库正式推出了RDS for PostgreSQL 12版本,并开始商用.本文将从华为云RDS for PostgreSQL 12的4大特性和架构图等多方面来解读华为云Postgr ...

  8. readyboost提升明显吗_iphone12promax参数对比11ProMax区别 性能提升多少

    iphone12promax参数对比11ProMax区别 性能提升多少 iPhone12ProMax是苹果今年推出的最为顶尖的旗舰,那么这款手机的跑分怎么样?综合性能强悍吗?小编为大家带来最新的跑分信 ...

  9. linux sli 提高效率,从原理到性能提升 MCP78智能SLI全解析

    NVIDIA正式发布了"Hbrid SLI"技术 在昨日的2008 CES上,NVIDIA正式向外界发布了"Hbrid SLI"技术,即我们所俗称的混合SLI, ...

最新文章

  1. Python20-Day05
  2. ???既然post可以将form 表单的数据提交到 jsp页面上面显示出来,为什么还要提交到servlet页面...
  3. Oralce 使用SQL中的exists 和not exists 用法详解
  4. 数字图像处理实验(11):PROJECT 05-02,Noise Reduction Using a Median Filter
  5. 【杂谈】有三AI秋季划增加生成对抗网络小组,你准备好大GAN一场了吗
  6. 互联网日报 | 6月16日 星期三 | 滴滴试点早高峰拼成0佣金计划;小米“急”招自动驾驶相关人才;苹果正式推出播客订阅服务...
  7. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.10节本章小结
  8. 【转载】计算机操作系统出现死锁的原因
  9. statsmodels常用函数(更新中)
  10. MySQL将一张表数据插入到另一张表
  11. Threading模块
  12. Tensorflow车牌识别完整项目(含完整源代码及训练集)
  13. K3Cloud不重启IIS修改调试代码
  14. 最全面计算机英语单词列表(四)
  15. 微信发红包的测试用例功能点
  16. js 比较啷个日期的大小
  17. 如何用sql计算回购率、复购率指标
  18. 人工智能实验二——prolog语言求解渡河问题(传教士和野人渡河,农夫渡河问题)实现详解
  19. 自封装验证手机号码、邮箱格式、身份证号的工具
  20. 如何批量合并Excel文件和工作表 - Excel合并器使用教程

热门文章

  1. docker运行项目脚本
  2. 看完就会制作微信小程序了
  3. 响应式表格,表格自适应(responsive table)
  4. python 网页樱花动态图_如何用Python实现动态图?
  5. 投资超2800亿元北京“3个100”重点工程开工率创新高
  6. Windows10 关闭 “快速启动”
  7. win10如何删除输入法_Win8系统自带输入法应该如何删除与添加?
  8. 抢课脚本从想写到放弃
  9. 那个酷爱写代码的少年后来怎么样了——走近华为云“瑶光少年”
  10. poj 1254 Hansel and Grethel 直线求交