├── img
├── 0.png
├── 1.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 6.png
├── 7.png
├── 8.png
├── 9.png
├── 1-1.PNG
├── 1-2.PNG
├── 10.png
├── 11.png
└── 12.png
├── LICENSE
└── README.md
/img/0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/0.png
--------------------------------------------------------------------------------
/img/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/1.png
--------------------------------------------------------------------------------
/img/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/2.png
--------------------------------------------------------------------------------
/img/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/3.png
--------------------------------------------------------------------------------
/img/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/4.png
--------------------------------------------------------------------------------
/img/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/5.png
--------------------------------------------------------------------------------
/img/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/6.png
--------------------------------------------------------------------------------
/img/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/7.png
--------------------------------------------------------------------------------
/img/8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/8.png
--------------------------------------------------------------------------------
/img/9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/9.png
--------------------------------------------------------------------------------
/img/1-1.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/1-1.PNG
--------------------------------------------------------------------------------
/img/1-2.PNG:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/1-2.PNG
--------------------------------------------------------------------------------
/img/10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/10.png
--------------------------------------------------------------------------------
/img/11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/11.png
--------------------------------------------------------------------------------
/img/12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/inspursoft/kubeEdge-OpenYurt/HEAD/img/12.png
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Inspur Software
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # kubeEdge-OpenYurt
2 | ## KubeEdge 概述
3 | 
4 |
5 | + **KubeEdge**是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于kubernetes构建,并为网络应用程序提供基础架构支持。云和边缘之间的部署和元数据同步。 KubeEdge使用**Apache 2.0**许可。并且绝对可以**免费**使用。KubeEdge v0.1于2018年12月底发布,具有非常基本的边缘功能。2020年6月5号发布了1.3.1版本,功能和架构上进行了很大程度的改进。
6 |
7 |
8 | + **KubeEdge**由社区成员开发,他们是**Kubernetes/CNCF**的积极贡献者,并从事边缘计算研究。KubeEdge团队还积极与Kubernetes IOT/EDGE WORKING GROUP合作。在KubeEdge宣布的几个月内,它吸引了来自不同组织的成员,包括**京东、浙江大学、SEL实验室、Eclipse、中国移动、ARM、英特尔**共同构建平台和生态系统。
9 | ## 为什么会有KubeEdge
10 | Kubernetes 作为容器编排的标准,自然会想把它应用到边缘计算上,即通过 kubernetes 在边缘侧部署应用,但是 kubernetes 在边缘侧部署应用时遇到了一些问题,例如:
11 | + 边缘侧设备没有足够的资源运行一个完整的 Kubelet
12 | + 一些边缘侧设备是 ARM 架构的,然而大部分的 Kubernetes 发行版并不支持 ARM 架构
13 | + 边缘侧网络很不稳定,甚至可能完全不通,而 kubernetes 需要实时通信,无法做到离线自治
14 | + 很多边缘设备都不支持TCP/IP 协议
15 | + Kubernetes 客户端(集群中的各个Node节点)是通过 list-watch 去监听 Master 节点的 apiserver 中资源的增删改查,list-watch 中的 watch 是调用资源的 watch API 监听资源变更事件,基于 HTTP 长连接实现,而维护一个 TCP 长连接开销较大。从而造成可扩展性受限。
16 |
17 | Kubeedge试图解决:
18 | + **Kubernetes 原生支持**:使用 KubeEdge 用户可以在边缘节点上编排应用、管理设备并监控应用程序/设备状态,就如同在云端操作 Kubernetes 集群一样。
19 | + **云边可靠协作**:确保可靠的消息传递,不会在不稳定的云-边网络上丢失。
20 | + **边缘自治**:当云-边网络不稳定或边缘脱机并重新启动时,能确保边缘节点自主运行,并且边缘中的应用程序正常运行。
21 | + **边缘设备管理**:通过CRD实现的Kubernetes原生API管理边缘设备
22 | + **极轻量级边缘代理**:极轻量级边缘代理(EdgeCore),可在资源受限的边缘上运行。
23 | + **边缘计算**:通过在边缘端运行业务逻辑,可以在本地保护和处理大量数据。KubeEdge 减少了边和云之间的带宽请求,加快响应速度,并保护客户数据隐私。
24 | ## KubeEdge整体架构
25 | 
26 |
27 | KubeEdge组件包含两部分:
28 | + 云上组件CloudCore
29 | + 边上组件EdgeCore
30 |
31 | 对于端设备,想要接入进KubeEdge里,则需要支持MQTT协议。用户可以自定义Mapper进行将端设备属性转化为MQTT消息,目前官方Mapper有:蓝牙和ModBus。
32 | ### In the Cloud
33 |
34 |
35 | + **CloudHub**:一个 Web Socket 服务端,负责监听云端的变化, 缓存并发送消息到 EdgeHub。
36 | + **EdgeController**:一个扩展的 Kubernetes 控制器,管理边缘节点和 Pods 的元数据确保数据能够传递到指定的边缘节点。
37 | + **DeviceController**:一个扩展的 Kubernetes 控制器,管理边缘设备,确保设备信息、设备状态的云边同步。
38 | + **CSI Driver**:同步存储数据到边缘。
39 | + **Admission Webhook**:为扩展API做合法性校验。
40 | ### On the Edge
41 |
42 |
43 | + **EdgeHub**:一个 Web Socket 客户端,负责与边缘计算的云服务(例如 KubeEdge 架构图中的 Edge Controller)交互,包括同步云端资源更新、报告边缘主机和设备状态变化到云端等功能。
44 | + **Edged**:运行在边缘节点的代理,用于管理容器化的应用程序。
45 | + **EventBus**:一个与 MQTT 服务器(mosquitto)交互的 MQTT 客户端,为其他组件提供订阅和发布功能。
46 | + **ServiceBus**:一个运行在边缘的HTTP客户端,接受来自云上服务的请求,与运行在边缘端的HTTP服务器交互,提供了云上服务通过HTTP协议访问边缘端HTTP服务器的能力。
47 | + **DeviceTwin**:负责存储设备状态并将设备状态同步到云,它还为应用程序提供查询接口。
48 | + **MetaManager**:消息处理器,位于 Edged 和 Edgehub 之间,它负责向轻量级数据库(SQLite)存储/检索元数据。
49 | ## KubeEdge发展路线图
50 | + 云边协同消息改为gRPC协议。
51 | + 支持边缘集群EdgeSite纳入到KubeEdge。
52 | + 增强云边协同消息的可靠性和效率。
53 | + 使用edgemesh进行云边通信。
54 | + 支持Istio管理微服务。
55 | + 支持FAAS特性。
56 | + 边缘集群支持上千节点和百万端设备接入。
57 | + 大规模集群中能够智能调度。
58 | + 支持边缘节点的数据分析和查询。
59 | + 边端增加安全特性。
60 | ## OpenYurt 概述
61 |
62 |
63 |
64 | 使用 OpenYurt(Yurt,/jɜːrt/,蒙古包)作为开源项目名称,期望以其“形”来表示边缘计算侧重于创建一个集中管理但物理分布的基础设施,并支持自动/自治运行操作的含义。
65 |
66 |
67 | OpenYurt 主打“云边一体化”概念,依托原生 Kubernetes 强大的容器编排、调度能力,通过众多边缘计算应用场景锤炼,实现了一整套对原生 Kubernetes“零”侵入的边缘云原生方案,提供诸如边缘自治、高效运维通道、边缘单元化管理、边缘流量拓扑管理,安全容器、边缘 Serverless/FaaS、异构资源支持等能力。
68 |
69 |
70 | OpenYurt 能帮用户解决在海量边、端资源上完成大规模应用交付、运维、管控的问题,并提供中心服务下沉通道,实现和边缘计算应用的无缝对接。
71 | ## 为什么会有OpenYurt
72 | 期望解决在海量边、端资源上完成大规模应用交付、运维、管控的问题,并提供中心服务下沉通道,实现和边缘计算应用的无缝对接。
73 | + 使设备和工作负载之间的长距离网络流量最小化。
74 | + 克服网络带宽或可靠性限制。
75 | + 远程处理数据以减少延迟。
76 | + 提供更好的安全模型来处理敏感数据。
77 |
78 | OpenYurt 技术方案有如下特点:
79 | + 对原生 Kubernetes“零”侵入,保证对原生 K8s API 的完全兼容。不改动 Kubernetes 核心组件,并不意味着 OpenYurt 是一个简单的 Kubernetes Addon。OpenYurt 通过 proxy node network traffic,对 Kubernetes 节点应用生命周期管理加了一层新的封装,提供边缘计算所需要的核心管控能力;
80 | + 无缝转换,OpenYurt 提供了工具将原生 Kubernetes“一键式”转换成支持边缘计算能力的 Kubernetes 集群;
81 | + 低 Overhead,OpenYurt 参考了大量边缘计算场景的实际需求,在保证功能和可靠性的基础上,本着最小化,最简化的设计理念,严格限制新增组件的资源诉求。
82 |
83 |
84 | OpenYurt 开源的核心能力包括:
85 | + **边缘自治能力**:YurtHub 作为节点上的临时配置中心,在网络连接中断的情况下,持续为节点上所有设备和客户业务提供数据配置服务。YurtHub 提供了对大量原生 Kubernetes API 的支持,可以在节点和边缘单元维度提供“Shadow Apiserver”的能力,在边缘计算弱网络链接场景的价值尤为突出;
86 | + **边缘运维通道**:在边缘场景,由于大多数边缘节点没有暴露在公网之上,中心管控无缝和边缘节点主动建立网络链接,所有的 Kubernetes 原生应用运维 APIs(logs/exec/metrics)会失去效力;YurtTunnel 通过在管控与边缘节点之间建立反向通道,并和节点的生命周期完整联动,承载原生运维 APIs 的流量;
87 | + **集群转换能力**:Yurtctl 作为 OpenYurt 官方命令行工具,提供原生 Kubernetes 集群支持边缘计算 infrastructure 的一键式切换。
88 | ## OpenYurt整体架构
89 | 
90 |
91 | OpenYurt遵循经典的边缘应用程序架构设计:
92 | 集中式Kubernetes主服务器驻留在云站点中,该站点管理位于边缘站点的多个边缘节点。
93 |
94 | 每个边缘节点具有适度的计算资源,从而允许运行大量边缘应用程序以及Kubernetes节点守护程序。
95 |
96 | 集群中的边缘节点可以跨越多个物理区域。
97 |
98 | Unit在OpenYurt中可以互换。
99 |
100 |
101 |
102 | YurtHub是一个节点守护程序,它充当从Kubernetes节点到主节点的出站流量的代理。 中继出站流量时,它将缓存所有状态并将其持久保存在本地。 如果与数据中心的连接丢失或Kubelet重新启动,则Kubelet将从YurtHub的缓存中读取。
103 |
104 |
105 |
106 | OpenYurt提供了一个控制器管理器,用于管理一些控制器,例如节点控制器和单元控制器,以用于不同的边缘计算用例。 功能之一是,即使缺少节点心跳,处于自治模式的节点中的Pod也不会从API Server中撤出。
107 | ## KubeEdge发展路线图
108 | 
109 |
110 | 作为阿里云容器服务 ACK@Edge 的开源版本,OpenYurt 将采用全开源社区开发模式
111 | 每季度发布新版本更新,包含社区上游安全/关键 bug 修复和新特性、新能力。
112 | 逐步将产品完整能力开源,预计到 2021 年一季度正式发布 OpenYurt 1.0 版本
113 |
114 | 现状:
115 | + **边缘自治能力**(YurtHub: 已开源),保证在弱网或者重启节点的情况下,部署在边缘节点上的应用也能正常运行;
116 | + **云边协同能力**(待开源),通过云边运维通道解决边缘的运维需求,同时提供云边协同能力;
117 | + **单元化管理能力**(待开源),为分散的边缘节点,边缘应用,应用间流量提供单元化闭环管理能力;
118 | ## KubeEdge vs OpenYurt
119 |
| 122 | | KubeEdge | 123 |OpenYurt | 124 |
|---|---|---|
| 项目成熟度 | 127 |● 2.7k Stars 128 | ● 717 Forks 129 | ● 17 Release 130 | ● 2318 Commits 131 | ● Issues (221 open, 528 closed) 132 | ● Pull requests(52 open, 1137 closed) 133 | |
134 | ● 403 Stars 135 | ● 70 Forks 136 | ● 1 Release 137 | ● 72 Commits 138 | ● Issues (2 open, 16 closed) 139 | ● Pull requests(1 open, 54 closed) 140 | |
141 |
| 最新版本 | 144 |v1.3.1 | 145 |v0.1.0-beta.1 1.0 (2021) |
146 |
| 架构比较 | 149 |||
| Cloud | 154 |Create CDRs Device Controller Edge Controller |
155 | 部署Yurt-controller-manager Disable the default nodelifecycle controller |
156 |
| Edge | 159 |异构 自治 edged(重构kubelet) |
160 | 异构 自治 kubelet重定向 |
161 |
| 设备接入 | 164 |DeviceModel/DeviceInstance Device CRD MQTT protocol and Mapper(Bluetooth/ModBus) | 165 | |
| 安装 | 168 |● 自动安装: keadm ● 手动安装: 使用kubectl 二进制: https://github.com/kubeedge/kubeedge/releases 169 | CRD yaml 文件: https://github.com/kubeedge/kubeedge/tree/master/build/crds | ● 自动安装: yurtctl convert --provider [minikube|ack] 注意:目前yurtctl只支持minikube和ack ● 手动安装: https://github.com/alibaba/openyurt/blob/master/docs/tutorial/manually-setup.md#label-cloud-nodes-and-edge-nodes |
170 |
| 开源 | 173 |CNCF项目 | 逐步开源中 | 174 |
| 虚机支持 | 177 |Virtlet | 无明确代码 | 178 |
210 |
211 | 一键让原生 K8s 集群具备边缘计算能力
212 | ```
213 | yurtctl convert --provider [minikube|ack]
214 | ```
215 | 为了让原生 K8s 集群具备边缘计算能力,OpenYurt 以 addon 为载体,非侵入式增强原生 K8s。
216 |
217 | + Yurtctl 是一个**中心化**的管控工具。在 OpenYurt 云-边一体的架构里,Yurtctl 将直接与 APIServer 进行交互。它借助原生 Kubernetes 的 Job workload 对每个 node 进行运维操作。如图1所示,在执行转换(convert)操作时,Yurtctl 会通过 Job 将一个 servant Pod 部署到用户指定的边缘节点上,servant Pod 里的容器执行的具体操作请参考:https://github.com/alibaba/openyurt/blob/master/config/yurtctl-servant/setup_edgenode。
218 |
219 | + 由于 servant Pod 需要直接操作节点 root 用户的文件系统(例如将 yurthub 配置文件放置于 /etc/kubernetes/manifests 目录下),并且需要重置系统管理程序(kubelet.service), servant Pod 中的 container 将被赋予 privileged 权限,允许其与节点共享 pid namespace,并将借由 nsenter 命令进入节点主命名空间完成相关操作。当 servant Job 成功执行后,Job 会自动删除。如果失败,Job 则会被保留,方便运维人员排查错误原因。借由该机制,Yurtctl 还可对 Yurthub 进行更新或者删除。
220 |
--------------------------------------------------------------------------------