凌云时刻 · 洞见

导读:eBPF起源于 Linux 网络子系统,由于其灵活性和高性能等特点,被迅速应用在不同领域。事实上网络领域中,eBPF由于其高性能支持更高的吞吐率、平均每GB带宽消耗更少的CPU等特性,已经逐渐成为网络领域中改变游戏规则的技术。

作者 | 侯志远 汤志敏 王炳燊 杨伟 邬宗勇

来源 | 凌云时刻(微信号:linuxpk)

kubernetes网络性能问题

kubernetes网络可分为Pod网络、服务网络、网络策略三个部分。Pod网络依据kubernetes网络模型连接集群中的Pod、Node到一个扁平的3层网络中,也是服务网络、网络策略实现的底座。服务网络在Pod网络的路径上添加负载均衡的能力支持Pod到service的访问。网络策略则通过状态防火墙功提供pod间的访问控制。

当前服务网络和网络策略多基于kernel协议栈的L3包过滤技术Netfilter框架实现,包括conntrack, iptables, nat, ipvs等。Netfilter作为2001年加入kernel的的包过滤技术,提供了灵活的框架和丰富的功能,也是Linux中应用最为广泛的包过滤技术。不过其在性能、扩展能力等方面也一直存在一些问题,例如iptables规则由于是线性结构存在更新慢、匹配慢问题,conntrack在高并发场景中性能下降快、连接表被打满的问题等等。Netfilter的这些问题也导致了服务网络、网络策略难以满足大规模的kubernetes集群和一些高性能场景的需求。

为解决服务网络、网络策略基于netfilter实现的性能问题,也有一些通过云上网络产品来实现的方法。例如由L4负载均衡实现服务网络、安全组实现网络策略。云上网络产品提供了丰富的网络功能和确定的SLA的保障,但因当前云网产品主要聚焦在IaaS层,其创建速度、配额等限制存在难以满足云原生场景的弹性、快速等需求。

Pod网络的实现依据是否经过kernel L3协议栈可分为两大类:经过L3协议栈的路由、Bridge等,bypass L3协议栈的IPVlan、 MacVlan,、直通等。经过L3协议栈的方案由于datapath中保留了完整的L3的处理,可兼容当前的服务网络、网络策略的实现,但因L3的逻辑较重这类方案性能较低。bypass L3协议栈的方案,由于datapath逻辑简单性能扩展性都较好,但存在较难实现服务网络、网络策略的问题。

综上,kubernetes网络在性能上的问题总结为如下几类:

考虑kubenetes网络当前的现状,我们需要重新实现一种不依赖于Netfilter的轻量的服务网络、网络策略实现。一方面可以应用于IPVlan、MacVlan、直通等高性能Pod网络中、补齐其对服务网络、网络策略的支持,另一方面新的实现需要有更好的性能、扩展能力。

基于eBPF的方案

 eBPF:可编程的转发面

eBPF在kernel实现了一个基于寄存器的虚拟机,并定于了自己的64bit指令集。通过系统调用,我们可以加载一段编写好的eBPF程序到kernel,并在相应的事件发生触发运行。同时kernel也提供的相关验证机制,确保加载的eBPF程序其可以被安全的执行,避免对kernel产生破坏,导致painc, 安全隐患等风险。

kernel当前在许多模块中增加了eBPF的支持,并定义了多种的eBPF程序类型。每种类型确定了其可以加载到kernel中的位置、可以调用的kernel helper函数、运行eBPF程序时传递的对象、以及对kernel对象的读写权限等。目前网络是eBPF应用较多也是发展较快的的子系统之一。从协议栈底层的网卡到上层的socket,均存在多种类型的eBPF的支持。

同时,针对当前netfilter的一些性能,社区也在基于eBPF实现一个新的名为bpfilter的包过滤技术(https://lwn.net/Articles/755919/)。

从网络开发者的视角,eBPF相当于在kernel中提供了一种可编程的数据面,同时由kernel去保证程序的安全性。我们希望基于此实现一种高性能的服务网络和网络策略,同时应用于IPVlan, MacVlan, 直通等bypass L3的Pod网络。从而在kubernetes中提供一种综合性能较好的网络解决方案。

 tc-ebpf:一种新的服务网络&网络策略实现

tc-ebpf位于Linux协议栈的L2层,可以hook网络设备的入、出双向流量到eBPF实现的datapath,基于tc-ebpf实现网络网络&网络策略优势有:

  • hook在tc层,不依赖kernel的L3协议栈能力,可较容易的支持ipvlan、macvlan、直通等多种高性能网络模式;

  • 可以读写skb_buff,kernel提供的helper函数功能丰富,较容易实现复杂的datapath。

  • 规则的匹配、更新基于Hash,比线性操作的iptables规则性能高、扩展性好

  • datapath可编程。可在不重启、升级kernel的前提下,对datpath进行更新、优化

通过tc-ebpf构建服务网络&网络策略一般需要实现如下几个模块:

Conntrack是服务网络、网络策略的基础模块。egress, ingress流量均会先经过conntrack的处理,并生成容器流量的连接状态。

LoadBalance+ReverseNat为服务网络的模块。LoadBalance为egress流量选择可用的endpoint,并将负载均衡信息同步到连接追踪信息中;ReverseNat为ingress流量查找LoadBalance信息并执行发向nat,修改源IP为cluster ip。

Policy模块基于Conntrack的连接状态,对于新连接应用用户定义的Policy规则。

我们也调研了当前相关的社区一些实现,Cilium是基于eBPF技术构建kubernetes网络能力其中的佼佼者,使用eBPF实现了Pod网络、服务网络、网络策略等能力,但也发现cilium目前支持的网络模式没有很好的应用于公有云的场景。

  • vxlan封包模式:在封包解包过程中造成额外的性能损失,并且封包之后的UDP包不能利用tso等网卡offload性能优化

  • linux路由模式:在一些虚拟化环境中不支持2层的路由协议,比如在阿里云上没办法通过路由协议打通不同机器的Pod IP段?

  • cni chain: cilium当前支持的的cni chain的方式,可以对接veth的网络插件,但性能上的优化并不明显。

 Terway With eBPF: 我们的方案

Terway是阿里云容器服务团队开源的高性能容器网络插件,支持使用阿里云的弹性网卡来实现的容器网络。使得容器网络和虚拟机网络在同一个网络平面,在不同主机之间容器网络通信时不会有封包等损失,不依赖于分布式路由也能让集群规模不受限于路由条目限制。

我们和Terway合作,通过CNI chain的方式连接Terway和Cilium,进一步优化了Kubernetes的网络性能。

Terway作为CNI chain的第一个CNI,在阿里云VPC之上创建Pod网络连接Pod到VPC,提供高性能的容器网络通信。而Cilium作为第二个CNI,实现高性能的服务网络和网络策略。

IPVlan Based CNI Chain

综合单Node上Pod密度、性能等因素,Pod网络采用VPC的eni多ip特性,基于IPVlan L2的方式创建。

同时在Cilium中实现一种IPVlan模式的CNI chain mode,在terway创建创建的Pod网络基础上接入tc-eBPF的datapath,实现服务网络和网络策略。

性能评估

网络性能评估主要与Terway当前三种网络模式对比:

  • 策略路由模式

  • IPVlan

  • ENI

本方案实现的Terway With eBPF(下列图中简称eBPF)模式性能测试结论:

  • Pod网络性能

    • ebpf模式接近ipvlan模式,相比下降2%,相比策略路由提升11%,

    • 扩展性能

      • 当Pod的数量从3增加156时,IPVlan和eBPF下降约13%,  策略路由下降约23%

  • 服务网络性能

    • 相比kube-proxy(iptables模式)短连接提升约32%,长连接提升19%

    • 相比kube-proxy(ipvs模式)提升短连接约60%,长连接提升约50%

    • 扩展性能

      • kuberenetes服务从1增加到5000时,eBPF和kube-proxy(ipvs模式)性能都表现出较好的扩展能力持平,5000个服务性能略微下降3%;kube-proxy(iptables模式)短连接下降约60%, 长连接下降约6%左右

  • 网络策略性能

    • pod和policy为1时,eBPF模式比策略路由在短连接提升约32%,长连接提升约16%

    • pod和policy为增加到120时,短连接eBPF相比策略路由性能提升19%;长连接提升24%

 Pod网络

tcp性能测试结果

udp性能测试结果

 服务网络

service网络测试不同网络模型下的service network的转发性能和扩展能力。测试对比了pod网络,service为1,1000, 5000四种类型。测试工具采用ab、nginx,nginx配置为8核心。

 网络策略

Terway的网络模式中仅有策略路由。本测试对比了两种模式在被测pod为1配置1个policy以及被测pod为120配置120个policy下的性能数据。测试工具为ab-nginx, nginx配置为8核心。

总结 & 后续

分析当前Kubernetes中网络(Pod网络、服务网络及网络策略)中的性能、扩展能力等问题。我们调研了kenrel eBPF技术及社区开源的eBPF容器方案Cilium,最后在阿里云上结合Terway,基于ENI多IP的网络特性实现了一种高性能容器网络方案。同时我们在cilium实现的IPVlan L2的CNI chain方案也已开源到Cilium社区。

在当前方案中Host Namespace的服务网络和网络策略的实现仍然是由kube-proxy实现。目前主要考虑Host Namespace中的服务网络流量在集群流量中占比较小,且流量类型较为复杂(包括cluter ip、node port、extern ip等),由eBPF实现的优先级不高收益较小。

tc-ebpf由于在Linux的L3之前,暂无还无法支持分片报文的重组。这会导致服务网络&网络策略的实现对分片报文失效,对于此,我们设计了redirect分片到L3协议栈重组重入eBPF的方案。不过考虑到kubernets集群大都部署在同类网络中,分片报文出现的概率相对较低,未在当前版本中实现。另外,cilium当前也在eBPF中增加了服务网络&网络策略对分片报文的支持 (https://github.com/cilium/cilium/pull/10264),目前该实现还存在无法分片报文乱序到底的问题。

展望

eBPF作为新技术为kernel的网络转发面开发提供了巨大的可能性。我们目前的方案相当于在L2层实现了服务网络、网络策略,虽然在性能上相比基于netfilter的方案存在一定的提升,但实现的conntrack模块在网络上依然是一个不可忽视的开销。另一方面我们也在思考,在kubernetes的pod或node中的datapath上是否真的需要conntrack?是否可以基于socket的状态信息实现无负载开销的conntrack。

基于此我们也在探索在socket层实现服务网络、网络策略的可能性。我们希望可以借助socket层的eBPF,构建一种开销极小conntrack,进而实现一种性能、扩展性更优的服务网络、网络策略方案。

END

往期精彩文章回顾

央行数字货币,支付宝没在怕的

张献涛:虚拟化技术 40 年演进史

重磅:达摩院医疗AI团队CVPR'20论文解读

朴灵:云计算的开发者视界中,OpenAPI 是绝对主角

央行DECP开测,拉开全球货币霸权之战大幕

长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

eBPF技术应用云原生网络实践:kubernetes网络 | 凌云时刻相关推荐

  1. eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术

    简介:如何使用 socket eBPF进一步提升Service 网络的转发性能? 背景介绍 Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成.其中 POD ...

  2. 正在颠覆技术栈,一文看懂网易数帆轻舟云原生交付实践

    文章目录 应用的交付 传统应用交付(过去) 可执行文件直接交付 封装成软件包交付 云原生应用交付(现在) 基于 Docker 的应用交付 基于 docker-compose 的应用交付 基于 Kube ...

  3. 使用 CNF 测试套件测试云原生最佳实践

    Joel Hans为CNCF撰写的社区帖子 电信行业是当今日益数字化的经济的支柱,但在发展以满足现代基础设施实践方面面临着艰巨的新挑战.电信是如何陷入这种境地的?由于事故或停机的风险非常严重,该行业几 ...

  4. 云原生新边界——阿里云边缘计算云原生落地实践

    简介: 日前,在由全球分布式云联盟主办的"Distributed Cloud | 2021 全球分布式云大会·云原生论坛"上,阿里云高级技术专家黄玉奇发表了题为<云原生新边界 ...

  5. 京东杨业飞:京东云原生大规模实践之路

    嘉宾 | 杨业飞 出品 | CSDN云原生 2022年9月22日,在中国信通院.腾讯云.FinOps产业标准工作组联合发起的<原动力x云原生正发声 降本增效大讲堂>系列直播活动第9讲上,京 ...

  6. Tech Talk 活动预告 | 云原生DevOps的Kubernetes技巧

    前言 "All in Cloud"之后,很多公司开始了"Cloud Native"的进化之路.云原生技术虽然发展迅速,但项目工具数量庞大且缺乏整体的规划和标准, ...

  7. 【腾讯云原生降本增效大讲堂】京东云原生大规模实践之路

    嘉宾 | 杨业飞 出品 | CSDN云原生 2022年9月22日,在中国信通院.腾讯云.FinOps产业标准工作组联合发起的<原动力x云原生正发声 降本增效大讲堂>系列直播活动第9讲上,京 ...

  8. Hango 开源解读:云原生网关实践,为何要选择 Envoy ?

    网关是"镇守"互联网应用门户的关键流量代理软件.进入云原生时代,行业用户除了需要 API 网关提供请求代理.熔断限流.审计监控等常规能力外,更多的开始关注云原生兼容性(容器.服务网 ...

  9. Tech Talk 活动回顾|云原生 DevOps 的 Kubernetes 技巧

    前言 在席卷全行业的云原生趋势中,企业虽然通过云原生转型收获了很多成果和价值,但也遇到了不少障碍和挑战.其中,由于云原生项目工具数量庞大且缺乏整体规划和标准,企业在 DevOps 场景中就因此遇到了种 ...

  10. 云原生时代, Kubernetes 多集群架构初探

    为什么我们需要多集群? 近年来,多集群架构已经成为"老生常谈".我们喜欢高可用,喜欢异地多可用区,而多集群架构天生就具备了这样的能力.另一方面我们也希望通过多集群混合云来降低成本, ...

最新文章

  1. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法
  2. 图像滤镜艺术--编码基础(Photoshop基础变换的代码实现)
  3. RabbitMQ负载均衡(4)——LVS
  4. 【splunk】仪表盘导入导出
  5. 关于修改docker(非docker-engine)的日志引擎
  6. cpu压力测试 Android,Android App 压力测试方法(Monkey)
  7. mysql创建师徒_[郑州|结业弟子]JAVA-乔兆年|2020年05月09日的日报-技能树.IT修真院...
  8. Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换
  9. Excel中 对「对话气泡(吹き出し)」中的文字添加删除线 等操作
  10. Volatile(理解)
  11. 在JSP中使用CELL插件
  12. 如何彻底关闭UAC----之注册表篇
  13. 各层电子数排布规则_核外电子的排布及其规律,亨利·莫塞莱和查尔斯·巴克拉最先发现电子层...
  14. 看看十二星座哪个更适合当程序员
  15. python绘制contourf填色图,设置色标,解决填图的颜色与实际数值不一致的问题
  16. ESP32基础应用之使用两个ESP32通过阿里云物联网平台实现相互通信
  17. (2021年)is not a supported wheel on this platform解决方案
  18. TS科普19 各种流(如:MP3、H264、H265等)在TS的流类型
  19. 2011 年互联网十大浏览器
  20. 计算机网络原理综合考核,计算机网络原理考试重点

热门文章

  1. knockout.js的学习笔记3
  2. 用批处理开启或关闭windows 服务
  3. 使用码云或GitHub搭建简单的个人网站
  4. PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例
  5. Control-Tree
  6. vue 组件创建与销毁
  7. linux系统学习(常用命令)
  8. C/C++文件操作经验总结
  9. 经典200例-003 为项目添加已有类
  10. cocos2d-x中的尺寸之二