流量治理架构对比:当Kmesh遇上Ambient Mesh

news/2024/12/20 14:14:59/文章来源:https://www.cnblogs.com/huaweiyun/p/18619167

本文分享自华为云社区《流量治理架构对比:当Kmesh遇上Ambient Mesh》,作者:云容器大未来。

Kmesh是业内首个内核级流量治理引擎,Kmesh创新性地将服务治理卸载到内核eBPF和中心代理。Kmesh目前有两种工作模式:Kernel-Native 和 Dual-Engine模式。

 

Kernel-Native模式,Kmesh将流量治理完全下沉操作系统内核,通过eBPF和可编程内核模块对流量进行治理,在整个服务访问链路上不会增加任何多余的连接跳数,提供极致的性能体验。当然Kernel-Native模式对操作系统内核有一定的要求,比较适合对性能有极致要求的用户。 

今天重点谈的是Dual-Engine模式(本文后续均以Kmesh指代),这是一种分层的流量治理架构,它是通过eBPF程序拦截应用流量,并根据用户策略进行路由、负载均衡等四层的治理;七层治理则采用中心式代理,这样既可以保证七层治理需求的多样性和扩展性,又避免了Sidecar架构中,流量两次进出七层代理的复杂性。Kmesh Dual-Engine的架构如下图所示:

Kmesh Dual-Engine架构

Ambient Mesh是Istio社区2022年推出的一种Sidecarless架构,其目的也是为用户提供资源开销更小的网络基础设施。Ambient也是采用分层的流量治理,其中节点上,用户态组件ztunnel负责拦截进出应用的流量,并进行四层转发;中心侧通过waypoint进行七层流量的治理,同样可以做到灵活、按需部署。

Ambient Mesh架构

我们可以看到Kmesh和Ambient Mesh在架构上非常相似,两者均采用了四七层分离的流量治理架构。然而不同之处在于,Ambient Mesh流量的拦截和转发依靠节点级用户态ztunnel,而Kmesh则依靠eBPF。ztunnel工作在用户态,因此应用发送的流量首先经过iptables的拦截,进入本机协议栈处理一次,发送到ztunnel,而经过ztunnel处理后,再发起第二次连接。同理在服务端,流量也会先被拦截到ztunnel,再次发起连接,然后经由本机协议栈发送到应用进程。

 

但是Kmesh对应用流量的拦截和转发,则是通过eBPF程序在socket的不同钩子点完成,整个过程没有增加多余的连接,因此每次通信过程比Ambient Mesh少两条连接。说到这里就不得不提一下Kmesh的设计初衷了。

Kmesh设计之道 

当前用户在考虑服务网格落地时最担心的几个典型问题是:

  1. 网格基础设施不够可靠,运维复杂,因为过多的中间点出现在服务的访问链路中,服务访问被不同的连接管道串联, 故障定位变得复杂

  2. Sidecar带来的CPU、内存资源开销不可忽视

  3. 网格无法独立升级,它的生命周期与应用绑定,升级过程伴随着应用重启

  4. 基础设施代理额外的服务访问时延增加

 

Kmesh重点考虑了以上问题并结合用户对网格的基本诉求,定义了五大设计原则:

  1. 极简运维,打造足够可靠、轻量、解耦的网络基础设施,尽量的减少用户的维护成本。

  2. 高性能,微服务架构下,服务的调用拓扑一般都很长,有的请求甚至有10+次调用链,因此必须保证在绝大多数情况下,小于1ms的时延。

  3. 低开销,底层网络基础设施占用的CPU、Memory相对于业务容器应该足够小,并且不会随着业务容器的规模而大幅增加。

  4. 扩展性,为应对不同的协议治理,必须从架构层提供足够的扩展能力

  5. 高安全,构筑零信任安全的能力,为用户提供全链路可信保障

Kmesh五大设计原则

Kmesh与Ambient Mesh性能对比  

几个月前,我们将Kmesh v0.5.0与Ambient Mesh v1.22.1在测试环境下(kind集群)进行过对比,只比对了两者在处理L7流量治理的场景下的时延,结果显示,Kmesh的端到端时延较Ambient Mesh提升25%左右

Kmesh与Ambient v1.22对比

我们把这个结果汇报给了CNCF TAG-Network以及Istio社区,他们希望在真实的Kubernetes集群以及用最新的版本进行全面的测试。所以我们重新做了完整的测试。

测试环境

我们在华为云香港Region创建了一个Kubernetes 1.30标准版集群,并且纳管了三个Worker节点(Ubuntu 22.04, 规格为4U 16G)。

  • 集群中安装Istio 1.24.1 Ambient模式,以及Kmesh最新版本

  • 集群中部署了Fortio测试工具,无资源限制,其中Fortio-Client与Fortio-Server均为单副本,分别部署在不同的节点

  • 七层代理waypoint按需部署,在Kmesh和Ambient测试中,均与Fortio-Server部署在同一个节点,保证两者拓扑一致

  • waypoint 规格2核1G

  • Fortio测试采用连接复用,并发连接数(1,2,4,8,16,32,64,128)

最大吞吐量

L4治理吞吐

四层服务治理,Kmesh的最大吞吐与基线(没有任何治理)基本一致,Kmesh的吞吐能力是Ambient Mesh的两倍左右。这里主要是因为,Kmesh的采用eBPF随流治理,不会增加访问路径的长度,而Ambient Mesh在客户端和服务端两个节点分别多了一个ztunnel用户态代理,导致流量路径多了两条连接。

L7治理吞吐

L7治理吞吐放大图

七层服务治理,Kmesh与Ambient吞吐量均比基线差,因为两者均多了一层七层Envoy代理。但是Kmesh的吞吐大概是Ambient Mesh的1.3倍,这里还是得益于Kmesh的治理路径上少了两次用户态代理,减少了数据的用户态和内核态拷贝次数以及协议栈处理的次数。

服务治理时延

我们选取了在固定QPS 1024下,分别测试Kmesh和Ambient Mesh的L4和L7治理的时延。

 

L4服务治理时延测试

可以看到Kmesh的L4治理相比于基线,基本上没有增加额外的时延开销,而Ambient Mesh在并发连接数比较高的时候,增加了大概1.5ms的时延。可能是由于ztunnel在新版本引入了连接池导致。

 

L7服务治理时延测试

我们可以看到在并发连接数低时,Kmesh与Ambient Mesh的七层治理时延增加非常少,在小于8并发的时候,Kmesh的时延小于1ms,Ambient Mesh的时延不可预测性更大,其P99时延甚至增加8ms。

 

随着并发连接数增加,Kmesh和Ambient Mesh的时延均增加。但是在小于32并发时,Kmesh的P99时延比Ambient Mesh好两倍多。在更高128并发时,Ambient Mesh的表现似乎更优一些,但是差距不大。

 

在笔者看来,造成以上结果的原因,主要有两点:

  1. Waypoint采用Envoy实现,当前测试中Envoy均启动两个worker线程并发处理。Envoy的线程间不共享任何状态和数据以避免锁冲突,但是同时带来了负载不均衡和延迟不稳定的问题。

  2. ztunnel的实现中增加了连接池的优化,虽然连接复用可以在高并发时节省一些连接资源,但是也可能带来额外的不稳定时延。

 

CPU和内存

Kmesh在节点流量治理采用了eBPF,没有用户态进程,所以引入的资源开销非常小,详细请参考:https://kmesh.net/en/docs/performance/resource_consumption/

而在最大吞吐量测试时,ztunnel的CPU占用率与Fortio应用基本一致,大概100%的CPU占用,而通过bpftop工具可以查看Kmesh的bpf程序CPU利用大概在10%左右,从CPU利用率上来说Kmesh优于Ambient 10 倍

 

数据面内存:在测试中,ztunnel占用的内存保持在10M+,相对比较稳定,Kmesh数据面的内存占用主要在BPF Map的内存分配,当前Kmesh使用的BPF Map已经采用按需分配,因此在测试过程占用的内存更少,小于5M。

测试感悟与总结  

本次测试,我们主要在时延和吞吐两个维度对Kmesh和Ambient进行了一定比较,总体来说Kmesh的性能略胜一筹。

  • 四层流量治理场景下,Kmesh的性能与基线基本保持一致,全面优于Ambient Mesh。

  • 七层治理的场景下,我们看到无论是Kmesh还是Ambient Mesh性能衰减还是比较大,而且也具有一些不稳定的延时。七层代理Waypoint是端到端访问的性能瓶颈,受限于其多线程无锁的设计,在高并发场景下,Envoy的资源分配以及参数调教对性能的影响很重要。

 

另外技术的对比不应该只局限在一些性能参数指标,还应该关注可靠性、运维的便捷性。服务访问链路就像是由多条管道连接起来的输水管,每一个接口连接就相当于一个用户态组件。输水管道中,接口连接处最容易漏水,而服务访问中同样如此,由于不同的代理组件接收、处理及发送数据的速度不一样,因此不同的代理设置不同的连接Buffer,不同的超时,不同的连接池等等参数。越多的连接级联,意味着越多的不可靠因素和风险存在。

 

Kmesh在设计之初就重点考虑了极简运维和高可靠性,Kmesh尽可能地将流量治理下沉,尽量减少连接的跳数,从下图可以看出,Kmesh在服务访问链路上连接跳数比Ambient Mesh少2条,这大大降低了用户在故障后问题定位的复杂度。将节点的流量治理下沉OS内核的另一个好处是,Kmesh在控制面升级时或者重启时,即使BPF程序更新,也不会导致业务的连接中断。而节点级用户态代理,天然不具备升级重启不影响业务通信的能力。

如何使用Kmesh/加入社区贡献  

社区地址:https://github.com/kmesh-net/kmesh

安装试用:https://kmesh.net/en/docs/setup/quickstart/

参考链接

1. 实验步骤:https://github.com/hzxuzhonghu/playground/tree/main/performance_test

2. https://kmesh.net

3. https://istio.io/latest/blog/2022/introducing-ambient-mesh/

4. https://jimmysong.io/blog/introducing-kmesh-kernel-native-service-mesh/

 

点击关注,第一时间了解华为云新鲜技术~

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

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

相关文章

ISUP协议视频平台EasyCVR在网页端播放RTSP流对带宽有什么要求?

在现代网络监控系统中,RTSP流的播放是一个关键的技术环节,它涉及视频的实时传输和监控。然而,由于RTSP流的播放在网页端存在一定的技术挑战,需要考虑多种因素,如视频分辨率、编码格式、帧率等,这些因素都会对带宽产生影响。 本文将详细介绍这些因素如何影响带宽需求,并探…

字符串部分语法内容(更新中

字符串部分语法内容 一.字符与ASCII码 1.字符 Q:字符串的作用 A:在日常使用中,我们需要计算机帮我们处理各种各样的文字,比如写文档,写代码,各种文字记录在计算机中,就需要用到字符串或者字符数组将文字内容存储在计算机中。 字符串由字符组成,字符是单引号包含的一个字…

Java项目实战之基于springboot+vue+mysql+jpa+redis的企业网站搭建设计文档设计与实现

一、引言 1.1 项目背景 随着互联网的飞速发展,企业网站已成为企业展示形象、推广产品和服务、与客户沟通的重要窗口。为了提升企业的竞争力,需要构建一个功能完善、用户体验良好的企业网站。 1.2 项目目标 本项目旨在打造一个专业、高效、易用的企业网站,满足企业在品牌展示…

2024 新版Pycharm安装使用教程(附激活至2099年,以及常见问题处理)

Pycharm 简介 Pycharm 是一款非常强大的Python集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。 下面这种方式仅供交流学习,如果有能力还请支持正版 下载安装 为了方便,也可以去链接取 点击获取安装包开始安装下…

OpenCL 编程步骤 4. 创建命令队列 Command Queue

转载 https://deepinout.com/opencl/opencl-basic-tutorials/opencl-create-command-queue.html 在OpenCL上下文中,有内存、程序和内核对象,对这些对象的操作就需要使用命令队列。一条命令就是主机发送给设备的一条消息,用来告诉设备执行一个操作。这个操作包含主机与设备间…

Java线程 interrupt 方法使用异常

背景 需要在异步任务中中断任务的执行,故选择通过调用 interrupt 方法对线程设置中断信号。 在比较耗时的业务代码增加判断 Thread.currentThread().isInterrupted() 抛出异常停止任务执行,并回退任务。 问题 中断信号发出后,任务线程一直未检测到中断信号状态。 以下为测试…

人员检测视频分析服务器安装网络监控系统时有哪些常见的技术挑战?

在构建一个高效、可靠的网络监控系统时,技术人员需要面对一系列技术挑战,这些挑战覆盖了从系统集成到信息安全的各个环节。随着技术的不断进步,尤其是在人工智能和物联网技术的推动下,安防监控系统变得更加复杂和强大。以下是在安装网络监控系统时可能遇到的一些常见技术挑…

六款电脑端简单好用的时间管理app对比推荐

今天分享六款压箱底的时间管理app,简单且好用,让你从此不再拖延!因为我平时工作用Windows电脑比较多,所以主要介绍可以在Win电脑端使用的,部分app还支持在手机端实时同步! 1、微软待办todo 微软生态系统集成,“我的一天” 可将今日任务展示于首页及 Widget 小组件。 “建…

jellyfine套件登录忘记密码

1.ssh登录群晖,管理员模式,进入蓝色路径 var--config---system.xml 2. 用vim命令修改文件内容将<IsStartupWizardCompleted>true</IsStartupWizardCompleted>改成<IsStartupWizardCompleted>false</IsStartupWizardCompleted>重启jellyfin ,重新初始…

排查Java进程占用CPU高的原因

背景 一般java程序占用cpu内存都不会太高,出现占用高的情况,第一反应就是,进程在某个地方死循环了。排查top -Hp 15057 查看下进程中的线程资源占用情况由上图可见,CPU时间片主要是被15393 这个线程给吃掉了, 所以目标锁定在 15393。 执行 printf "%x\n" 15393,…

Java 项目愚蠢的分层及解决方案

《整洁架构之道》的最后一章《细节决定成败》又在讨论 Javaer 永恒的问题:分层后 DAO Service Controller 应该按功能分包还是按层分包。 按功能分包的人认为这些文件在业务上是一起的,应该放在同一个包。按层分包的人认为每个层代表了不同的技术,应该按层分包。 可以想象,…

JS信息收集

引子:上一篇所介绍源码信息收集,主要针对目标站点不可见的后端源码进行收集,往往能收集到的概率小但危害较大。而本篇则介绍针对前后端分离&前端Web的JS的信息收集,由于源码本身可见,因此收集重点从源码转为源码中的敏感信息。免责声明:本文章仅用于交流学习,因文章…