草庐IT

详解KubeEdge边缘网络项目EdgeMesh

华为云开发者社区 2023-03-28 原文
摘要:本文带大家进一步了解 EdgeMesh 的进展以及未来的规划。

本文分享自华为云社区《走向成熟的KubeEdge边缘网络项目EdgeMesh详解》,作者:华为云云原生团队 王杰章 。

KubeEdge 社区边缘网络方案致力于研究和解决边缘计算场景下跟网络连通、服务协同、流量治理等相关的一系列问题。其中,EdgeMesh 子项目当前实现了边缘计算场景下应用的跨云边、跨边边的网络通信,目前项目已逐渐从一个创新项目走向成熟,被多家厂商集成到自己的边缘计算解决方案中。本文带大家进一步了解 EdgeMesh 的进展以及未来的规划。

▍1 边缘网络通信挑战

下图展示了一个目前比较通用的边云协同视频AI服务的大致架构,通过这个服务我们可以去做一些人脸识别、人流分析等任务,并将这些技术运用在安防、交通、电力等等实际的产业里。如下图所示,边缘会有一些端侧设备接入到EdgeCore中,比如摄像头或车载系统,在某些场景下边缘应用会采集视频流、图片、音频等等媒体资源,再到云上处理或训练,通过这种边云协同的方式来提高AI识别的精度。

但是在边缘计算场景下,会遇到一些困难和挑战使得没法顺利的完成这些功能。总结如下:

  • 边云、边边网络割裂,微服务之间无法跨子网直接通信
  • 边缘端网络质量不稳定,节点离线、网络抖动是常态
  • 边缘场景下网络组网复杂、配置管理困难
  • 边缘侧缺少服务发现、负载均衡与流量治理等能力

通过上述边缘计算场景网络通信面临的挑战分析,总结归纳后,我们将它们抽象成了一个分层的结构。

如上图所示,边缘网络通信痛点问题主要分为三个层次:

从物理链路层看

  1. 边缘网络拓扑构造复杂,网络质量不稳定
  2. 边云、边边物理网络割裂,多边服务协同困难

从虚拟网络层看

1.传统的虚拟网络技术,比如kube-proxy、cni等,无法解决跨网络数据的转发2.数据处理链路较长,专线铺设造价昂贵

从物理链路层看

  1. 边缘网络拓扑构造复杂,网络质量不稳定
  2. 边云、边边物理网络割裂,多边服务协同困难

▍2 KubeEdge的边缘网络 Scope

依据上面的痛点分析结果,我们归纳出了当前阶段主要关注的几个核心问题的范畴。如下所示,依旧是按照一个分层的结构去抽象问题。

边缘物理网络层

边缘物理网络层也是使用传统的计算机网络技术搭建的网络基础设施。在边缘场景里,物理网络一般都是基于区域隔离,大到跨省、跨市,小到跨园区。它们之间的网络往往是不互通的,必须经过因特网以及电信运营商的网络才能互通。对于物理网络这个层次,其实很难在这个层面进行改造,主要因为物理网络层几乎都是硬件的基础设施,确实不太好深入去改造,所以我们主要将焦点瞄准在上面几个层次。

边缘隧道网络层

边缘隧道网络层最核心的问题就是如何将下层割裂的物理网络进行连通,以此屏蔽边缘网络拓扑的复杂性。这层核心的能力是提供网络隧道技术、加密技术等,主要的业界实现有libp2p,ipsec等。像EdgeMesh其实就是用到了libp2p技术,尝试去建立每个对等点的连接(无论这些对等点是否处于同一个子网内),以此形成一个p2p的隧道网络。像阿里云开源的raven以及博云开源的fabedge就是用了ipsec技术来完成这件事情。像kilo这款cni插件,用了wireguard技术先实现了隧道网络,再实现了cni的功能。

边缘容器网络层

容器网络主要围绕cni技术展开,前文也提到过边缘场景下cni插件是不支持跨子网转发数据的,因为cni本身依赖三层网络能互通。所以边缘容器网络得依赖边缘隧道网络层的能力才能发挥原本cni容器网络配置、数据包封包和路由以及网络策略的能力。上层依赖下层提供的服务的形式类型于计算机网络协议栈的概念。EdgeMesh目前缺失边缘容器网络层的能力,因此EdgeMesh目前还不支持pod ip级别的数据转发,也还不支持网络策略,不过这块内容在EdgeMesh未来的路标内。

边缘虚拟网络层

能够通过K8s service去访问特定的服务是此层的核心功能,主要负责应用暴露服务的透明代理兼负载均衡器,比较常见的实现有k8s官方的kube-proxy,其他还有cilium等。Cilium的能力覆盖到了容器网络层和虚拟网络层,它使用了ebpf技术能在内核态去转发数据,性能很高,这也是EdgeMesh未来在性能转发方面的一个优化方向。

边缘服务网格层

这一层会提供比容器网络层更加丰富的网络策略管理能力,此外还有很多服务治理功能,比如服务发现、灰度发布、熔断、限流、分布式调用链等等。目前业界实现的istio、linkerd之类的产品,都做的非常强大,EdgeMesh对此层更倾向于集成已有的Service Mesh的成果。

可能有人会疑问的是,除了边缘隧道网络层以外的其他几层现在都有业界成熟的实现,那是不是只需要把边缘隧道网络层做出来,其他上面几层直接部署原生的组件即可?其实这是没问题的,但是可能场景覆盖得不够全面。比如在一些资源特别受限的场景下,边缘计算资源很难集成太多组件(比如kube-proxy、cni插件、coredns等),而且服务网格数据面使用sidecar模式会占用更多的资源。然而edgemesh仅需一个轻量的组件(内存占用<80MB)即可解决一切问题,也会采用节点级的模式代替sidecar模式进行服务治理。

▍3 EdgeMesh:边缘网络通信解决方案

EdgeMesh定位于解决边缘场景下云边、边边网络通信,下图是EdgeMesh的架构。

EdgeMesh具有以下几点优势:

  • 跨子网通信屏蔽复杂的边缘网络环境,提供容器间的跨子网边边和边云通信能力
  • 高可靠性通过NAT穿透技术建立点对点直连,转发效率高;在不支持打洞时通过中继转发流量,保障服务之间的正常通讯
  • 云原生体验为 KubeEdge 集群中的容器应用提供与云原生一致的服务发现与流量转发体验
  • 轻量化每个节点仅需部署一个极轻的代理组件,采用分层式设计架构,各模块能够与原生组件兼容并支持动态关闭

下图展示了EdgeMesh的基本工作流程:

▍4 进展与未来规划

下图展示了我们正在做的以及后续规格中要做的事项,红色边的区域代表目前基本已经完成的模块,后续也会持续的演进和优化。其他蓝色区域表示都是在未来规划内的模块,比如容器网络/网络策略、服务网格、动态路由。动态路由这一块内容,主要是想去探索一下在移动场景下的网络通信的优化。最后是消息系统,目前市面上有很多消息中间件,比如rabbitmq,kafka和redis等,可以为网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统,这在边缘网络通信场景下也是非常有价值的。

关于KubeEdge

KubeEdge是业界首个云原生边缘计算框架、云原生计算基金会内部唯一孵化级边缘计算开源项目,社区已完成业界最大规模云原生边云协同高速公路项目(统一管理10万边缘节点/50万边缘应用)、业界首个云原生星地协同卫星、业界首个云原生车云协同汽车、业界首个云原生油田项目,开源业界首个分布式协同AI框架Sedna及业界首个边云协同终身学习范式,并在持续开拓创新中。

KubeEdge网站 :  https://kubeedge.io

GitHub地址 : https://github.com/kubeedge/kubeedge

Slack地址 : https://kubeedge.slack.com

邮件列表 : https://groups.google.com/forum/#!forum/kubeedge

每周社区例会 : https://zoom.us/j/4167237304

Twitter : https://twitter.com/KubeEdge

文档地址 : https://docs.kubeedge.io/en/latest/

 

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

有关详解KubeEdge边缘网络项目EdgeMesh的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  3. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  4. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  5. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  6. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  7. ruby - 如何在 Ruby 字符串中插入项目符号字符? - 2

    我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195

  8. ruby - 在 Rails 项目中测试本地版本的 gem - 2

    我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行​​bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正

  9. ruby - 检查网络文件是否存在,而不下载它? - 2

    是否可以在不实际下载文件的情况下检查文件是否存在?我有这么大的(~40mb)文件,例如:http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm这与ruby​​不严格相关,但如果发件人可以设置内容长度就好了。RestClient.get"http://mirrors.sohu.com/mysql/MySQL-6.0/MySQL-6.0.11-0.glibc23.src.rpm",headers:{"Content-Length"=>100} 最佳答案

  10. ruby - 404 未找到,但可以从网络浏览器正常访问 - 2

    我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT

随机推荐