基于DPU与SmartNIC的K8s Service解决方案

1.  方案背景

1.1. Kubernetes Service介绍

Kubernetes Service是Kubernetes中的一个核心概念,它定义了一种抽象,用于表示一组提供相同功能的Pods(容器组)的逻辑集合,并提供了一种方式让这些Pods能够被系统内的其他组件发现并访问。简单来说,Service提供了一种让客户端能够稳定地连接到后端Pods的机制,即使这些Pods会动态地创建、销毁或迁移。

Kubernetes Service主要特性和用途

服务发现:Service允许客户端(如Pods中的应用程序)通过稳定的IP地址和端口号访问后端Pods集合,而无需关心实际Pod的IP地址或端口号,因为这些信息可能会因为Pod的重启或迁移而改变。

负载均衡:Kubernetes会自动在Service后面创建的Pods之间分配进入的流量,实现了简单的负载均衡。这意味着当多个Pods提供了相同的服务时,客户端的请求可以被均衡地分发到这些Pods上。

支持DNS:Kubernetes支持基于DNS的服务发现,允许Pods通过服务名(而不是IP地址)来相互通信。这大大简化了服务之间的调用和依赖关系的管理。

定义服务类型:Service可以有多种类型,最常见的是ClusterIP(默认,仅集群内部可访问)、NodePort(通过集群中每个节点的静态端口暴露服务)、LoadBalancer(在Cloud环境中,使用云提供商的负载均衡器暴露服务)和ExternalName(将服务映射到DNS名称,而不是选择Pods)。

在Kubernetes集群中,kube-proxy作为Service的代理组件,负责实现集群内部及外部对Service的访问。kube-proxy通过监听Kubernetes API Server中的Service和Endpoint资源变化,动态地在每个节点上配置网络规则,确保对Service的请求能够被正确地路由到后端的Pod实例上。

在iptables 模式下,kube-proxy会在每个节点上通过iptables规则来实现请求的转发。它会创建一系列的iptables规则,这些规则根据Service的IP和端口,将访问Service的流量重定向到后端的Pod IP和端口上。这种方式简单直接,但随着Service和Pod数量的增加,iptables规则会急剧膨胀,影响性能。

作为iptables的改进,ipvs(IP Virtual Server)模式提供了更高的性能和更好的扩展性。ipvs使用更高效的哈希表来管理网络规则,可以更快地查找和转发流量。这使得在大规模集群中,Service的访问性能得到显著提升。

1.2. 问题与挑战

尽管kube-proxy在大多数基础场景中表现良好,但它也存在一些明显的局限性:

1、场景简单:kube-proxy主要适用于简单的网络拓扑结构,对于复杂的IaaS(Infrastructure as a Service)场景,如需要支持VPC(Virtual Private Cloud)网络隔离、灵活的EIP(Elastic IP)使用等高级网络功能时,显得力不从心。

2、性能瓶颈:由于kube-proxy的报文转发完全依赖于软件实现(无论是iptables还是ipvs),这意味着它无法利用现代硬件(如DPU、SmartNIC)进行网络加速,在高负载跨节点转发的情况下,这种软件实现的性能瓶颈尤为明显。

3、资源消耗:基于软件实现的Kubernetes Service,在高负载跨节点转发的情况下会导致CPU资源消耗过高,从而影响整体系统的稳定性和性能。

与kube-proxy相似,许多开源的容器网络接口(CNI)插件,如使用Open vSwitch(OVS)的kube-ovn、Antrea等,通常依赖于自己的数据面处理机制来转发Service网络流量,在没有硬件加速的情况下,也面临类似的性能瓶颈和资源消耗问题。

2. 方案介绍

2.1. 整体架构

本方案基于DPU&SmartNIC实现了Kubernetes Service的解决方案,简称“驭云Service”。

驭云Service在驭云SDN的架构中实现,其中驭云SDN通过ovn/ovs机制将DPU&SmartNIC加入到同一个ovn集群,对网络进行统一的虚拟化,整体物理架构图如所示:

在Pod/裸机/VM接入DPU卡或SmartNIC卡后,用户的请求由Service处理后送往对应的Pod/裸机/VM。

软件整体架构如下:

如图所示,驭云Service基于驭云SDN,上图各个组件中均会参与处理Service的逻辑,下面分别进行介绍:

ycloud-controller,是SDN系统的控制平面,处理Service的主要逻辑,将用户创建的Service数据通过ovn转换成实际的网络拓扑。

yusurService-controller,处理用户创建的YusurService资源,翻译成内置Service资源给ycloud-controller使用。

ycloud-cni,该组件作为一个DaemonSet运行在每个节点上,是SDN的CNI接口,同时也会负责各个节点上Service的一些处理逻辑。

注:驭云SDN参见《基于DPU与SmartNIC的云原生SDN解决方案》

2.2. 方案描述

在驭云SDN的概念中,所有后端资源,无论是Pod、VM还是裸金属服务器,都属于某一个VPC(虚拟私有云)。VPC实现了逻辑隔离的网络空间,这意味着不同VPC内的网络流量不会相互干扰,这提供了重要的安全边界,同时也便于多租户环境中的资源管理和隔离。然而,这种隔离也带来了一个挑战:如何允许不同VPC之间或者外部网络访问这些VPC内的资源。

Service需要解决的就是从不同地方经过Service访问到这些VPC内的资源,并且根据策略进行请求的负载均衡。在驭云Service中,具体包含以下场景:

集群内部互通(ClusterIP类型Service)

场景①:客户端在集群VPC内,访问同VPC下的后端服务:

在这种情况下,客户端可以直接通过Service的ClusterIP访问后端服务。ClusterIP是一种虚拟IP地址,由Kubernetes为Service分配,只在集群内部可见。流量在VPC内直接转发,无需经过额外的网关或负载均衡器。

场景②:客户端在集群节点上,访问默认VPC下的一组后端服务:

当客户端运行在集群节点上时,它同样可以通过ClusterIP访问服务。Kubernetes的网络策略确保流量在节点和后端服务之间正确路由。这种访问方式同样限于集群内部,不需要EIP。

集群外部访问集群内(LoadBalancer类型Service)

场景③:客户端在集群外部,通过EIP访问一个VPC下的一组后端服务:

在此场景下,客户端通过云外访问集群内的服务。LoadBalancer类型Service会分配一个EIP,此时外部流量通过EIP被路由到集群内部的Service。

场景④:客户端在集群外部,通过EIP访问多个VPC下的一组后端服务:

当客户端需要访问跨多个VPC的服务时,情况变得复杂。在这种情况下,当外部流量通过EIP进入集群内Service时,Servcie会同时充当网关,将流量正确地路由到目标VPC。

本方案主要从控制面和数据面2各方面进行介绍。

2.2.1. 控制面

在控制层,我们对原生Service进行了封装,在Kubernetes基础上扩展了对Service的管理能力,整体控制面结构如下图所示:

Service和Endpoint是Kubernetes内置资源。资源Service定义了构造一个Service的基本信息。

由于内置资源无法满足我们需要功能,包括网络访问场景,和多种后端,于是驭云Service增加了YusurService与NetworkProbe两种自定义资源定义(CRDs):

YusurService: 一种扩展的Service概念,允许定义更广泛的后端资源,包括Pod、VM、BM(裸金属服务器)、VNicIP(虚拟网络接口IP)。通过使用选择器(selectors),可以灵活地匹配不同类型的后端资源,而不仅仅是Pod。支持定义多种网络场景,灵活的指定eip和clusterIP等。

NetworkProbe: 用于健康检查的新CRD,为每个后端资源生成相应的探针,实时监控其健康状态。这可以确保负载均衡器只将请求转发给健康的实例。

用户只需要和YusurService进行交互,yusurService-controller会根据YusurService的信息创建Networkprobe,Endpoint和Service这3种资源。

Service包含网络配置的大多基本信息,Endpoint资源包含本次配置的所有后端;Networkprobe返回后端健康检查结果,yusurService-controller会根据Networkprobe的返回结果调整Endpoint所包含的健康后端。

yscloud-controller则会根据Endpoint和Service的信息通过ovn绘制出整个网络拓扑,打通网络通路。

通过这样的架构,系统不仅提供了高级别的抽象来简化Service管理和后端资源的健康监控,还实现了跨VPC的负载均衡,增强了Kubernetes集群的网络功能。

2.2.2. 数据面

Service的数据面依赖OVN和OpenVswitch,根据不同的访问场景,在不同的地方配置Load_Balancer,Load_Balancer是OVN的逻辑概念,可以应用在OVN的逻辑交换机或者逻辑路由器上面,它将在对应的地方上配置DNAT的规则,将访问VIP的报文转到合适的后端上去。

下文分别针对控制面中所描述的4种Service使用场景进行说明。

2.2.2.1 同vpc下访问资源

当创建了Service之后,LoadBalancer的网络策略会确保应用在vpc1内的所有Subnet上。当subnet3上的client访问10.0.0.100时,其请求将首先被subnet3上的LoadBalancer接收。LoadBalancer会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址。数据包随后会通过vpc1被转发到选定的Pod所在的Subnet,例如subnet1,最后转发至Pod1。

2.2.2.2. 从集群节点上访问vpc内资源

当集群节点上的client访问10.0.0.100时,报文经过node-interface进入subnet0,经过LoadBalancer将数据包的目标地址转换为所选Pod的实际IP地址后,通过ovn-cluster到对应subnet,完成一次转发。

2.2.2.3.从集群外部访问同一个vpc内资源

当创建了Service之后,LoadBalancer的网络策略会应用在vpc1上,当client访问200.0.0.100时,其请求将首先被这个EIP子网所属的eipGateway接收。eipGateway会将报文路由到Servic所属的VPC,vpc1内,此时LoadBalancer规则会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址。数据包随后会通过vpc1被转发到选定的Pod,完成一次转发。

2.2.2.4.从集群外部访问多个vpc内资源

当创建了Service之后,控制器会创建一个service-gateway的逻辑路由器,LoadBalancer的网络策略会应用在该路由器上,当client访问200.0.0.100时,其请求将首先被这个eip子网所属的eipGateway接收。eipGateway会将报文路由到service-gateway上,此时LoadBalancer规则会基于其算法(例如轮询、最少连接数等)选择一个后端Pod,并将数据包的目标地址转换为所选Pod的实际IP地址,源地址转换为所选service-gateway的系统IP地址。数据包随后会被转发到选定的Pod的vpc上,然后vpc将数据包送到Pod,完成一次转发。

3. 方案测试结果

3.1. 创建Service

创建一个带有特定选择器和端口映射的Service YAML文件ysvc1.yaml,如下:

apiVersion: iaas.yusur.io/v1

kind: YusurService

metadata:

 name: ysvc1

spec:

 type: ClusterIP

 scope: vpc

 vpc: vpc1

 ports:

   - port: 5001

     name: iperf

     protocol: TCP

     targetPort: 5001

 selector:

   svc: svc1-ep

使用kubectl apply -f ysvc1.yaml命令创建Service。

使用kubectl get ysvc ysvc1检查Service,如下:

访问Service clusterIP,访问成功。

图中的netns为service后端同vpc下的一个pod,10.233.46.185为service的clusterIP,5001是service暴露的端口。

3.2. 性能对比

3.2.1 Pod的带宽

带宽单位Gbits/s。

测试用例

驭云卸载方案

未卸载方案

1

物理节点之间基准测试

163

166

2

物理节点访问后端在远端的Service

152

130

3

Pod访问后端在远端的Service

151

138

从上面测试数据得出以下结论:

1.       卸载模式下,驭云访问远端Service能够达到接近物理机的带宽。

2.       卸载模式比非卸载在带宽上性能提升了20%左右。

3.2.2 Pod的pps

pps单位为Mpps。

测试用例

驭云卸载方案

未卸载方案

1

物理节点之间基准测试

45

45

2

物理节点访问后端在远端的Service

25.5

12.1

3

Pod访问后端在远端的Service

24.5

12.2

从下面数据得出以下结论:

1.       卸载模式下,驭云访问远端Service能够达到接近物理机的60%pps。

2.       卸载模式比非卸载在pps上性能提升了2倍以上。

3.2.3 Pod的延时

延时单位为us。

测试用例

驭云卸载方案

未卸载方案

1

物理节点之间基准测试

32

32

2

物理节点访问后端在远端的Service

33

48

3

Pod访问后端在远端的Service

33

44

从上面测试数据得出以下结论:

1.       卸载模式下,驭云访问远端Service能够达到接近物理机的延迟。

2.       卸载模式比非卸载在延迟上降低了20%以上。

3.2.4 RPS

单位为Requests/s。

测试用例

驭云卸载方案

未卸载方案

1

物理节点之间基准测试

15999

2

Pod跨节点访问Service

15139

11040

从上面测试数据得出以下结论:

1.       卸载模式下,驭云访问远端Service能够达到接近物理机的rps。

2.       卸载模式比非卸载在rps上提升了40%左右。

3.2.5 每条request的CPU指令数以及CPI

每条request的CPU指令数,单位为instructions/request。

测试用例

驭云卸载方案

未卸载方案

Pod跨节点访问Service

122,613

171,405

CPI,单位为cycles/instruction。

测试用例

驭云卸载方案

未卸载方案

Pod跨节点访问Service

1.94

1.69

从上面测试数据得出以下结论:

1.       一个请求消耗的CPU指令数量,卸载模式比非卸载模式降低30%左右。

2.       在CPI方面,卸载模式比非卸载模式增大了15%左右。

3.       综合消耗的CPU指令数量来看,对CPU的消耗减少了25%左右。

4. 优势总结

基于DPU和SmartNIC的K8s Service解决方案展现出显著的优势,具体总结如下:

① 支持复杂网络拓扑与高级功能

在复杂的网络拓扑下实现K8s Service,支持VPC网络隔离和EIP等高级网络功能,大大增强了Kubernetes集群在IaaS环境中的网络灵活性和安全性,满足复杂场景下的网络需求。

② 显著提升K8s Service性能

根据测试数据,本方案在带宽上性能提升了20%左右,pps上性能提升了2倍以上,延迟降低了20%以上。DPU和SmartNIC内置了强大的网络处理引擎,能够直接在硬件上完成报文的解析、转发和路由决策等任务,这种硬件加速机制使得在高负载跨节点转发时,仍能保持低延迟和高吞吐量,显著提升了Kubernetes Service的性能。

③ 降低资源消耗与优化系统性能

根据测试数据,本方案对CPU的消耗减少了25%左右。由于DPU和SmartNIC承担了大部分的网络处理工作,CPU从繁重的网络转发任务中解放出来,可以专注于执行其他更关键的计算任务,这不仅降低了CPU的资源消耗,还提升了整体系统的稳定性和性能。

综上所述,基于DPU和SmartNIC的K8s Service解决方案在应对复杂网络拓扑、性能瓶颈和资源消耗等方面具有明显的优势,能够显著提升Kubernetes集群在复杂IaaS环境中的网络性能和整体稳定性。

本方案来自于中科驭数软件研发团队,团队核心由一群在云计算、数据中心架构、高性能计算领域深耕多年的业界资深架构师和技术专家组成,不仅拥有丰富的实战经验,还对行业趋势具备敏锐的洞察力,该团队致力于探索、设计、开发、推广可落地的高性能云计算解决方案,帮助最终客户加速数字化转型,提升业务效能,同时降低运营成本。

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

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

相关文章

python-uinput虚拟输入

文章目录 python-uinput虚拟输入背景库简介:什么是python-uinput?安装指南:如何获取这个强大的工具?快速上手:五个核心函数的介绍与使用1. 创建虚拟设备2. 模拟键盘输入3. 模拟鼠标移动4. 模拟鼠标点击5. 模拟触摸屏操…

嵌入式全栈开发学习笔记---Linux系统编程(进程间通信)

目录 进程间通信概述 进程通信目的 进程间通信的发展 进程间通信分类 管道通信 无名管道 有名管道mkfifo() 信号 发送信号kill & raise 忽略信号signal() 发送信号alarm() 消息队列 消息队列使用的步骤 创建消息队列msgget() 读写消息队列msgrcv()/msgsnd()…

【C语言】十六进制、二进制、字节、位、指针、数组

【C语言】十六进制、二进制、字节、位 文章目录 [TOC](文章目录) 前言一、十六进制、二进制、字节、位二、变量、指针、指针变量三、数组与指针四、指针自加运算五、二维数组与指针六、指向指针的指针七、指针变量作为函数形参八、函数指针九、函数指针数组十、参考文献总结 前…

高经费打造的史诗级视觉盛宴,惊叹于每一帧的奢华

8月29日,备受期待的《指环王:力量之戒》第二季终于上线了。这一季一上架就放出了三集,立刻引发了影迷们的热烈讨论。 自从2022年首季首播以来,《指环王:力量之戒》就一直备受瞩目。尽管首季受到了不少争议,…

【C++ Primer Plus习题】9.4

问题: 解答: main.cpp #include <iostream> #include "sales.h" using namespace std; using namespace SALES;int main() {Sales s1, s2;double de[QUARTERS] { 12.1,32.1,42.1,51.1 };setSales(s1, de, QUARTERS);showSales(s1);cout << endl;setSal…

springsecurity快速入门

Spring Security 是一个功能强大且高度可定制的安全框架&#xff0c;主要用于保护基于 Spring 的应用程序。它提供了一整套用于身份验证、授权、加密、会话管理等功能的工具和 API&#xff0c;从而帮助开发者快速、有效地保护应用程序。 Configuration EnableWebSecurity pu…

Hive 安装

目录 Hive 安装 Hive 安装地址 Hive 安装部署 安装 Hive 启动并使用 Hive Hive 安装 Hive 安装地址 1&#xff09;Hive 官网地址 Apache Hivehttp://hive.apache.org/ 2&#xff09;文档查看地址 GettingStarted - Apache Hive - Apache Software Foundationhttps://cwik…

“转移阻抗”?求你们不要再玩新梗了!

高速先生成员--黄刚 在SI这个行业待久了&#xff0c;Chris发现其实也蛮卷的&#xff0c;就好像前几周写的电容滤板半径这篇文章&#xff0c;最近一些和Chris很熟的网友也评论说&#xff1a;现在好好做设计&#xff0c;好好做仿真都不行啦&#xff1f;一定要发明一些听起来很高…

科研绘图系列:R语言多组极坐标图(grouped polar plot)

介绍 Polar plot(极坐标图)是一种二维图表,它使用极坐标系统来表示数据,而不是像笛卡尔坐标系(直角坐标系)那样使用x和y坐标。在极坐标图中,每个数据点由一个角度(极角)和一个半径(极径)来确定。角度通常从水平线(或图表的某个固定参考方向)开始测量,而半径则是…

VMS-WS-485使用简明教程(485通信类型变送器)

VMS-WS-485使用简明教程 该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 文章主要介绍485通信类型变送器的硬件连接、软件配置、数据读写以温湿度计算 1 硬件连接 2 软件配置 将变送器硬件部分正确连接后&…

物联网之云平台架构

一&#xff0c;一个典型的物联网云平台 一个典型的物联网&#xff08;IoT&#xff09;云平台需要实现多个功能&#xff0c;以支持物联网设备的接入、数据处理、设备管理、实时控制等需求。 &#xff08;一&#xff09;核心功能 1&#xff0c;设备接入与管理&#xff1a; - 设…

PE文件结构详解(非常详细)

最近在参考OpenShell为任务栏设置图片背景时&#xff0c;发现里面使用了IAT Hook&#xff0c;这一块没有接触过&#xff0c;去查资料的时候发现IAT Hook需要对PE文件结构有一定的了解&#xff0c;索性将PE文件结构的资料找出来&#xff0c;系统学习一下。 PE文件结构 Portable…

Java中类的成员介绍

我的后端学习大纲 我的Java学习大纲 4.类的成员&#xff1a; 3.1.类的成员 -> 属性介绍&#xff08;成员变量&#xff09;&#xff1a; a.语法格式&#xff1a; 1.修饰符 数据类型 属性名 初始化值 ;2.说明1: 修饰符 常用的权限修饰符有&#xff1a;private、缺省、prot…

【论文】A Collaborative Transfer Learning Framework for Cross-domain Recommendation

Intro 业界常见的跨域建模方案主要分为两种范式[22][32][5][36][17][14][20]&#xff1a;1) 将源样本和目标样本进行联合和混合&#xff0c;然后执行多任务学习技术&#xff0c;以提高在所有域中的性能&#xff1b;2) 使用混合或数据丰富的源域数据预先训练模型&#xff0c;然…

等保 2.0 Linux主机测评

以下结果以CentOS 7 为例&#xff0c;按照等保2.0标准&#xff0c;2021报告模板&#xff0c;三级系统要求进行测评。 一、身份鉴别 a)应对登录的用户进行身份标识和鉴别&#xff0c;身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换。 输入 more /etc/s…

三元里等你!融合三个经典模型!Transformer-LSTM-SVM多变量时间序列预测(Matlab)

三元里等你&#xff01;融合三个经典模型&#xff01;Transformer-LSTM-SVM多变量时间序列预测&#xff08;Matlab&#xff09; 目录 三元里等你&#xff01;融合三个经典模型&#xff01;Transformer-LSTM-SVM多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本介…

4个方法快速恢复电脑删除文件

随着电脑的普及&#xff0c;我们越来越多地将重要数据存储在电脑中。然而&#xff0c;数据丢失的风险也随之增加。当您意外删除文件、格式化硬盘或遇到系统崩溃等情况时&#xff0c;如何恢复丢失的数据成为了一个待解决的问题。 一、回收站恢复 首先&#xff0c;最简单的恢复方…

深入探索批处理中的变量与命令:从基础到高级

更多内容前往&#xff1a;孔乙己大叔 在Windows环境中&#xff0c;批处理&#xff08;Batch&#xff09;文件是一种非常有用的脚本工具&#xff0c;允许用户自动化重复性任务。通过编写批处理脚本&#xff0c;用户可以执行一系列命令&#xff0c;而无需手动输入每个命令。变量是…

vue 动态替换父组件

替换父组件&#xff1f;&#xff1f; 什么鬼&#xff1f;&#xff1f;&#xff1f; 这个场景的确很少见&#xff01;&#xff01;不过我们要说的的确是要替换父组件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 就是子组件内容不变但是父组件变…

node.js使用express框架实现api接口开发(从零开始,超简单可直接复制)

目录 一、效果图 二、实现 1、引入express框架依赖 2、 新建启动文件&#xff08;/server/index.js&#xff09; 3、新建接口函数文件&#xff08;/server/router.js&#xff09; 一、效果图 二、实现 1、引入express框架依赖 在项目文件夹根目录下&#xff0c;打开控制台…