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

简介:如何使用 socket eBPF进一步提升Service 网络的转发性能?

背景介绍

Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成。其中 POD 网络和网络策略,都是规定了模型,没有提供默认实现。而 service 网络作为 Kubernetes 的特色部分,官方版本持续演进了多种实现:

在 Kubernetes 中先后出现的几种 Service 实现中,整体都是为了提供更高的性能和扩展性。

Service 网络,本质上是一个分布式的服务器负载均衡,通过 daemonset 方式部署的 kube-proxy,监听 endpoint 和 service 资源,并在 node 本地生成转发表项。目前在生产环境中主要是 iptables 和 IPVS 方式,原理如下:

在本文中,介绍使用 socket eBPF 在 socket 层面完成负载均衡的逻辑,消除了逐报文 NAT 转换处理,进一步提升 Service 网络的转发性能。

基于 socket eBPF 的数据面实现

socket eBPF 数据面简介

无论 kube-proxy 采用 IPVS 还是 tc eBPF 服务网络加速模式,每个从 pod  发出网络请求都必然经过 IPVS 或者 tc eBPF,即 POD <--> Service <--> POD,随着流量的增加必然会有性能开销, 那么是否可以直接在连接中将 service的clusterIP 的地址直接换成对应的 pod ip。基于 Kube-proxy+IPVS 实现的 service 网络服务,是基于逐报处理 +session 的方式来实现。

利用 socket eBPF,可以在不用直接处理报文和 NAT 转换的前提下,实现了负载均衡逻辑。Service 网络在同步上优化成 POD <--> POD,从而使Service 网络性能基本等同于 POD 网络。软件结构如下:

在 Linux 内核中,利用 BPF_PROG_TYPE_CGROUP_SOCK 类型的 eBPF hook 可以针对 socket 系统调用挂接 hook,插入必要的 EBPF 程序。

  • 通过 attach 到特定的 cgroup 的文件描述符,可以控制 hook 接口的作用范围。
  • 利用 sock eBPF hook,我们可以在 socket 层面劫持特定的 socket 接口,来完成完成负载均衡逻辑。
  • POD-SVC-POD 的转发行为转换成 POD-POD 的转发行为。

当前 Linux 内核中不断完善相关的 hook,支持更多的 bpf_attach_type,部分距离如下:

BPF_CGROUP_INET_SOCK_CREATE

BPF_CGROUP_INET4_BIND

BPF_CGROUP_INET4_CONNECT

BPF_CGROUP_UDP4_SENDMSG

BPF_CGROUP_UDP4_RECVMSG

BPF_CGROUP_GETSOCKOPT

BPF_CGROUP_INET4_GETPEERNAME

BPF_CGROUP_INET_SOCK_RELEASE

TCP 工作流程

TCP 由于是有基于连接的,所以实现非常简明,只需要 hook connect 系统调用即可,如下所示:

connect 系统调用劫持逻辑:

1. 从 connect 调用上下文中取 dip+dport,查找 svc 表。找不到则不处理返回。

2. 查找亲和性会话,如果找到,得到 backend_id,转 4。否则转 3。

3. 随机调度,分配一个 backend。

4. 根据 backend_id,查 be 表,得到 be 的 IP+ 端口。

5. 更新亲和性信息。

6. 修改 connect 调用上下文中的 dip+dport 为 be 的 ip+port。

7. 完成。

在 socket 层面就完成了端口转换,对于 TCP 的 clusterip 访问,基本上可以等同于 POD 之间东西向的通信,将 clusterip 的开销降到最低。

  • 不需要逐包的 dnat 行为。
  • 不需要逐包的查找 svc 的行为。

UDP 工作流程

UDP  由于是无连接的,实现要复杂一些,如下图所示:

nat_sk 表的定义参见:LB4_REVERSE_NAT_SK_MAP

劫持 connect 和 sendmsg 系统调用:

1. 从系统调用调用上下文中取 dip+dport,查找 svc 表。找不到则不处理返回。

2. 查找亲和性会话,如果找到,得到 backend_id,转 4,否则转 3。

3. 随机调度,分配一个 backend。

4. 根据 backend_id,查 be 表,得到 be 的 IP+端口。

5. 更新亲和性的相关表。

6. 更新 nat_sk 表,key 为 be 的 ip+port,value 为 svc的vip+vport。

7. 修改系统调用上下文中的 dip+dport 为 be 的 ip + port。

8. 完成。

劫持 recvmsg 系统调用

1. 从系统调用上下文中远端 IP+port,查找 NAT_SK 表,找不到则不处理返回。

2. 找到,取出其中的 IP+port,用来查找 svc 表,找不到,则删除 nat_sk 对应表项,返回。

3. 使用 nat_sk 中找到的 ip+port,设置系统调用上下文中远端的 IP+port。

4. 完成。

关于地址修正问题

基于 socket eBPF 实现的 clusterIP,在上述基本转发原理之外,还有一些特殊的细节需要考虑,其中一个需要特殊考虑就是 peer address 的问题。和 IPVS之类的实现不同,在 socket eBPF 的 clusterIP 上,client 是和直接和 backend 通信的,中间的 service 被旁路了。回顾一下转发路径如下:

此时,如果 client 上的 APP 调用 getpeername 之类的接口查询 peer address,这个时候获取到的地址和 connect 发起的地址是不一致的,如果 app对于 peeraddr 有判断或者特殊用途,可能会有意外情况。

针对这种情况,我们同样可以通过 eBPF 在 socket 层面来修正:

1、在guest kernel 上新增 bpf_attach_type,可以对 getpeername 和 getsockname 增加 hook 处理。

2、发起连接的时候,在相应的 socket hook 处理中,定义 map 记录响应的VIP:VPort 和 RSIP:RSPort 的对用关系。

3、当 APP 要调用 getpeername/getsockname 接口的时候,利用 eBPF 程序修正返回的数据:修改上下文中的远端的 IP+port为vip+vport。

总结

和TC-EBPF/IPVS性能对比

测试环境:4vcpu + 8G mem 的安全容器实例,单 client + 单 clusterip + 12 backend。socket BPF:基于 socket ebpf 的 service 实现。tc eBPF:基于 cls-bpf 的 service 实现,目前已经在 ack 服务中应用。IPVS-raw:去掉所有安全组规则和 veth 之类开销,只有 IPVS 转发逻辑的 service 实现。socket BPF 在所有性能指标上,均有不同程度提升。

大量并发的短连接,基本上吞吐提升 15%,时延降低 20%。

转发性能比较(QPS)

90%转发延时比较(ms)

继续演进

eBPF does to Linux what JavaScript does to HTML.--  Brendan Gregg

基于 socket eBPF 实现的 service,大大简化了负载均衡的逻辑实现,充分体现了 eBPF 灵活、小巧的特点。eBPF 的这些特点也很契合云原生场景,目前,该技术已在阿里云展开实践,加速了 kubernetes 服务网络。我们会继续探索和完善更多的 eBPF 的应用案例,比如 IPv6、network policy 等。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客

最近phpwind升级8.7后&#xff0c;经常出现宕机的现象&#xff0c;不是Apache卡死&#xff0c;吃光内存机器重启&#xff0c;就是mysql数据库被锁&#xff0c;无奈&#xff01;多个原因&#xff0c;apache的版本过低&#xff0c;导致执行效率慢&#xff1b;另外数据库版本过低&…

从开店营销到智能化私域运营,有赞发布人工智能引擎Jarvis

“以往在私域发起一场营销活动&#xff0c;从活动策划&#xff0c;到历史数据分析&#xff0c;再到内容排期&#xff0c;整个策划阶段往往需要一周以上的时间&#xff0c;而现在通过营销画布&#xff08;MA&#xff09;以及其中内嵌的人工智能能力&#xff0c;只需要30分钟不到…

“云网管” ---云上构建网络自动化体系

简介&#xff1a;云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理运维平台&#xff0c;提供企业网络全生命周期管理运维的能力&#xff0c;让部署更快捷、运维更高效、网络更透明。 1.背景 云网管是基于阿里云网络多年技术和经验沉淀打造的云上智能网络管理…

2022 (第五届)GIS软件技术大会开幕,GIS、IT将加速融合

院士专家共论GIS与AI、数据库等IT技术加速融合趋势。 会上&#xff0c;超图正式发布新产品SuperMap GIS 11i(2022)、与华为联合发布禹贡开源空间数据库。 6月29日上午&#xff0c;2022(第五届)GIS软件技术大会主题大会在线开幕。大会以“地理智慧 多维筑基”为主题&#xff0c;…

牛顿迭代法c 语言程序,牛顿迭代法 c语言实现

#include #include double func(double x) //函数{return x*x*x*x-3*x*x*x1.5*x*x-4.0;}double func1(double x) //导函数{return 4*x*x*x-9*x*x3*x;}int Newton(double *x,double precision,int maxcyc) //迭代次数{double x1,x0;int k;x0*x;for(k0;k{if(func1(x0)0.0)//若通过…

构建制品不一致,后续工作都是白费 | 研发效能提升36计

简介&#xff1a;本篇文章&#xff0c;我们从软件交付的终态出发&#xff0c;提出了不可变构建的概念。在软件开发的过程中&#xff0c;我们怎样才能享受产业生态的红利&#xff0c;实现软件交付过程的标准化呢&#xff1f;软件交付当中的集装箱应该是什么样的&#xff1f; 专栏…

巧用 Bitmap 实现亿级海量数据统计

作者 | 码哥字节来源 | 码哥字节在移动应用的业务场景中&#xff0c;我们需要保存这样的信息&#xff1a;一个 key 关联了一个数据集合。常见的场景如下&#xff1a;给一个 userId &#xff0c;判断用户登陆状态&#xff1b;显示用户某个月的签到次数和首次签到时间&#xff1b…

cache 访问延迟背后的计算机原理

简介&#xff1a;本文介绍如何测试多级 cache 的访存延迟&#xff0c;以及背后蕴含的计算机原理。 CPU 的 cache 往往是分多级的金字塔模型&#xff0c;L1 最靠近 CPU&#xff0c;访问延迟最小&#xff0c;但 cache 的容量也最小。本文介绍如何测试多级 cache 的访存延迟&…

c语言fun函数yx,C语言解24点游戏程序

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼前几天在微博上看到24点的游戏&#xff0c;6 6 610。算了很久是在算不出来&#xff0c;最后我想我何不写一个小程序解决它&#xff1f;说做就做&#xff0c;我刚开始的想法很简单&#xff0c;就是列举4个数的所有可能的表达式组合&…

创新推出 | Serverless 场景排查问题利器:函数实例命令行操作

简介&#xff1a; 实例命令行功能的推出希望能消除用户使用 Serverless 的“最后一公里”&#xff0c;直接将真实的函数运行环境展现给用户&#xff0c;此后 Serverless 将不再是一个“黑盒”&#xff0c;用户可以更加信任和依赖 Serverless 平台来扩展更多的业务场景和规模。 …

人人都是 Serverless 架构师 | 弹幕应用开发实战

简介&#xff1a;如何使用 Serverless 架构实现全双工通信的应用&#xff0c;Serverless 架构中数据库是如何使用的&#xff0c;本篇文章将为您揭开答。 作者 | 寒斜&#xff08;阿里云云原生中间件前端负责人&#xff09; Serverless 的理念是即时弹性&#xff0c;用完即走。…

“ Linux 和 Kubernetes 正在成为一切的平台”—— 对话全球最大独立开源公司 SUSE CTO...

【CSDN 编者按】作为全球企业级开源解决方案领导者SUSE的CTO&#xff0c;Brent Schroeder见证了一波又一波技术潮流赋能企业创新发展&#xff0c;为企业注入新活力。同时&#xff0c;他也感受到技术革新给企业的商业策略、运营方式和IT基础设施所带来的冲击。他认为&#xff0c…

c语言里有js的预编译环节吗,C语言第十一讲,预处理命令.

C语言第十一讲,预处理命令.一丶预处理简介什么是预处理,预处理就是预先处理. 我们知道,程序会经过编译,连接形成可执行文件这些在编译之前对源文件进行简单加工的过程&#xff0c;就称为预处理(即预先处理、提前处理)。预处理主要是处理以#开头的命令&#xff0c;例如#include …

各位 PHPer,Serverless 正当时

简介&#xff1a;PHP 作为一个开发群体的很大的语言其应用范围相当广泛&#xff0c;Serverless 的理念和 PHP 语言的理念都是让开发者最大精力集中在自己的业务价值。那么 PHP 遇见 Serverless 会迸发出哪些火花呢&#xff1f; 前言 PHP 的应用范围相当广泛&#xff0c;尤其是…

数字化转型再下一城,数字孪生厂商优锘科技宣布完成超3亿元融资

数字孪生技术是传统行业数字化转型的重要抓手&#xff0c;属于国家优先发展的战略性产业之一&#xff0c;已列入国家“十四五”规划纲要。 6月30日消息&#xff0c;数字孪生领导厂商“UINO优锘科技”宣布已于近期完成C轮超3亿元融资&#xff0c;本轮融资由中国互联网投资基金领…

双龙贺岁,龙蜥 LoongArch GA 版正式发布

简介&#xff1a;Anolis OS 8.4 LoongArch 正式版发布产品包括 ISO、软件仓库、虚拟机镜像、容器镜像。 简介 继 Anolis OS LoongArch 预览版发布后&#xff0c;现迎来龙蜥 LoongArch 正式版首发&#xff0c;该正式版在预览版的基础上提供了 AppStream、PowerTools 等仓库。A…

c语言中a lt 1e-9,年9月计算机二级考试C语言强化训练题

年9月计算机二级考试C语言强化训练题为了使广大学员在备战计算机二级考试时更快的掌握相应知识点&#xff0c;小编在此精选了计算机二级C语言的练习题供学员参考&#xff0c;大家要抓紧时间备考&#xff0c;祝大家备考愉快&#xff0c;梦想成真。一、单选题1). 若有说明&#x…

Serverless 年终技术盘点 :工业、学术、社区遍地开花,国内厂商迅速卡位

简介&#xff1a;预计 2021 年&#xff0c;将会有大量主流企业的核心应用&#xff0c;从原来的主机架构迁移到 Serverless 架构。 作者 | 刘宇&#xff08;花名&#xff1a;江昱&#xff09; 2021 年&#xff0c;Serverless 架构在权威咨询机构 Forrester 所发布的 《 The F…

Docker 如何安全地进入到容器内部

作者 | 飞向星的客机来源 | CSDN博客&#x1f31f; 前言镜像是构建容器的蓝图&#xff0c;Docker 以镜像为模板&#xff0c;构建出容器。容器在镜像的基础上被构建&#xff0c;也在镜像的基础上运行&#xff0c;容器依赖于镜像。本文将对 容器的运行 及相关内容进行详细讲解。容…

KubeVela v1.2 发布:你要的图形化操作控制台 VelaUX 终于来了

简介&#xff1a;时间来到 2022 年&#xff0c;KubeVela 也正式进入了第四个阶段&#xff0c;在原先核心控制器 API 基本稳定的基础上&#xff0c;我们以插件的形式增加了一系列开箱即用的功能。让开发者可以通过 UI 控制台的方式&#xff0c;连接 CI/CD 完整流程&#xff0c;端…