eBPF技术应用云原生网络实践系列之基于socket的service | 龙蜥技术
时间:2021-10-13 14:07:43
手机看文章
扫描二维码
随时随地手机看文章
[导读]相关阅读:《eBPF技术应用云原生网络实践系列之kubernetes网络》背景介绍Kubernetes中的网络功能,主要包括POD网络,service网络和网络策略组成。其中POD网络和网络策略,都是规定了模型,没有提供默认实现。而service网络作为Kubernetes的特色...
相关阅读:《eBPF技术应用云原生网络实践系列之kubernetes网络》
背景介绍
Kubernetes 中的网络功能,主要包括 POD 网络,service 网络和网络策略组成。其中 POD 网络和网络策略,都是规定了模型,没有提供默认实现。而 service 网络作为 Kubernetes 的特色部分,官方版本持续演进了多种实现:
| service 实现 | 说明 |
| userspace 代理模式 | kube-proxy 负责 list/watch,规则设置,用户态转发。 |
| iptables 代理模式 | kube-proxy 负责 list/watch,规则设置。IPtables 相关内核模块负责转发。 |
| IPVS 代理模式 | kube-proxy 负责 list/watch,规则设置。IPVS 相关内核模块负责转发。 |
-
通过 attach 到特定的 cgroup 的文件描述符,可以控制 hook 接口的作用范围。
-
利用 sock eBPF hook,我们可以在 socket 层面劫持特定的 socket 接口,来完成完成负载均衡逻辑。
- POD-SVC-POD 的转发行为转换成 POD-POD 的转发行为。
TCP 工作流程
TCP 由于是有基于连接的,所以实现非常简明,只需要 hook connect 系统调用即可,如下所示:connect 系统调用劫持逻辑:1. 从 connect 调用上下文中取 dip dport,查找 svc 表。找不到则不处理返回。
- 不需要逐包的 dnat 行为。
- 不需要逐包的查找 svc 的行为。
UDP 工作流程
UDP 由于是无连接的,实现要复杂一些,如下图所示:nat_sk 表的定义参见:LB4_REVERSE_NAT_SK_MAP
基于 socket eBPF 实现的 clusterIP,在上述基本转发原理之外,还有一些特殊的细节需要考虑,其中一个需要特殊考虑就是 peer address 的问题。和 IPVS之类的实现不同,在 socket eBPF 的 clusterIP 上,client 是和直接和 backend 通信的,中间的 service 被旁路了。回顾一下转发路径如下:
总结
和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 等。
加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】拉你入群;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入龙蜥社区(OpenAnolis)交流,共同推进龙蜥社区的发展,一起打造一个活跃的、健康的开源操作系统生态!





