本文篇幅稍長,閱讀本文將了解以下內容:
?什么是 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.跨集群流量調度和故障遷移
架構

從控制平面的視角,對于熟悉 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,所有的服務都是沒有訪問控制的(寬松流量模式),或者說所有的訪問都是允許的。通過在瀏覽器中觀察每個服務的頁面數量增長可以看到沒有訪問控制時候的情況:
在?bookbuyer
、bookthief
?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
?和?bookstore
UI,會發現計數恢復增加,而?bookthief
UI 的計數仍然停止。
通過訪問控制,我們成功阻止?bookthief
從?bookstore
?盜竊書籍,而正常的購買不受影響。
可觀測性
Metrics
使用下面的命令開啟命名空間下的 metrics 采集,否則前面創建的 Pod 產生的 metrics 并不會被采集:
osm?metrics?enable?--namespace?"bookstore,bookbuyer,bookthief,bookwarehouse"
在執行了端口轉發腳本之后,在瀏覽器中打開?http://localhost:3000
?可以訪問已經安裝的 Grafana,默認的用戶名和密碼分別為?admin
、admin
。
osm-edge 內置了多個 dashboard 提供控制平面和數據平面各項指標的可視化展示。比如下圖中展示的是?bookthief
?服務的 pod?http://localhost:3000
?訪問其他?service
?的指標:

下圖展示的是?bookthief
?以?deployment
?為粒度,訪問其他?service
的指標。與上個圖的差別在于,假如?bookthief
?有多個副本,這里會展示所有副本的匯總數據:

接下來展示的 osm-edge 組件、以及網格基礎信息等的指標:

Tracing
在瀏覽器中輸入?http://localhost:16686/search
?可訪問 Jaeger 的儀表板:

儀表板中可以查詢服務相關的 tracing 信息:

展示服務拓撲圖:

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