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

腾讯云TKE团队通过eBPF技术优化Kubernetes Service的IPVS模式,绕过nf_conntrack,提高性能。在短连接场景下,性能提升40%,p99时延降低31%。优化涉及iptables、IPVS-BPF方案,通过内核模块和eBPF的结合,减少了报文处理的指令数,简化处理流程。
摘要由CSDN通过智能技术生成

Kubernetes Service 用于实现集群中业务之间的互相调用和负载均衡,目前社区的实现主要有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场景提升更多。详情见下表和性能测量章节。

 'IPVS-BPF优化效果总览4.png'

一、容器网络现状

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,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes 集群中,Service 是一种虚拟的访问入口,用于将请求转发到后端的 Pod。当你创建一个 Service 时,Kubernetes 会为该 Service 创建一个 Cluster IP,用于在集群内部进行访问,而且这个 IP 只能在集群内部进行访问。因此,在默认情况下,如果你通过集群外部的 IP 直接访问 Service,是无法成功的。 如果你希望从集群外部访问 Kubernetes 中的 Service,可以使用 Kubernetes Ingress 或者 NodePort 来实现。其中,Ingress 可以将多个 Service 绑定到同一个域名下,并通过反向代理来转发请求;而 NodePort 可以将 Service 暴露在 Kubernetes Node 的 IP 和一个固定的端口上,从而可以通过 Node 的 IP 和端口来访问 Service。 在腾讯云上部署 Kubernetes 时,你可以使用 TKE Ingress 或者腾讯云负载均衡来实现 Ingress 的功能,也可以使用腾讯云 CLB 来实现 NodePort 的功能。具体来说,你需要在创建 Ingress 或者 Service 时,配置相应的 annotations 或者标签,来指定使用 TKE Ingress、腾讯云负载均衡或者 CLB。例如,你可以使用以下 annotations 来创建一个 Ingress,并通过腾讯云负载均衡来实现 Ingress 的负载均衡功能: ``` apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: example-ingress annotations: ingress.cloud.tencent.com/group-name: "example-group" # 指定负载均衡器的分组名称 ingress.cloud.tencent.com/load-balance-id: "lb-xxxxxxxx" # 指定负载均衡器的 ID spec: rules: - host: example.com http: paths: - path: /foo backend: serviceName: example-service servicePort: 80 ``` 这样,在创建 Ingress 对象时,Kubernetes 会自动创建一个负载均衡器,并将请求转发到后端的 Service 上。需要注意的是,不同的云平台提供的负载均衡器的配置方式和限制可能不同,具体可以参考相应的文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值