天津储鑫盛钢材现货供应商 发表于 2022-11-23 04:00:47

深度解析KubeEdge EdgeMesh 高可用架构

摘要:通过高可用特性应用场景、高可用特性使用手册、课题总结、未来展望等四个部分的内容来向大家介绍新版本EdgeMesh的高可用架构。本文分享自华为云社区《KubeEdge EdgeMesh 高可用架构详解|KubeEdge云原生边缘计算社区》,作者:南开大学|达益鑫。
EdgeMesh项目解决了边缘计算场景下复杂网络的通信问题,中心化的edgemesh-server作为一个中继组件,协助其他节点进行网络穿透和流量中转。之前的edgemesh-server本身不具备高可用特性,会遇到性能瓶颈与单点故障问题,目前EdgeMesh v1.12版本的高可用架构不仅优化了上述问题,也带来了更加稳定的系统运行时,还覆盖了多种边缘网络的痛点场景,如分布式动态中继连接场景和私有局域网的网络自治场景等。此外,EdgeMesh 在v1.12中还带来了基于PSK密码的安全连接、对接HTTPS的边缘Kube API Endpoint等特性和能力,整体提升了EdgeMesh的性能、稳定性与安全性。
https://pic4.zhimg.com/v2-4040de1ca1c5cb8927968bb0b0e7c3c3_b.jpg作为开源之夏课题【EdgeMesh:高可用架构的设计与实现 】的实践者,这是我第一次接触开源社区相关的项目,非常有幸能深入地参与到KubeEdge开源项目的开发之中,也非常开心能够参与EdgeMesh高可用特性的方案设计与代码开发。我将通过高可用特性应用场景、高可用特性使用手册、课题总结、未来展望等四个部分的内容来向大家介绍新版本EdgeMesh的高可用架构以及我个人在KubeEdge社区的成长经历。
高可用架构的主要目的是为了保障系统的稳定性以及提升系统的整体性能,此次EdgeMesh的高可用特性在原有功能的基础上还覆盖了多种边缘网络的痛点场景。以下为EdgeMesh高可用特性在边缘计算场景下的具体应用场景,用户可以依据这些用例来理解本特性能提供的服务。
▍1.1 单点故障以及高负载场景

如图所示,当单个节点承担中继功能时,所有其他的节点都需要连接该节点才能够获取网络连接的服务。在这样的场景当中,单个节点的负载就会相应地增加,过高的通信负载或者是密集的连接数量,在诸多情况下是限制服务性能的主要原因,同时如果该节点出现故障则会导致中继连接断开,使得中继连接功能暂时性停滞。 为了能够优化这部分的问题,覆盖高负载访问场景,EdgeMesh 新版本考量使用分布式网络连接的思想,通过给予每一个节点能够提供中继功能的结构,使每一个节点都具有为其他节点提供中继的能力。针对这部分场景需求,用户可以在集群初始化时指定多个特定的节点作为默认的中继节点,依据自身情况调节集群内负载的分配,EdgeMesh将会在提供中继服务的时候,优先尝试连接这些节点;如果不做设置,EdgeMesh也会寻找合适的节点执行中继功能,分散减轻单个节点的中继访问负担。
▍1.2 分布式动态中继连接场景

如图所示,位于上海的边缘应用A和B通过中继互相通信,需要把流量转发到处于北京数据中心里的relay节点,数据传输在远距离的两地之间绕了一圈,导致服务时延较长,用户体验较差。非常遗憾的是,边缘计算场景下集群规模经常横跨多地或者是多区域部署,如果中继节点距离请求服务的节点非常遥远,就会造成极大的延迟,影响用户的体验。这个情况尤其是在中继连接对象与自己不在相邻地理位置下的时候,体现得尤为明显。
https://pic2.zhimg.com/v2-63719017de5bf42f377b45dc36989a31_b.jpg为了能够优化这部分的体验,覆盖远距离服务场景,EdgeMesh新版本考量就近中继的原则,用户可以根据集群节点的地理位置分布情况,支持选择一个地理位置适中的relay节点。当应用需要中继连接服务的时候,edgemesh-agent就会动态优先选择就近的relay节点作为中继来提供网络连接服务,以此缩短中继服务的时延。
▍1.3 私有局域网网络自治场景

如图所示,在老版本的EdgeMesh的代码实现中,edgemesh-agent必须保持与云上中继服务edgemesh-server的连接,当局域网内的节点离线后,导致edgemesh-agent断开与中继节点的连接,断连节点上的服务就彻底失去流量代理的能力了,这在部分私有局域网网络内或者是网络情况波动较大的环境当中会给用户造成较大的困扰。
https://pic4.zhimg.com/v2-e4888d85eeaef3b47d86b40be9ec0f37_b.jpg为了能够优化这部分的问题,提高网络应用连接的稳定性,EdgeMesh 新版本考量了分布式管理及网络自治的想法,让EdgeMesh能够通过mDNS机制保障私有局域网网络内或者是离线局域网内节点之间的相互发现和转发流量,维持应用服务的正常运转。针对这部分场景需求,用户并不需要再单独设置任何的参数来启用此功能,该功能一般面对两种情形进行服务维持:a. 在刚部署EdgeMesh的时候,部分节点就已经在私有局域网下,那这个局域网内的节点依旧可以通过EdgeMesh来相互之间访问和转发流量。
b. 在集群正常运转过程当中,部分节点离线后,这部分节点依旧可以通过EdgeMesh来维持相互之间的网络连接和流量转发。
▍2.1 基本原理介绍

在EdgeMesh v1.12版本中,社区将edgemesh-server的能力合并到了edgemesh-agent的EdgeTunnel模块当中,使得具备中继能力的edgemesh-agent能够自动成为中继服务器,为其他节点提供内网穿透和中继转发的功能,新老系统架构对比如下:
https://pic3.zhimg.com/v2-a77b74be87806eccaf34f7dd1509833e_b.jpgEdgeMesh高可用特性的主要实现原理是:当集群内有节点具备中继能力时,其上的edgemesh-agent会承担起中继节点的角色,来为其他节点提供内网穿透和流量中继转发的服务。在集群初始化或者是有节点新加入集群时,EdgeMesh系统会基于mDNS机制发现局域网内的节点并作记录,同时DHT机制会发现跨局域网的其他节点并对其发起连接建立请求,这样当集群内跨局域网的两节点需要连接的时候,中继节点就可以为它们提供流量中继和协助内网穿透的服务。
https://pic4.zhimg.com/v2-6242e1ee7e327612f80dee968ddc68a3_b.jpgEdgeMesh高可用特性的核心功能如上图所示,集群当中A节点与B节点通过R1中继节点连接来提供服务,当R1节点无法提供中继服务的时候,A、B节点可以通过高可用特性自动切换到中继节点R2并重新建立连接。在这个过程当中用户几乎感受不到网络连接的变化。接下来我将简单介绍不同情况下使用EdgeMesh高可用特性的方式。
▍2.2 部署时启用高可用特性

您可以通过以下配置方法,在安装EdgeMesh时启用高可用特性,配置过程当中您可以依据集群连接的需求配置中继节点的地址:
# 启用高可用特性
helm install edgemesh --namespace kubeedge \
--set agent.relayNodes.nodeName=k8s-master,agent.relayNodes.advertiseAddress="{1.1.1.1}" \
https://raw.githubusercontent.com/kubeedge/edgemesh/main/build/helm/edgemesh.tgz

[*]relayNodes 参数是中继节点表,类型为 []relayNode,您可以通过配置它来指定集群中应该承担中继节点角色的edgemesh-agent。
[*]relayNode.nodeName 参数使用节点名的方式来指定relay节点,这必须与K8s的节点名相同,您可以通过 kubectl get nodes 查看您的k8s节点名。
[*]relayNode.advertiseAddress 参数用于指定relay节点的地址,其应当与节点在K8s集群当中的节点地址一致, 如果您购买了公有云的公网IP并挂载到此relay节点上,则 relayNode.advertiseAddress 参数最好应该填写该公网IP地址。
https://pic1.zhimg.com/v2-a7004830b95a5bec9e8028cae9c511e0_b.jpg需要注意的是:设置中继节点的数量由 relayNodes 中索引值 num 来规定,num 取值从 0 开始,relayNodes 表示中继节点1。
更多的安装配置信息请详见:

[*]helm安装:
https://edgemesh.netlify.app/zh/guide/#helm-安装

[*]手动安装:
https://edgemesh.netlify.app/zh/guide/
▍2.3 运行时添加新中继节点

如果您在使用EdgeMesh高可用特性时,想要在集群当中添加新的中继节点,可以通过修改 edgemesh-agent-cfg 当中的 relayNodes 参数来达到目的,以下为具体修改配置的方式:
kubectl -n kubeedge edit configmap edgemesh-agent-cfg# 进入config 文件当中进行编辑apiVersion: v1data: edgemesh-agent.yaml: |-   modules: edgeProxy:       enable: true edgeTunnel:       enable: true       # 设置添加或者是修改为新的中继节点 relayNodes:       - nodeName: R1 advertiseAddress:         - 1.1.1.1       - nodeName: R2
页: [1]
查看完整版本: 深度解析KubeEdge EdgeMesh 高可用架构