边缘服务网格 osm-edge

本文篇幅稍长,阅读本文将了解以下内容:

•什么是 osm-edge 及其产生背景•边缘计算与中心云计算的差异,以及带来的挑战•osm-edge 的设计及采用的技术•5 分钟快速体验边缘服务网格

关于 osm-edge

osm-edge 是针对边缘计算环境设计的服务网格,采用 osm[1] 作为控制平面,采用 Pipy[2] 作为数据平面,具有高性能、低资源、简单、易用、易扩展、广泛兼容(支持x86/arm64/龙芯/RISC-V)的特点。

基于 osm 的控制平面,osm-edge 充分支持 SMI[3] 规范;通过搭配使用支持 ingress、gateway API、跨集群服务发现的 fsm[4],"osm+fsm" 套件提供了完整的" k8s 集群内+多集群"的"东西+南北"流量管理和服务治理能力。

osm-edge 的开发和测试环境采用k3s[5]、k8e[6] 等流行的边缘计算 k8s 发行版,目标是 osm-edge 用户可以快速低成本的在 x86、arm、RISC-V、龙芯等硬件平台上部署低资源高性能的服务网格,以更好的支撑微服务架构在低能耗的边缘计算场景运行。

osm-edge 已经在 GitHub 上开源,仓库地址[7]:https://github.com/flomesh-io/osm-edge,也可访问 osm-edge 文档中心[8]了解更多内容:https://osm-edge-docs.flomesh.io。

现邀请感兴趣的小伙伴参与内测,参与内测并提交测试结果的小伙伴将获得由 Flomesh 提供的小礼物。感兴趣的小伙伴可以微信联系 张晓辉(微信 duwasai,邮箱 tyrael@flomesh.io[9])。

产生的背景

在实际工作中,我们遇到多种行业的用户对服务网格提出了类似的需求。这些行业用户和场景包括:

•能源和电力公司。他们希望在每个变电站或者加油站建立简易的机房,部署计算和存储能力,用于对该地点覆盖范围内设备产生的数据的处理。他们希望把传统数据中心的应用推向这些简易机房,并充分采用数据中心的应用管理和运维能力•车联网服务提供商。他们希望在非数据中心的环境建立自己的简易计算环境用于数据采集以及提供服务给车和车主。这些环境可能是公路近距离的位置,或者停车场,以及车流密集的地方•零售商。他们希望在每个商店建立最简的计算环境,除了支撑传统的进存销、收付款等能力,也希望引入新的数据采集、加工、传输能力•医疗机构。他们希望在每个医院,或者是简易的医疗点,提供网络能力,除了面向患者的提供数字化服务能力,也同时完成数据采集,以及和上级管理部门的数据联动•校园、医院等园区。这些园区具有人员相对固定且人流密集的特点。他们希望在更多的人群聚集点附近部署计算资源,用于交付数字化服务,以及采集和处理实时的数据

这些都是典型的边缘计算场景,他们具有相似的需求:

•用户希望把传统数据中心的计算模式,尤其是微服务,以及相关的应用交付、管理运维能力带到边缘侧•在工作环境方面,用户需要面对电力供应、算力有限、不稳定的网络等因素。因此需要计算平台具有更强的鲁棒性,在极端的情况下可以快速部署或者完整恢复一个计算环境•通常需要部署的位置(我们称为 POP=Point of Presence)数量众多,而且在不断的发展和扩展。因此需要更加精细的控制计算成本,一个 POP 点的造价、维护价格、扩容价格都成为重要的成本考量因素•普通的、或者低端的 PC 服务器更多的被用于这些场景用于替代云端标准的服务器;基于 ARM 等低功耗技术的算力同时进一步替代低端 PC 服务器。在这些不能媲美云端标准服务器的硬件平台上,用户仍然希望拥有足够的算力以应对功能和数据量的增长。计算向靠近数据产生的位置前移、边缘侧数据量和功能需求的增长、边缘侧计算资源的有限性,这互相矛盾的三者要求边缘侧计算平台拥有更好的计算能效比,也就是用尽可能少的电、尽可能少的服务器、运行更多的应用、支撑更大的数据量•POP 点的脆弱性和数量庞大的特点,要求应用更好的支持多集群、跨 POP 的故障迁移。比如某个 POP 点出现故障,那么临近的 POP 点可以快速的分担甚者临时接管这些计算任务

相比于云端数据中心的计算场景,边缘计算三个核心和主要的差异和难点在于:

•边缘计算要求支持异构的硬件架构。我们看到非 x86 的算力正在边缘被广泛的使用,他们通常具有低功耗、低成本的优势•边缘计算 POP 点是脆弱的。这种脆弱性体现在他们可能没有极高可靠度的供电,或者是供电的功率不像数据中心一样大;他们的运行环境可能更差,而不是数据中心的恒温通风环境;他们的网络可能是窄带和不稳定的•边缘计算是天然的分布式计算。几乎所有的边缘计算场景,都有多个 POP 点,而且 POP 点的数量在持续增加。POP 点之间可以互相灾备,发生故障时可以向临近 POP 点迁移,是边缘计算的基础能力

k8s 向边缘侧的演进,在一定程度上解决了边缘计算的难点,尤其是对抗脆弱性;而服务网格向边缘侧发展,则侧重边缘计算中网络问题,对抗网络的脆弱性,以及对分布式提供基础网络支持,如故障迁移。在实践中,容器平台作为今天事实上准标准的应用交付手段,正在快速的向边缘侧演进,出现了大批针对边缘特征的发行版,典型的如 k3s;但是服务网格作为容器平台的重要网络扩展,并没有很快的跟上这个趋势。事实上,目前用户很难发现针对边缘计算场景的服务网格,因此我们启动了 osm-edge 开源项目,几个重要的考量和目标是:

•支持和兼容 SMI 规范,这样可以满足用户对服务网格管理标准化的需求•对于 ARM 生态的充分支持。ARM 作为边缘计算的“一等公民”甚至首选计算平台,服务网格应该也充分适配、满足这种趋势。事实上,osm-edge 是遵循 “ARM First” 的策略,也就是所有的功能都是优先在 ARM 平台完成开发、测试,并具备交付能力•高性能且低资源。服务网格作为基础设施,在边缘侧应该使用更少的资源(CPU/MEM)同时交付更高的性能(TPS/Latency)

采用的技术

从设计视角,osm-edge 主要包括如下几个大的功能领域;同时从实现角度,我们选择了对应的组件和技术:

•兼容 SMI 规范且轻量易用的控制平面。这个环节我们选择了 osm[10],选择的理由是包括支持 SMI 规范、轻量化、易用。该组件主要功能包括:1.兼容和支持 SMI 规范2.单一 k8s 集群内的东西流量的配置3.流量拦截和 sidecar 的注入4.证书管理•轻量化、高性能、低资源的 sidecar 代理。这个环节我们选择了 pipy[11],该组件主要的功能包括:1.支持 SMI 规范所需要的各种网络功能,如代理、路由、负载均衡、多路复用、故障迁移2.支持微服务所需要的各种功能,如服务发现、流量标签/灰度发布、熔断、降级、限流、限速3.支持应用网络所需要的各种功能,如链路加解密、内容加验签4.对 MQTT 的良好支持,MQTT 作为边缘计算的重要协议之一,服务网格在边缘计算场景下,应该像支持 HTTP 一样的支持 MQTT5.对多路复用的支持,在某些场景下,POP 点和云端连接的网络可能是窄带和不稳定的,多路复用网络技术可以很好的支持数据的快速、稳定传输•南北流量管理和跨集群能力。这个环境我们选择了集成 fsm[12],该组件可以使用 osm 标准客户端部署,完成的功能主要包括:1.Ingress/Egress 和 Gateway API 的支持2.跨容器集群的服务发现和路由策略管理3.跨集群流量调度和故障迁移

架构

65b93578511044b37a843123a67f7223.jpeg

从控制平面的视角,对于熟悉 osm 架构的用户,osm-edge 在 osm 基础上扩展、替换、增加了如下组件:

•Sidecar driver:该组件实现了sidecar和控制平面接口标准化,用户可以选择不同的 sidecar proxy 实现。该组件默认采用 Pipy proxy[13]•Pipy sidecar:该组件替换了标准 osm 的 Envoy proxy;同时作为兼容,用户可以通过 sidecar driver 配置使用 envoy 或者其他的 sidecar proxy•Ingress:该组件来源于 fsm[14],提供了标准的 ingress 和 Gateway API

我们已经向 osm 社区提交了 Sidecar driver 设计的 proposal[15],以增强 osm 在代理控制平面的开放性设计。有了 sidecar dirver 的引入,各家代理厂商可以提供针对不同代理的实现,使 osm 可以支持多重不同的数据平面代理。

快速体验

以下演示如何在 5 分钟之内,下载、安装、运行 osm-edge,并部署一个演示应用,并完成链路加密、访问控制、流量分割等 SMI 标准功能。该演示使用 x86 版本的 Ubuntu 21,运行v1.23.8+k3s1版本的 k3s。更多版本和平台的支持,请参考完整的新手上路文档[16]

先决条件

一个运行中的 Kubernetes 集群,可以通过下面的命令快速创建 k3s 单节点集群:

export INSTALL_K3S_VERSION=v1.23.8+k3s1
curl -sfL https://get.k3s.io | sh -s - --disable traefik --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config

osm-edge 支持的最低 Kubernetes 版本为 1.19。

下载并安装 osm-edge 命令行工具

system=$(uname -s | tr [:upper:] [:lower:])
arch=$(dpkg --print-architecture)
release=v1.1.0
curl -L https://github.com/flomesh-io/osm-edge/releases/download/${release}/osm-edge-${release}-${system}-${arch}.tar.gz | tar -vxzf -
./${system}-${arch}/osm version
cp ./${system}-${arch}/osm /usr/local/bin/

在 Kubernetes 上安装 osm-edge

此命令启用 Prometheus[17]、Grafana[18] 和 Jaeger[19] 集成

export osm_namespace=osm-system 
export osm_mesh_name=osm osm install \--mesh-name "$osm_mesh_name" \--osm-namespace "$osm_namespace" \--set=osm.enablePermissiveTrafficPolicy=true \--set=osm.deployPrometheus=true \--set=osm.deployGrafana=true \--set=osm.deployJaeger=true \--set=osm.tracing.enable=true

部署演示应用

演示应用包括了如下服务:

bookbuyer 是一个 HTTP 客户端,它发送请求给 bookstore。这个流量是允许的。•bookthief 是一个 HTTP 客户端,很像 bookbuyer,也会发送 HTTP 请求给 bookstore。这个流量应该被阻止。•bookstore 是一个服务器,负责对 HTTP 请求给与响应。同时,该服务器也是一个客户端,发送请求给 bookwarehouse 服务。这个流量是被允许的。•bookwarehouse 是一个服务器,应该只对 bookstore 做出响应。bookbuyer 和 bookthief 都应该被其阻止。•mysql 是一个 MySQL 数据库,只有 bookwarehouse 可以访问。

使用如下命令部署这些服务:

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse
osm namespace add bookstore bookbuyer bookthief bookwarehouse
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookbuyer.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookthief.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookstore.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/bookwarehouse.yaml
kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/apps/mysql.yaml

把每个服务的GUI端口对外暴露,这样用浏览器我们可以访问这些端口,观察演示的现象。

git clone https://github.com/flomesh-io/osm-edge.git -b main
cd osm-edge
cp .env.example .env
./scripts/port-forward-all.sh #可以忽略错误信息

在一个浏览器中,打开下面的 URL:

注意:如果需要从宿主机访问,需要将 localhost 替换成虚拟机的 IP 地址;或者在宿主机上运行 port-forward-all.sh脚本。

•http://localhost:8080 - bookbuyer•http://localhost:8083 - bookthief•http://localhost:8084 - bookstore

访问控制

通过上面的命令安装 osm-edge,所有的服务都是没有访问控制的(宽松流量模式),或者说所有的访问都是允许的。通过在浏览器中观察每个服务的页面数量增长可以看到没有访问控制时候的情况:

在 bookbuyerbookthief UI 中的计数分别对应了购买和盗窃的书籍数量,而在 bookstore-v1 中这些都应该在增加:

•http://localhost:8080 - bookbuyer•http://localhost:8083 - bookthief

在 bookstore UI 中的对于书籍销售的计数也应该在增加:

•http://localhost:8084 - bookstore

接下来演示通过禁用宽松流量策略模式,拒绝对 bookstore 服务的访问:

kubectl patch meshconfig osm-mesh-config -n osm-system -p '{"spec":{"traffic":{"enablePermissiveTrafficPolicyMode":false}}}'  --type=merge

此时会发现计数将不再增加。

现在执行下面的命令,放行 bookbuyer 对 bookstore 的访问:

kubectl apply -f https://raw.githubusercontent.com/flomesh-io/osm-edge-docs/main/manifests/access/traffic-access-v1.yaml

这里再去查看 bookbuyer 和 bookstoreUI,会发现计数恢复增加,而 bookthiefUI 的计数仍然停止。

通过访问控制,我们成功阻止 bookthief从 bookstore 盗窃书籍,而正常的购买不受影响。

可观测性

Metrics

使用下面的命令开启命名空间下的 metrics 采集,否则前面创建的 Pod 产生的 metrics 并不会被采集:

osm metrics enable --namespace "bookstore,bookbuyer,bookthief,bookwarehouse"

在执行了端口转发脚本之后,在浏览器中打开 http://localhost:3000 可以访问已经安装的 Grafana,默认的用户名和密码分别为 adminadmin

osm-edge 内置了多个 dashboard 提供控制平面和数据平面各项指标的可视化展示。比如下图中展示的是 bookthief 服务的 pod http://localhost:3000 访问其他 service 的指标:

c82935425a3d750148093ec773fbefa9.png

下图展示的是 bookthief 以 deployment 为粒度,访问其他 service的指标。与上个图的差别在于,假如 bookthief 有多个副本,这里会展示所有副本的汇总数据:

2fab54a096fe4b018c05da837aef969c.png

接下来展示的 osm-edge 组件、以及网格基础信息等的指标:

69e69b17800f9165690a142f867fcb9f.png

Tracing

在浏览器中输入 http://localhost:16686/search 可访问 Jaeger 的仪表板:

a44c297567b78c67258c1ae401a6de00.png

仪表板中可以查询服务相关的 tracing 信息:

d350da2386b5d54da7334de8f33363c3.png

展示服务拓扑图:

326b0eae6eb26f250c97f317838ccccb.png

Logging

osm-edge 控制平面将诊断日志输出到了标准输出上,用于服务网格的管理,可以通过调整日志的级别来控制日志信息的输出。输出到标准输出上的日志,可以通过日志采集工具采集聚合并存储。

卸载服务网格

在完成 osm-edge 的快速体验后,如果要卸载全部与之相关的资源,就需要删除这些示例应用和相关的 SMI 资源,并且卸载掉 osm-edge 控制平面和集群范围内的 osm-edge 资源。

删除示例应用:

kubectl delete ns bookbuyer bookthief bookstore bookwarehouse

卸载控制平面:

osm uninstall mesh

总结

通过这篇文章我们介绍了边缘计算中不断出现的多样化的需求,以及对网络基础设施带来的挑战。osm-edge 将服务网格向边缘进一步延伸,使得原本在中心云计算中才能使用的服务网格在边缘场景中的应用变成可能。同时 osm-edge 实现了 SMI(服务网格接口规范),提供服务网格的通用功能。阅读本文之后,可能会发现边缘服务网格实际上不仅仅用于边缘计算,中心云计算大规模、高密度的部署同样适合。

在下一篇文章中,将通过数据平面的基准测试来为大家呈现 osm-edge 如何以高性能、低资源特性应对边缘计算的基础网络需求。

引用链接

[1] osm: https://github.com/openservicemesh/osm
[2] Pipy: https://github.com/flomesh-io/pipy
[3] SMI: https://github.com/servicemeshinterface/smi-spec
[4] fsm: https://github.com/flomesh-io/fsm
[5] k3s: https://k3s.io/
[6] k8e: https://getk8e.com
[7] 仓库地址: https://github.com/flomesh-io/osm-edge
[8] osm-edge 文档中心: https://osm-edge-docs.flomesh.io
[9] tyrael@flomesh.io: mailto:tyrael@flomesh.io
[10] osm: https://github.com/openservicemesh/osm
[11] pipy: https://github.com/flomesh-io
[12] fsm: https://github.com/flomesh-io/fsm
[13] Pipy proxy: https://github.com/flomesh-io
[14] fsm: https://github.com/flomesh-io/fsm
[15] Sidecar driver 设计的 proposal: https://github.com/openservicemesh/osm/issues/4874
[16] 新手上路文档: https://osm-edge-docs.flomesh.io/docs/getting_started/
[17] Prometheus: https://github.com/prometheus/prometheus
[18] Grafana: https://github.com/grafana/grafana
[19] Jaeger: https://github.com/jaegertracing/jaeger

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

powershell获取exe文件返回值

一、目的 1.powershell能简单写一些小脚本,不需要exe开发这么笨重。 2.在windows实现某个特定功能,做成一个exe能方便查看管理。 二、实现 1.C# code 运行结束加入返回值 Environment.ExitCode 1; //自定义数字 2.powershell 调用并获取 需要增加…

活水亭观书有感其一_如何将iPad置于“信息亭”模式,将其限制为单个应用程序...

活水亭观书有感其一An iPad makes a great “kiosk” device–a tablet restricted to one specific app for your home or small business. You can create a makeshift kiosk using the Guided Access feature, or enable Single App Mode for a true kiosk environment. iPa…

powershell 特殊符号处理

显示字符串有双引号 “ 两个双引号产生一个双引号,这里不包括最外层的双引号。 $a"PowerShell" """My name is $a"",this program said." 使用转义字符 转义序列由反引号定义,也就是键盘F1下面与波浪线同键…

IDEA 学习笔记之 安装和基本配置

安装和基本配置: 下载:https://www.jetbrains.com/idea/download/#sectionwindows 下载Zip安装包: 基础知识: Eclipse的工作区IDEA的项目 Eclipse的项目IDEA的模块 修改信息提示:Alt/ 关闭当前窗口:CtrlW 自…

大厂高级前端面试题答案

阿里 使用过的koa2中间件https://www.jianshu.com/p/c1e... koa-body原理https://blog.csdn.net/sinat_1... 有没有涉及到Clusterhttp://nodejs.cn/api/cluster.... 介绍pm2PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控…

js app缓存自动刷新_如何通过清除缓存来刷新App Store中的内容

js app缓存自动刷新Are you finding that you’re not seeing new apps on the App Store, or that updates to apps won’t go away even after you’ve installed the updates? Here’s a simple fix. 您是否发现自己在App Store上没有看到新的应用程序,或者即使…

用最少的代码,写一个智能会议APP(MAUI)

Xamarin和MAUI移动开发是.NET核心方向之一,国外社区资源非常丰富,影响力挺大的。而国内则资源很是欠缺,GitHub上的国产开源案例太少了。随着小米/美的/碧桂园等WPF招聘大户开始要求移动开发,不少群友都在找相关资源。这里分享一套…

word多级列表修改编号_如何更改在Word中的编号列表中使用的数字类型

word多级列表修改编号By default, Word uses Arabic numbers (1, 2, 3, etc.) when you create numbered lists. However, you can change the numbers to a different type or to letters. The character after the number or letter can also be changed. 默认情况下&#xf…

微服务学习笔记

微服务是一种架构模式或者说是一种架构风格,他提倡将单一的应用程序划分为一组小的服务,每个服务运行在其独立的进程中,服务之间互相协调,互相配合,为用户提供最终价值。dubbo与spring Cloud之间的区别之一是dubbo基于…

每小时50哈希——看看一个内部员工是如何摧毁整个公司网络的?

本文讲的是每小时50哈希——看看一个内部员工是如何摧毁整个公司网络的?,我们以前曾调查过黑客会通过连接在USB端口的正在充电的手机实施攻击,在这项研究中,我们重新审视了USB端口的安全性。我们发现,手机充电时&#…

推荐一款 在线+离线数据 同步框架 Dotmim.Sync

移动智能应用可以分为在线模式、纯离线模式与“在线离线”混合模式。在线模式下系统数据一般存储在服务器端的大中型数据库(如 SQL Server、Oracle、MySQL 等),移动应用依赖于稳定可靠的网络连接;纯离线模式下系统数据一般存储在移…

如何在Windows 10中将您喜欢的设置固定到开始菜单

If you find you’re accessing the same settings over and over in Windows 10, you can add these settings to the Start menu as tiles for quick and easy access. We’ll show you how to do this. 如果发现要在Windows 10中反复访问相同的设置,则可以将这些…

20155202《网络对抗》Exp9 web安全基础实践

20155202《网络对抗》Exp9 web安全基础实践 实验前回答问题 (1)SQL注入攻击原理,如何防御 SQL注入产生的原因,和栈溢出、XSS等很多其他的攻击方法类似,就是未经检查或者未经充分检查的用户输入数据,意外变成…

MVC Html.AntiForgeryToken() 防止CSRF***

MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)***的一个措施,它跟XSS(XSS又叫CSS:Cross-Site-Script),***不同,XSS一般是利用站内信任的用户在网站内插入恶意的脚本代码进行***,而CSRF则是伪造成受信任用户对网站进行***…

如何反序列化派生类

前言上回,我们讲解了《如何序列化派生类》。那如何反序列化派生类呢?假设有一个 Person 抽象基类,其中包含 Student 和 Teacher 派生类:public class Person {public string Name { get; set; } }public class Student : Person {…

目标跟踪 facebook_如何关闭Facebook Messenger的位置跟踪(如果已启用)

目标跟踪 facebookIt seems like everyone is tracking our location now. Not surprisingly, Facebook Messenger can also transmit a significant amount of information on your location activity. If you use Messenger, here’s how to make sure it’s not reporting y…

云计算基础知识:CPU虚拟化

虚拟化技术的分类主要有服务器虚拟化、存储虚拟化、网络虚拟化、应用虚拟化。服务器虚拟化技术按照虚拟对象来分,可分为:CPU虚拟化、内存虚拟化、I/O虚拟化;按照虚拟化程度可分为:全虚拟化、半虚拟化、硬件辅助虚拟化。将不同的虚拟化对象和程…

头脑风暴 软件_头脑风暴和思维导图的最佳网站和软件

头脑风暴 软件A mind map is a diagram that allows you to visually outline information, helping you organize, solve problems, and make decisions. Start with a single idea in the center of the diagram and add associated ideas, words, and concepts connected ra…

NULL的陷阱:Merge

NULL表示unknown,不确定值,所以任何值(包括null值)和NULL值比较都是不可知的,在on子句,where子句,Merge或case的when子句中,任何值和null比较的结果都是false,这就是NULL…

Python实现将不规范的英文名字首字母大写

Python实现将不规范的英文名字首字母大写 这篇文章给大家主要介绍的是利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。文中给出了三种解决方法,大家可以根据需要选择使用,感兴趣的朋…