0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Linux阅码场 来源:OpenAnolis龙蜥 作者:秉辰、羽云、满霸 2021-10-13 10:54 次阅读

背景介绍

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

service 实现说明

userspace 代理模式kube-proxy 负责 list/watch,规则设置,用户态转发。

iptables 代理模式kube-proxy 负责 list/watch,规则设置。IPtables 相关内核模块负责转发。

IPVS 代理模式kube-proxy 负责 list/watch,规则设置。IPVS 相关内核模块负责转发。

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

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

7f2ba892-2bce-11ec-82a8-dac502259ad0.png

在本文中,介绍使用 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 网络。软件结构如下:

7f9c93a4-2bce-11ec-82a8-dac502259ad0.png

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_CREATEBPF_CGROUP_INET4_BINDBPF_CGROUP_INET4_CONNECTBPF_CGROUP_UDP4_SENDMSGBPF_CGROUP_UDP4_RECVMSGBPF_CGROUP_GETSOCKOPTBPF_CGROUP_INET4_GETPEERNAMEBPF_CGROUP_INET_SOCK_RELEASE

TCP 工作流程

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

80c7c974-2bce-11ec-82a8-dac502259ad0.png

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

815d1c0e-2bce-11ec-82a8-dac502259ad0.png

劫持 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%。

继续演进eBPF does to Linux what JavaScript does to HTML.-- Brendan Gregg

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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6508

    浏览量

    87525
  • Linux
    +关注

    关注

    87

    文章

    10969

    浏览量

    206644
  • 服务器
    +关注

    关注

    12

    文章

    8072

    浏览量

    82407
  • IPv6
    +关注

    关注

    6

    文章

    608

    浏览量

    58924
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1262

    浏览量

    78231

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

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    eBPF动手实践系列三:基于原生libbpf库的eBPF编程改进方案简析

    在上一篇文章《eBPF动手实践系列二:构建基于纯C语言的eBPF项目》中,我们初步实现了脱离内核源码进行纯C语言eBPF项目的构建。libb
    的头像 发表于 03-19 14:19 205次阅读
    <b class='flag-5'>eBPF</b>动手<b class='flag-5'>实践</b><b class='flag-5'>系列</b>三:基于<b class='flag-5'>原生</b>libbpf库的<b class='flag-5'>eBPF</b>编程改进方案简析

    Mavenir为捷克T-Mobile部署云原生网络设施

    Mavenir将使用其特有的容器即服务(CaaS)云平台来实施融合分组核心解决方案,在2G、3G、4G和5G非独立(NSA)网络中替换现有接入技术,同时开发有针对云原生5G独立(SA)网络
    的头像 发表于 02-25 15:20 177次阅读

    云原生是大模型“降本增效”的解药吗?

    云原生AI正当时
    的头像 发表于 02-20 09:31 123次阅读

    米哈游大数据云原生实践

    近年来,容器、微服务、Kubernetes 等各项云原生技术的日渐成熟,越来越多的公司开始选择拥抱云原生,并开始将 AI、大数据等类型的企业应用部署运行在云原生之上。以 Spark 为
    的头像 发表于 01-09 10:41 246次阅读
    米哈游大数据<b class='flag-5'>云原生</b><b class='flag-5'>实践</b>

    云原生技术前沿落地实践分论坛圆满举办

    12 月 16 日,2023 开放原子开发者大会【云原生技术前沿落地实践】分论坛在无锡成功举办。论坛将聚焦云原生的泛在化、Serverless 化以及智能化等前沿发展趋势,与一线
    的头像 发表于 12-22 09:20 549次阅读
    <b class='flag-5'>云原生</b><b class='flag-5'>技术</b>前沿落地<b class='flag-5'>实践</b>分论坛圆满举办

    诚邀报名|在开发者大会,洞悉云原生技术落地最佳实践

    2023开放原子开发者大会 . OPENATOM DEVELOPERS CONFERENCE 云原生技术前沿落地实践分论坛 2023.12.16 随着云原生
    的头像 发表于 12-09 18:45 411次阅读

    一图读懂英特尔云原生开源技术

    作为KubeCon China 2023 大会的钻石赞助商,9月26日-28日,英特尔在现场会有一个大的技术展示厅,其中包含10个现场展示,涵盖云原生基础设施,安全,人工智能以及可持续计算等。 欢迎
    的头像 发表于 09-23 10:10 360次阅读
    一图读懂英特尔<b class='flag-5'>云原生</b>开源<b class='flag-5'>技术</b>

    中国移动网络云原生演进技术白皮书

    云原生是近几年云计算领域炙手可热的话题。目前,无论互联网企业还是传统企业,都在拥抱云原生云原生是包含系列技术体系、系统设计理念、组织管理方
    发表于 08-30 12:15 417次阅读
    中国移动<b class='flag-5'>网络</b><b class='flag-5'>云原生</b>演进<b class='flag-5'>技术</b>白皮书

    华为携手中国移动荣获“2023年度云原生技术创新领航者-云原生技术创新案例”大奖

    有限公司等产业伙伴联合申报的“云原生技术在运营商的创新实践”荣获了“2023年度云原生技术创新领航者-
    的头像 发表于 07-06 18:50 374次阅读

    Ampere的192核云原生CPU首度导入Chiplet设计

    Ampere Computing以自有IP打造的192核云原生CPU——AmpereOne系列处理器的技术细节陆续曝光。
    的头像 发表于 06-21 18:03 737次阅读
    Ampere的192核<b class='flag-5'>云原生</b>CPU首度导入Chiplet设计

    行业翘楚论道未来想象|2023开放原子全球开源峰会云原生分论坛圆满落幕

    6 月 13 日,以“探索云原生技术发展与应用实践,赋能企业数字化转型”为主题的 2023 开放原子全球开源峰会云原生分论坛圆满落幕。此次分论坛邀请开发者、学术机构、企业代表等
    的头像 发表于 06-15 09:49 742次阅读
    行业翘楚论道未来想象|2023开放原子全球开源峰会<b class='flag-5'>云原生</b>分论坛圆满落幕

    行业翘楚论道未来想象|2023开放原子全球开源峰会云原生分论坛圆满落幕

    6月13日,以“探索云原生技术发展与应用实践,赋能企业数字化转型”为主题的2023开放原子全球开源峰会云原生分论坛圆满落幕。此次分论坛邀请开发者、学术机构、企业代表等
    的头像 发表于 06-14 20:35 297次阅读
    行业翘楚论道未来想象|2023开放原子全球开源峰会<b class='flag-5'>云原生</b>分论坛圆满落幕

    探索云原生技术发展与应用实践,赋能企业数字化转型 | 2023开放原子全球开源峰会云原生分论坛即将启幕

    应用占比将超过80%,全球云原生产业领域迎来新阶段、新挑战、新机遇。 6月13日,2023开放原子全球开源峰会云原生分论坛将在北京市亦创国际会展中心隆重召开。论坛以“探索云原生技术发展
    的头像 发表于 06-01 14:48 312次阅读
    探索<b class='flag-5'>云原生</b><b class='flag-5'>技术</b>发展与应用<b class='flag-5'>实践</b>,赋能企业数字化转型 | 2023开放原子全球开源峰会<b class='flag-5'>云原生</b>分论坛即将启幕

    探索云原生技术发展与应用实践,赋能企业数字化转型 | 2023开放原子全球开源峰会云原生分论坛即将启幕

    应用占比将超过80%,全球云原生产业领域迎来新阶段、新挑战、新机遇。 6月13日,2023开放原子全球开源峰会云原生分论坛将在北京市亦创国际会展中心隆重召开。论坛以“探索云原生技术发展
    的头像 发表于 05-30 01:40 363次阅读
    探索<b class='flag-5'>云原生</b><b class='flag-5'>技术</b>发展与应用<b class='flag-5'>实践</b>,赋能企业数字化转型 | 2023开放原子全球开源峰会<b class='flag-5'>云原生</b>分论坛即将启幕

    中科驭数携手DaoCloud道客开拓DPU在云原生计算场景的应用

    近日,中科驭数与DaoCloud 道客正式达成战略合作。本次合作依托中科驭数DPU技术优势与DaoCloud 道客云原生技术面向智算、超算、金融交易、电信等高性能云原生应用场景和行业领
    的头像 发表于 04-20 09:31 870次阅读