这里要讨论的“边缘”特指计算资源在地理分布上更加靠近设备,而远离云数据中心的资源节点。典型的边缘计算分为物联网(例如:下一代工业自动化,智慧城市,智能家居,大型商超等)和非物联网(例如:游戏,CDN等)场景。
在现实世界中,边缘计算无法单独存在,它必定要和远程数据中心/云打通(具体原因见下文)。以IoT(Internet of Things,物联网)为例,边缘设备除了拥有传感器收集周边环境的数据外,还会从云端接收控制指令。边缘设备与云连接一般有两种模式:直连和通过中继边缘节点连接,如下图所示:
边缘设备能否直连云端/数据中心取决于是否有全球唯一可路由的IP,例如:手机、平板电脑等。不过,大部分的设备通过近场通信协议与边缘节点通信,进而和云端/数据中心连接的。边缘节点是设备的汇聚点,有分配IP地址,扮演了边缘网关的作用。边缘节点为普通的设备提供IP地址,也可以运行容器。
我们注意到,边缘节点也是有不同层级的,而划分的标准之一就是资源(计算、存储、网络带宽等)的大小。
如上所示,我们将edge分为“Device Edge”和“Infrastructure Edge”。Device Edge(设备边缘)是指那些并不被认为是IT基础设施组成部分的边缘节点,例如:火车、油田、工厂和家庭等。通常它们没什么计算能力,被用于解决最后“一公里”接入的问题,一个典型的例子就是智能路由器,它一端通过红外信号控制家中电器,另一端通过网络和云数据中心相连。由于设备边缘网络稳定性较差,因此必须要考虑它们会较长时间离线的情况(例如火车过隧道)。
注:日常生活中很多设备我们可以看成是device+device edge的结合体,例如智能手机。
Infrastructure Edge(基础设施边缘)相对于Device Edge计算和存储能力都更强,而且通常通过骨干网与数据中心连接,因此具有更大的网络带宽和更加可靠的网络连接,例如:CDN,游戏服务器等。基础设施边缘除了能运行容器外,有些甚至还有足够资源运行完整的Kubernetes。
对边缘节点进行分类的意义在于,针对不同层级的边缘需要有针对性的部署模型,并且平台要为边缘节点提供通信能力。
最后,我们总结一下当前边缘计算领域面临的几个挑战:
其中,云边协是当前面临最大的技术挑战!
边缘计算和云计算不是两种互斥的技术,它们是相辅相成的关系。而且从场景需求上看,IoT/Edge与云数据中心有一些相似之处,例如:
因此,将云数据中心的现有架构和能力顺势延伸到边缘就变得水到渠成了。下面列举了一些需要云边协同的场景:
我们已经积累了足够的管理云上资源的经验,现在下一步的挑战就是如何构建一个边缘云平台,把对云上资源的管理方法延伸到边缘,让我们能够无缝地管理边缘的资源和设备。边缘云平台将重点解决以下问题:
Kubernetes已经成为云原生的标准,并且能够在任何基础设施上提供一致的云上体验。我们经常能够看到“容器 + Kubernetes”的组合在DevOps发挥10X效率,最近也有越来越多Kubernetes运行在数据中心外(边缘)的需求。
如果要在边缘部署较复杂的应用,那么Kubernetes是个理想的选择:
然而Kubernetes毕竟是为云数据中心设计的,要想在边缘使用Kubernetes的能力,Kubernetes或其扩展需要解决以下问题:
关于如何在边缘使用Kubernetes,Kubernetes IoT/Edge WG组织的一个调查显示,30%的用户希望在边缘部署完整的Kubernetes集群,而70%的用户希望在云端部署Kubernetes的管理面并且在边缘节点上只部署Kubernetes的agent。
把Kubernetes从云端延伸到边缘,有两个开源项目做得不错,分别是KubeEdge和K3S,下面我们将详解这两个项目,并做全方位的对比。
KubeEdge是首个基于Kubernetes扩展的,提供云边协同能力的开放式智能边缘平台,也是CNCF在智能边缘领域的首个正式项目。KubeEdge重点要解决的问题是:
KubeEdge的架构如下所示:
KubeEdge架构上清晰地分为三层,分别是:云端、边缘和设备层,这是一个从云到边缘再到设备的完整开源边缘云平台,消除了用户厂商绑定的顾虑。
KubeEdge的边缘进程包含以下5个组件:
Kubernetes maser运行在云端,用户可以直接通过kubectl命令行在云端管理边缘节点、设备和应用,使用习惯与Kubernetes原生的完全一致,无需重新适应。
K3S是CNCF官方认证的Kubernetes发行版,开源时间较KubeEdge稍晚。K3S专为在资源有限的环境中运行Kubernetes的研发和运维人员设计,目的是为了在x86、ARM64和ARMv7D架构的边缘节点上运行小型的Kubernetes集群。K3S的整体架构如下所示:
事实上,K3S就是基于一个特定版本Kubernetes(例如:1.13)直接做了代码修改。K3S分Server和Agent,Server就是Kubernetes管理面组件 + SQLite和Tunnel Proxy,Agent即Kubernetes的数据面 + Tunnel Proxy。
为了减少运行Kubernetes所需的资源,K3S对原生Kubernetes代码做了以下几个方面的修改:
K3S的所有组件(包括Server和Agent)都运行在边缘,因此不涉及云边协同。如果K3S要落到生产,在K3S之上应该还有一个集群管理方案负责跨集群的应用管理、监控、告警、日志、安全和策略等,遗憾的是Rancher尚未开源这部分能力。
KubeEdge是一种完全去中心化的部署模式,管理面部署在云端,边缘节点无需太多资源就能运行Kubernetes的agent,云边通过消息协同。从Kubernetes的角度看,边缘节点 + 云端才是一个完整的Kubernetes集群。这种部署模型能够同时满足“设备边缘”和“基础设施边缘”场景的部署要求。
K3S的部署模型如下所示:
K3S会在边缘运行完整的Kubernetes集群,这意味着K3S并不是一个去中心化的部署模型,每个边缘都需要额外部署Kubernetes管理面。这种部署模型带来的问题有:
云边协同是KubeEdge的一大亮点。KubeEdge通过Kubernetes标准API在云端管理边缘节点、设备和工作负载的增删改查。边缘节点的系统升级和应用程序更新都可以直接从云端下发,提升边缘的运维效率。另外,KubeEdge底层优化的多路复用消息通道相对于Kubernetes基于HTTP长连接的list/watch机制扩展性更好,允许海量边缘节点和设备的接入。KubeEdge云端组件完全开源,用户可以在任何公有云/私有云上部署KubeEdge而不用担心厂商锁定,并且自由集成公有云的其他服务。
K3S并不提供云边协同的能力。
与Kubernetes集群的节点不同,边缘节点需要在完全断开连接的模式下自主工作,并不会定期进行状态同步,只有在重连时才会与控制面通信。此模式与Kubernetes管理面和工作节点通过心跳和list/watch保持状态更新的原始设计非常不同。
KubeEdge通过消息总线和元数据本地存储实现了节点的离线自治。用户期望的控制面配置和设备实时状态更新都通过消息同步到本地存储,这样节点在离线情况下即使重启也不会丢失管理元数据,并保持对本节点设备和应用的管理能力。
K3S也不涉及这方面能力。
KubeEdge提供了可插拔式的设备统一管理框架,允许用户在此框架上根据不同的协议或实际需求开发设备接入驱动。当前已经支持和计划支持的协议有:MQTT,BlueTooth,OPC UA,Modbus等,随着越来越多社区合作伙伴的加入,KubeEdge未来会支持更多的设备通信协议。KubeEdge通过device twins/digital twins实现设备状态的更新和同步,并在云端提供Kubernetes的扩展API抽象设备对象,用户可以在云端使用kubectl操作Kubernetes资源对象的方式管理边缘设备。
K3S并不涉及这方面能力。
为了将Kubernetes部署在边缘,KubeEdge和K3S都进行了轻量化的改造。区别在于K3S的方向是基于社区版Kubernetes不断做减法(包括管理面和控制面),而KubeEdge则是保留了Kubernetes管理面,重新开发了节点agent。
需要注意的是,K3S在裁剪Kubernetes的过程中导致部分管理面能力的缺失,例如:一些Admission Controller。而KubeEdge则完整地保留了Kubernetes管理面,没有修改过一行代码。
下面我们将从二进制大小、内存和CPU三个维度对比KubeEdge和K3S的资源消耗情况。由于KubeEdge的管理面部署在云端,用户不太关心云端资源的消耗,而K3S的server和agent均运行在边缘,因此下面将对比KubeEdge agent,K3S agent和K3S server这三个不同的进程的CPU和内存的资源消耗。
测试机规格为4 vCPU,8GB RAM。
分别用KubeEdge和K3S部署0~100个应用,分别观测两者的内存消耗,对比如下所示:
从上图可以看出,内存消耗:KubeEdge agent \u0026lt; K3S agent \u0026lt; K3S Server。有意思的是,K3S agent即使不运行应用也消耗100+MB的内存,而K3S server在空跑的情况下内存消耗也在300MB左右。
分别用KubeEdge和K3S部署0~100个应用,分别观测两者的CPU使用情况,对比如下所示:
从上图可以看出,KubeEdge agent CPU消耗要比K3S agent和server都要少。
KubeEdge agent二进制大小为62MB,K3S二进制大小为36MB。
Kubernetes原生的可扩展性受制于list/watch的长连接消耗,生产环境能够稳定支持的节点规模是1000左右。KubeEdge作为华为云智能边缘服务IEF的内核,通过多路复用的消息通道优化了云边的通信的性能,压测发现可以轻松支持5000+节点。
而K3S的集群管理技术尚未开源,因为无法得知K3S管理大规模集群的能力。
K3S最让人印象深刻的创新在于其对Kubernetes小型化做的尝试,通过剪裁了Kubernetes一些不常用功能并且合并多个组件到一个进程运行的方式,使得一些资源较充足的边缘节点上能够运行Kubernetes,让边缘场景下的用户也能获得一致的Kubernetes体验。然而通过上面的性能对比数据发现,K3S的资源消耗还是比KubeEdge要高出好几倍,而且动辄几百MB的内存也不是大多数设备边缘节点所能提供的。最重要的是,Kubernetes最初是为云数据中心而设计的,很多边缘计算场景特殊的问题原生Kubernetes无法很好地解决, K3S直接修改Kubernetes的代码甚至基础实现机制(例如,使用SQLite替换etcd)的做法仍值得商榷。关于什么能改,什么不能改以及怎么改?每个用户根据自己的实际需求有各自的观点,而且也很难达成一致。另外, K3S这种侵入式的修改能否持续跟进Kubernetes上游的发展也是一个未知数。
KubeEdge和K3S走的是另一条道路,KubeEdge是一个从云到边缘再到设备的完整边缘云平台,它与Kubernetes的耦合仅仅是100%兼容Kubernetes原生API。KubeEdge提供了K3S所不具备的云边协同能力,开发了更轻量的边缘容器管理agent,解决了原生Kubernetes在边缘场景下的离线自治问题,并且支持海量异构边缘设备的接入等。KubeEdge最近捐献给CNCF,成为CNCF边缘计算领域的第一个正式项目,就是为了和社区合作伙伴一起制定云和边缘计算协同的标准,结束边缘计算没有统一标准和参考架构的混沌状态,共同推动边缘计算的产业发展。
最后,边缘计算还有广阔的发展前景,KubeEdge和K3S都是非常年轻的优秀开源项目,我相信未来他们会在相互学习的过程中共同进步,更好地解决边缘计算用户的需求。