陈梅 苏晨 赵静雅 高震宇
摘要:为推动目前现有开源5G核心网的进展,文章通过研究云原生5G核心网原型系统平台的构建,以达到现有网络功能的容器化实现。首先构建简易的开源5G核心网,通过Kubernetes(简称K8s)自带的四层负载均衡和七层负载均衡,验证模拟多并发时系统的负载均衡能力及扩缩容能力;将核心网通过所搭建的核心网的NGAP口STCP口的地址进行连接,进行整个系统的调试,通过冲石通信模拟器通过设置UE数目,仿真基站进行整个系统的可靠性测试。进行负载均衡验证,完成云化环境中的动态扩缩容算法的研究,以实现具备高可靠的云原生5G 核心网系统平台。
关键词:云原生;5G核心网;Kubernetes;动态扩缩容;负载均衡
中图分类号:TP393 文献标识码:A
文章编号:1009-3044(2022)15-0049-03
1 引言
全球目前已经进入5G时代,中国5G用户数量突破一亿,中国的5G商用取得了瞩目的成就。5G覆盖率大,传输速率、延迟、带宽均有不同程度的提升。随着2020年6月,3GPPR165G核心网标准冻结,5G标准的完善和商用的加速推进,对网络提出了更高的要求[1]。一方面,5G业务包含高速率、大连接和低时延等场景,将使移动通信深入到行业领域,业务的不确定性要求网络架构具备差异化服务和灵活的资源调度能力;另一方面,IT技术的快速迭代驱动网络不断变革,5G系统架构借鉴IT领域“微服务”的设计理念,采用服务化架构(SBA)将网络功能拆解为独立的NF(Network Function),对外提供自包含、自管理、可重用的网络功能服务,网络服务在业务功能上解耦,并通过统一类型的服务化接口实现调用,使网络具备敏捷部署、弹性伸缩和灵活编排能力[2]。随着容器化技术、Docker及Kubernetes(简称K8s)等技术的广泛应用,云原生技术走向成熟,其作为下一代云计算的核心组件,给出的体系和方法为网络建设提供了方向,其核心设计理念是网络架构服务化、软件架构微服务化,其网络云化本质是将电信网络和IT技术深度融合[3],從而降低成本,从软硬件解耦的虚拟化开始,软件通过虚拟化和硬件分离,之后通过统一云平台的资源池化[4],实现平台内的资源统一编排和调度,最后同各云原生的功能组件化,利用服务化架构,为上层应用提供服务。当前传统运营商的网络建设处在虚拟化到资源池化的优化阶段,从规划和部署情况看,仍面临多厂商烟囱式部署、统一云平台集成、网络自动化水平等多方面挑战,尚未充分发挥云化网络带来的全部优势[5-6]。所以对5G云原生部署有必要进行深入研究。
2系统工作原理
该系统通过将5G核心网元部署到Docker上,之后通过K8s中的Pod将Docker中运行的核心网镜像进行管控,对于5G核心网内部的工作原理由于过于冗长,且不是本文主要内容,所以不再进行解释。如果对AMF、SMF、UDR、AUSF的请求过多,会通过K8s中的HPA自动扩缩容进行Pod的增加或者减少,同时如果哪个节点出现问题,通过K8s自带的负载均衡算法也会将上面节点的Pod转移至其他的节点,在这里用一个master、两个node节点进行管控,通过将一个节点关闭调度,观察其中的Pod转移及新增Pod的情况。除此之外,通过一个新增的虚拟机对系统产生过多的激增请求,观察K8s基于HPA对新增的Pod节点的调度。
2.1系统工作流程图
2.2负载均衡
2.2.1四层负载均衡
使用IP+Port 接收,将其传输至相应的服务,并在传输层进行操作。客户端和服务器进行一次TCP连接。该算法类似于路由器的作用。主要是在四层和七层起作用,而四层和七层的概念来自OSI七层模型。该算法主要是利用DNS解析,通过Kube-Proxy实现。该算法默认解析到虚拟IP是一个Service服务,该虚拟IP通过Kube-Proxy将其均衡到各个不同的Pod上。Pod的IP不稳定,每次重启Pod后会随机改变,但Service的IP是稳定的,所以主要是通过Node Port暴露服务,使相应的Pod可以被外界所访问。Service根据Kube-Proxy不同的代理,展现出不同的性能。
1)User space模式
Service的请求会从用户空间进入内核,然后再返回用户空间,由 Kube-Proxy完成后端的选择和代理工作,但这样耗费的流量和资源十分巨大,导致性能急剧下降。需要注意的是:请求到达IPtables时会进入内核,而 Kube-Proxy主要作用是监听用户的工作状态。因此请求会相应形成从用户到内核再到用户的一个传递过程, 从而降低了服务性能,因此,User space 性能差。
2)IPtables模式
通过IPtables实现一个四层的TCP连接;Kube-Proxy负责创建IPtables 中NAT的相应规则,但不负责流量转发。这种基于IPtables的负载均衡操作简单,但是当集群规模大,导致请求响应变得特别多时,这种基于IPtables负载均衡的性能就会相应变差。当添加一个Service时,命令行工具需要从内核中读取当前所有的Service列表,然后重新编辑列表,之后再将内核中的列表进行更新。例如:假如要添加N个Service同时,相应的复杂度为 O(N^2) 。但是在转发面上,所有 Service IP 地址组成了一个list,每一个报文都需要查找这个list,找到相应的IP,才可以进行下一步操作。假如一个 IP在 list 末尾,就需要遍历 N 次,复杂度为 O(N/2)。
这种四层负载均衡也有一些缺点,缺点如下:
Service如果有很多,并且为了暴露端口供外面的主机访问,需要绑定Node的主机端口,外围的相应端口必须开放从而进行服务调用。为解决这个问题,比较通用的方式是通过一个外部的负载均衡器,例如Nginx,绑定相应的端口号,再根据相应的地址接口,向后面的Service IP进行一系列的转发操作。7ABD40FB-A7EB-4270-A803-81E2C2F84682
Service的同时存在着很多分发策略:例如轮询机制。将请求转发到后端的各个Pod中,由此衍生出了加权轮询,即给不同的Pod加入权重,帮助加速实现负载均衡。
2.2.2七层负载均衡
七层负载均衡主要来自现代通信的OSI七层模型中的第七层应用层,负载均衡器根据虚拟的URL和主机名接收或者发送请求,将请求进行相应的负载均衡处理后,进行相应转发,最终实现整个系统的负载均衡。
七层负载均衡通过建立两次TCP连接进行相应的负载均衡。客户到负载均衡器,负载均衡器依据于相关的请求中所传输的内容主要来自URL或Cookie中的信息,选择合适的负载均衡的算法,选择相应的服务器;建立负载均衡器到服务器之间的连接。但必须注意的是负载均衡设备需要先实现服务器和客户端建立TCP连接后,客户端发送的含有应用层内容的报文会被接受,系统会根据该报文中的特定字段,通过负载均衡设备设置的服务器选择方式,内部服务器会被最终确定,反向代理也由此而来。
Ingress 是K8s的一种资源对象,Ingress允许外部访问K8s服务,通过创建规则集合配置访问权限,这些规则定义了相应的服务被访问的权限设置,支持 HTTP 和 HTTPS 协议;Ingress 配置相应的URL访问设置、同时设立相关的主机名等一系列配置,促使系统正常运行。
七层负载均衡相较于四层负载均衡CPU占用率更高,但并不会导致服务器性能下降。七层负载均衡可以让负载均衡器做出更恰当的反应抉择,并通过相应操作对于相关内容进行优化,例如压缩、加密等。七层负载均衡同样可以利用buffering等一些操作卸载其他服务器的坏连接,从而提高性能。
Ingress-controller用来实现反向代理和负载均衡。
其主要作用方式为:通过监听相应API对象里的配置规则,转化成相应的配置,并对外部提供服务。
对于上述负载而言,还有若干种均衡算法:
第一种:轮询均衡。负载均衡器将任何一次来自客户端的请求轮流平均分配给其内部中的服务器,每次服务请求到达时,依次查找内部服务器,找到没有负载的服务器,这种算法在服务器配置均衡的情况下,大有裨益。
第二种:权重轮询均衡。由于每组组服务器中不同的服务器处理的性能有很大的差别,如果给每个服务器分配不同的权值,服务器可以因为不同的权值而规划相应的负载。
第三种:随机均衡(Random)。把来自网络的请求通过哈希等相关算法不均匀地分配给内部中的多个服务器。
第四种:最少连接数均衡。是指客户端的每一次服务请求在使服务器工作的时间大有不同,一旦工作時间变得更长,如果仅是简单地套用相关的轮询和随机均衡算法,不同服务器的会有极大不同,随之带来的负载均衡仍旧有很大的问题。
第五种:处理能力均衡。这种负载均衡算法是一种在七层负载下使用较多的均衡算法,该均衡算法的主要原理是依据相关的系统指标,将请求的服务分发给负载较轻的服务器,该指标包括服务器的处理性能和网络的拥塞情况,所以更因地制宜、性能更优秀。
3自动扩缩容协调机制
扩缩容算法主要分为自动扩缩容和手动扩缩容,由于手动扩缩容依赖于命令直接禁止一个节点的调度,从而将pod分配至其他节点,没有较多的内部原理,所以不再赘述,这里主要介绍基于HPA的自动扩缩容算法。
自动扩缩容协调:
自动扩缩容主要来自HPA(Horizontal Pod Autoscaler)控制器,而本文主要实现基于CPU使用率进行Pod扩缩容的功能。HPA控制器基于K8s master节点中的kube-contorll-manager服务启动参数和其中相关参数定义的探测周期,该周期默认为15秒,插件是系统在这个15秒的周期内不停地监测目标Pod的相关具体指标,得到指标后,再通过与HPA设置的扩缩容条件进行对比,如果满足条件,则系统会快速自动调整相应的Pod。
HPA工作原理:
本次毕业设计主要采用了Metrics-Server,该插件会持续采集所有Pod的指标数据,HPA控制器获取这些数据后,使用用户定义的扩缩容规则进行计算,得到目标Pod副本数量。当目标Pod副本数量与当前副本数量不同时,HPA控制器访问Pod的副本控制器发起scale操作,调整相应的Pod的副本数量,完成扩缩容操作。
控制器在得到Pod性能指标数据后,将计算出的Pod数量与当前数量相对比,具体算法公式如下:
[desiredReplicas=ceilcurrentReplicas*curentMetricValuedesiredMetricValue] (1)
结果向上取整。
异常情况如:
1)Pod正在被删除;
2)Pod当前指标未被获得;
3)若指标值为CPU利用率,则对于Ready状态的Pod不纳入指标。
HPA控制器在进行扩缩容时,系统会记录信息,控制器会选取得分最高的建议,让整个系统在缩容时更平滑,消除短时间内指标值快速波动的影响。除此之外,HPA还可以基于自定义指标进行自动扩缩容。需要使用Prometheus Adapter,Prometheus 用于监控应用的负载和集群本身的各种指标,Prometheus Adapter可以帮我们使用 Prometheus 收集的指标使用它们制定扩展策略,这些指标都是通过 APIServer 暴露的,而且 HPA 资源对象也可以直接使用。
4系统测试
本次主要通过CPU的利用率为指标进行自动扩缩容。想要实现Pod副本数量扩缩容,就必须使HPA控制器可以查看节点资源使用情况。7ABD40FB-A7EB-4270-A803-81E2C2F84682
输入命令:kubectl top node
输入命令:kubectl run php-apache --image=mirrorgooglecontainers/hpa-example --requests=cpu=200m --expose --port=80运行hpa-example,请求CPU的资源为200m,暴露一个80端口。
输入命令:kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
当deployment资源对象的CPU使用率达到50%时,就进行扩容,最多可以扩容到10个。
以上便生成了一个HPA控制器,可以用作自动扩缩容。
在K8s node1节点上,通过对于Pod进行死循环请求,同时请求可以得到:
如图4示;说明循环请求已经成功
查看Pod数量是否变化
while true; do wget -q -O- 10.99.60.48; done
如图5所示,创建其余的Pod并分配至其他节点,停止死循环请求一段时间后,发现Pod 数量回归至一个。
由图6可知,通过HPA可以将K8s中的Pod以CPU利用率为指标进行自动扩缩容。
在自动扩缩容中,通过metri-server获得CPU的利用率,内存利用率、硬盘读写等一系列指标由于无法衡量,所以通过CPU利用率,利用HPA将利用率过高的K8s node2节点中的相关请求Pod,通过复制调度部署到其他节点上,从而确保5G核心网的准确运行。
5结论
本文主要通过搭建Docker环境,通过Kubernetes在不同主机的管控下,利用虚拟机中Ubuntu18.4系统为主要环境,并在该环境上部署5G核心网元,并为每个网元通过分配IP和端口号外,接入基站测试,以实现简易的云原生5G核心网系统。构建5G核心网成功之后,通过研究K8s自带的负载均衡算法:四层负载均衡和七层负载均衡实现简易的负载均衡网元Pod扩展,实现5G核心网的基本功能,通过研究K8s的手动扩缩容和自动扩缩容,通过对于节点的禁止使用,实現K8s对于Pod的节点间转移,验证K8s对于5G核心网正常工作的保障。
参考文献:
[1] 黄震宁,李爱华,张昊,等.3GPP R16 5G核心网技术综述[J].移动通信,2021,45(1):85-89.
[2] 张艺鑫.5G通信技术应用场景与关键技术[J].信息记录材料,2020,21(12):182-183.
[3] 杨文强,王友祥,唐雄燕,等.面向云原生的5G核心网云化架构和演进策略[J].邮电设计技术,2021(3):12-15.
[4] 赛迪智库无线电管理研究所. 5G发展展望白皮书(2021)[N].中国计算机报,2021-03-01(8).
[5] 蒲泽宇.5G核心网AMF虚拟化及负载均衡平台设计与实现[D].北京:北京邮电大学,2020.
[6] 陈长怡,陆钢,周丽莎,等.基于云原生的轻量级5GC产品及关键技术[J].电信科学,2020,36(12):89-95.
【通联编辑:唐一东】7ABD40FB-A7EB-4270-A803-81E2C2F84682