阿里云推出开源项目 OpenYurt,以非侵入式的架构设计融合云原生和边缘计算两大领域,一方面是把阿里云在云原生边缘计算领域的经验回馈给开源社区,另一方面也希望加速云计算向边缘延伸的进程,并和社区共同探讨未来云原生边缘计算架构的统一标准。
OpenYurt 项目的历史背景:来自于阿里云业务的运维诉求,阿里云物联网(IoT)和 CDN 服务作为阿里典型的边缘计算业务,经历着产品种类、规模的爆发式增长,运维复杂度剧增、运维效率低下,正是在这样的背景下,OpenYurt 核心架构诞生,缓解阿里云边缘业务运维难题。
OpenYurt 作为阿里云公共云服务 ACK@Edge 的核心框架,已经应用于 CDN、音视频直播、物联网、物流、工业大脑、城市大脑等实际应用场景中,并服务于阿里云 LinkEdge、盒马、优酷、视频云等多个业务或项目中。目前开源的能力包括:
- 边缘自治能力。
- 原生 Kubernets Cluster 一键式转换为边缘集群。
OpenYurt 开源理念总结为:赋能云原生,实现云边端一体化,“Extending your native Kubernetes to Edge”。
- 边缘云原生:架构一致、体验一致。基于 Kubernetes 强大的容器编排、调度能力,通过众多边缘计算应用场景锤炼,实现一整套与原生 Kubernetes 一致的边缘云原生方案。
- 云边协同:中心管控,边缘自治。提供边缘自治、高效运维通道、边缘单元化管理、边缘流量拓扑管理,安全容器、边缘 Serverless/FaaS、异构资源支持等能力。边端部署,中心服务下沉边缘,实现和边缘计算应用的无缝对接。
自 OpenYurt 诞生以来,接管业务容器数量超过百万,覆盖新零售、医疗、物联网、在线教育、边缘智能、交通等众多行业,受到了业界广泛欢迎与认可。这一切得益于 OpenYurt 沿用了目前业界流行的 “中心管控、边缘自治” 的边缘应用管理架构,以非侵入式增强 Kubernetes 的设计理念,将云原生能力拓展至边缘端,可降低资源成本、降低运维复杂度、获得云边一致性运维体验、实现大规模边缘业务轻松管理。
OpenYurt 主要特性包括:
- Kubernetes 生态全兼容:对原生 Kubernetes “零” 侵入,保证对原生 Kubernetes 完整生态的全部兼容,OpenYurt 集群可以紧跟 Kubernetes 社区版本升级节奏,同时也意味云原生社区主流技术(如:Service mesh, Serverless 等)可以轻松落地 OpenYurt;
- 边缘异构资源支持:对不同边缘节点硬件架构(e.g. x86、ARM、RM64 等),硬件规格,通信协议提供一致体验;
- 高可靠/稳定性:基于边缘自治和边缘单元化能力,为多地域,大规模的边缘应用的持续稳定运行提供保障。支持各类开源 AI 系统(e.g. Tensorflow、Pytorch 等),为 AI 用户提供最佳体验;
- 云平台无关:OpenYurt 可以轻松部署在任何公共云的 Kubernetes 服务中。
OpenYurt 将 Kubernetes 系统延展到边缘计算场景,边缘节点将通过公网和云端连接,从公网的不稳定性以及成本等因素考虑,边缘要求断网状态或者弱网状态下边缘业务可以持续运行。从 Gartner 的边缘计算报告中提到的边缘计算诉求中,边缘自治也是主要诉求之一。
而从 Kubernetes 系统架构来看,主要因为 Slave Agent(Kubelet)中的容器信息保存在内存中,断网状态下因为无法从云端获取业务数据,如果节点或者 Kubelet 重启,将无法进行业务容器恢复。
因此边缘自治在 Kubernetes 系统里,需要解决下面的问题:
- 问题 1:节点异常或重启时,内存数据丢失,网络断连时业务容器无法恢复;
- 问题 2:网络长时间断连,云端控制器对业务容器进行驱逐;
- 问题 3:长时间断连后网络恢复时,边缘和云端数据的一致性保障。
解决方案 1:重构 kubelet 组件,复用或者参考 kubelet 的 checkpoint 功能,持久化容器业务数据到本地磁盘,网络断连状态下利用本地缓存数据实现业务恢复。
该方案经过重构 kubelet,成功解决边缘自治的需求,具备如下优点:
- 通过重构 kubelet,方便在 kubelet 中集成对端设备的管理能力;
- 通过重构 kubelet,可以对 kubelet 进行轻量化改造。此优点但是也意味着原生 kubelet 功能缺失的问题。
但是也有如下不足:
- 可维护性差:侵入式修改 kubelet core,跟随社区版本升级非常困难,熟悉 kubelet 的同学都会有同感,kubelet 组件由于直接负责跟计算,存储,网络交互,所以其代码结构和逻辑异常复杂。因此持续维护一个深度修改过的 kubelet 的工作量可想而知;
- 可扩展性差:因为自治能力直接做到重构的 kubelet 组件中,这样边缘节点如果其他组件(如:网络组件)想复用边缘自治能力将面临重复造轮子的境地;
- 场景耦合更深:例如在 kubelet 重构中增加了 IoT 设备管理,将可能使 kubelet 和 IoT 场景深度耦合。
解决方案 2(OpenYurt 使用方案):在边缘节点上增加 Web 缓存及请求代理 hub(取名为 YurtHub,商业产品中名为 edge-hub),边缘侧组件(kubelet)和云端通信将经由该组件。YurtHub 相当于带有数据缓存功能的 “透明网关”,和云端网络断连状态下,如果节点或者 kubelet 重启,将从 YurtHub 中获取到业务容器相关数据,有效解决边缘自治的问题。
相比解决方案 1,有如下优势:
- kubelet 零修改,意味原生 kubelet 能力天然具备,同时跟随 Kubernetes 版本升级零负担;
- 可扩展性强,节点其他组件轻松复用 YurtHub;
- 与 Kubernetes 设计理念契合,YurtHub 非常容易扩展出更多的能力。
当然 OpenYurt 的解决方案,也会面临如下的问题:原生 kubelet 比较 high-weight,在资源紧张场景下应用会比较挑战。目前商业产品中节点规格推荐 2U4G 起步。
问题 2:原生云端组件 kube-controller-manager 对 Pod 驱逐解决。该问题正是通过开源组件 yurt-controller-manager 中的 Node Controller 来解决的。如 github 主页介绍所示:
问题 3: 网络恢复时,边缘和云端网络一致性。Kubernetes 系统中,用户是通过云端对边缘进行管控的(如:应用部署,升级,扩缩容等),因此当边缘和云端网络断联时,边缘节点将不会从云端同步用户对节点的管控操作,因此断网期间,只要 YurtHub 保持本地缓存数据和断网时刻一致(即断网期间边缘缓存数据不更新),而网络恢复时,再从云端同步最新数据即可。
作为对原生 Kubernetes 完整生态全部兼容的智能开放平台,OpenYurt 将以更灵活和可扩展的体系结构方向发展,不断增强开源开发者友好体验。阿里云容器服务负责人易立表示,OpenYurt 还将基于行业场景与 5G、AI、大数据、区块链等新兴技术结合,驱动企业业务加速创新。未来 OpenYurt 将与社区并肩、与生态同行,致力于推进云原生技术在边缘计算领域的生态建设与普及,与全球开发者一起拓展云原生的边界。
OpenYurt 的架构OpenYurt 解决方案架构:OpenYurt 采用了业绩推崇的云、深边(Heavy Edge/Infrastructure Edge)、浅边(Light Edge/Device Edge)方案架构。
云端通过 Yurt Controller 实现对边缘容器管理,组件通过 API Server 访问集群状态,边缘通过 YurtHub 作为节点上的临时配置中心,在网络连接中断的情况下,持续为节点上所有设备和客户业务提供数据配置服务。
考虑到边缘容器网络安全,以及大多数节点不在公共网络上,中心 Yurt Controller 无法主动和边缘节点建立网络连接,在 Kubernetes API 失效的情况,YurtTunnel 可建立与边缘节点间的反向通道,并和节点的生命周期完整联动。
Yurtctl 作为 OpenYurt 官方命令行工具,提供原生 Kubernetes 集群支持边缘计算 infrastructure 的一键式切换。
- 节点生命周期管理:OpenYurt 保证一致的 Kubernetes 应用体验和原生 Kubernetes API 的完全兼容。通过 YurtTunnel 以代理方式对 Kubernetes 节点应用生命周期管理加了一层新的封装,提供边缘计算所需要的核心管控能力。
- 无缝转换(路标中):OpenYurt 提供了工具将原生 Kubernetes “一键式” 转换成支持边缘计算能力的 Kubernetes 集群。
- 资源优化:OpenYurt 参考了大量边缘计算场景的实际需求,在保证功能和可靠性的基础上,本着最小化,最简化的设计理念,严格限制新增组件的资源诉求。
- Kubernets 应用广泛兼容性:OpenYurt 对边缘容器的管控基于标准 Kubernets API 和标准容器网络技术,故兼容所有云厂商的 Kubernetes 服务,易于集成。