重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用
原文:https://istio.io/blog/2020/wasm-announce/
作者:CRAIG BOX, MANDAR JOG, JOHN PLEVYAK, LOUIS RYAN, PIOTR SIKORA (GOOGLE), YUVAL KOHAVI, SCOTT WEISS (SOLO.IO)
譯者:陸培爾
編者按
Istio的架構(gòu)在1.5版本中發(fā)生了翻天覆地的變化,控制平面從微服務回歸單體,pilot、citadel、galley等控制平面組件整合成了單一的istiod二進制文件,同時飽受詬病的mixer同志終于在1.5中deprecated了,社區(qū)呼聲很高的Wasm以Proxy-Wasm plugins的方式登上歷史舞臺,官方承諾在1.6版本中提供標準的wasm插件配置API,甚至還推出了webassemblyhub這樣的類似應用商店的服務,構(gòu)建wasm plugin生態(tài)的野心不可謂不大。結(jié)合代理無關(guān)的ABI標準,只能說谷歌又在下一盤大棋。mixer的兩大核心功能,check和report,分別使用Proxy-Wasm plugins和telemetry V2替代,曾經(jīng)所謂的Mixer V2計劃也漸漸煙消云散,湮沒在歷史塵埃中。本文翻譯官方的技術(shù)博客,來一探本次的劃時代變更proxy-wasm plugin的究竟。
自2016年采用Envoy以來,Istio項目一直希望提供一個平臺,在此平臺上可以構(gòu)建豐富的擴展,以滿足用戶的多樣化需求。有很多理由可以向服務網(wǎng)格的數(shù)據(jù)平面添加功能-支持更新的協(xié)議,與專有安全控件集成或通過自定義指標增強可觀察性等。
在過去的一年半中,我們在Google的團隊一直在努力使用WebAssembly向Envoy代理添加動態(tài)可擴展性。我們很高興今天與大家分享這項工作,并推出WebAssembly (Wasm) for Proxies (Proxy-Wasm):我們打算標準化的ABI;SDK;它的第一個主要實現(xiàn)是新型的,低延遲的Istio遙測系統(tǒng)。
我們還與社區(qū)緊密合作,以確保為用戶提供良好的開發(fā)人員體驗,以幫助他們快速入門。Google團隊一直與Solo.io團隊緊密合作,他們已經(jīng)構(gòu)建了WebAssembly Hub,該服務用于構(gòu)建,共享,發(fā)現(xiàn)和部署Wasm擴展。使用WebAssembly Hub,Wasm擴展與容器一樣易于管理,安裝和運行。
這項工作今天發(fā)布了Alpha版本,還有很多工作要做,但是我們很高興將其交到開發(fā)人員手中,以便他們可以開始嘗試由此帶來的巨大可能性。
背景
Istio和Envoy項目的創(chuàng)建原則都是基于對可擴展性的需求,但是兩個項目采用了不同的方法。Istio項目的重點是啟用具有輕量級開發(fā)人員體驗的稱為Mixer的通用進程外擴展模型,而Envoy則專注于代理內(nèi)擴展。
每種方法都有其優(yōu)點和缺點。Istio模型導致嚴重的資源效率低下,從而影響了尾部延遲和資源利用率。該模型在本質(zhì)上也受到限制-例如,它永遠不會為實現(xiàn)自定義協(xié)議處理提供支持。
Envoy模型強化了整體的構(gòu)建過程,并要求使用C++編寫擴展,從而限制了開發(fā)人員生態(tài)系統(tǒng)。為集群發(fā)布新的擴展需要推入新的二進制文件并重新啟動,這可能很難協(xié)調(diào),并且會造成停機風險。這也激勵了開發(fā)人員向Envoy上游提交他們的擴展,而這些擴展僅由一小部分生產(chǎn)環(huán)境使用,只是為了肩負其發(fā)布機制。
隨著時間的流逝,Istio的一些對性能最敏感的功能已進入Envoy的上游,例如流量策略檢查和遙測報告。盡管如此,我們一直希望將單個堆棧融合以實現(xiàn)可擴展性,從而減少折衷:這使Envoy版本與其擴展生態(tài)系統(tǒng)脫鉤,使開發(fā)人員能夠使用他們選擇的語言進行工作,并使Istio可靠地推出新功能而不會造成停機風險。
什么是WebAssembly?
WebAssembly(Wasm)是一種可移植的字節(jié)碼格式,用于以接近本機的速度執(zhí)行以多種語言編寫的代碼。其最初的設計目標與上述挑戰(zhàn)很好地吻合,并且在其背后得到了可觀的行業(yè)支持。Wasm是在所有主要瀏覽器中本地運行的第四種標準語言(繼HTML,CSS和JavaScript之后),于2019年12月成為W3C Recommendation。這使我們有信心對其進行戰(zhàn)略下注。
盡管WebAssembly最初是作為客戶端技術(shù)而誕生的,但在服務器上使用它具有許多優(yōu)點。運行時是內(nèi)存安全的,并且經(jīng)過沙盒處理以確保安全。有一個大型工具生態(tài)系統(tǒng)可用于以文本或二進制格式編譯和調(diào)試Wasm。W3C和BytecodeAlliance已成為其他服務器端工作的活躍中樞。例如,Wasm社區(qū)正在W3C標準化“WebAssembly系統(tǒng)接口”(WASI),并提供一個示例實現(xiàn),該示例為Wasm“程序”提供類似于OS的抽象。
為Envoy帶來WebAssembly
在過去的18個月中,我們一直與Envoy社區(qū)合作,將Wasm可擴展性納入Envoy并在上游做出貢獻。我們很高興地宣布,此特性在Istio 1.5隨附的Envoy版本中Alpha可用,其源代碼包含在envoy-wasm開發(fā)分支中,并且正在努力將其合并到Envoy主干中。該實現(xiàn)使用內(nèi)置在Google高性能V8引擎中的WebAssembly運行時。
除了底層的運行時,我們還構(gòu)建了:
用于在代理中嵌入Wasm的通用應用程序二進制接口(ABI),這意味著編譯后的擴展將在不同版本的Envoy或其他代理(如果他們選擇實施ABI)下也可以使用
用于在C++,Rust和AssemblyScript中輕松進行擴展開發(fā)的SDK,還有更多后續(xù)更新
有關(guān)如何在Istio和獨立的Envoy中進行部署的綜合示例和說明
允許使用其他Wasm運行時的抽象,包括“空”運行時,該運行時將在本地把擴展編譯進Envoy中,這對于測試和調(diào)試非常有用
使用Wasm擴展Envoy可以為我們帶來幾個主要好處:
敏捷性:可以使用Istio控制平面在運行時交付和重新加載擴展。這樣可以快速進行擴展的開發(fā)→測試→發(fā)布周期,而無需Envoy的重啟。
標準發(fā)布:合并到主樹中之后,Istio和其他人將能夠使用Envoy的標準發(fā)布,而不是自定義版本。這也將使Envoy社區(qū)有更多的時間將某些內(nèi)置擴展遷移到該模型,從而減少其受支持的覆蓋區(qū)域。
可靠性和隔離性:擴展部署在具有資源限制的沙箱中,這意味著它們現(xiàn)在可以崩潰或泄漏內(nèi)存,而不會影響Envoy主進程。CPU和內(nèi)存使用率也可以受到限制。
安全性:沙盒具有用于與Envoy進行通信的明確定義的API,因此擴展只能訪問并修改連接或請求中有限數(shù)量的屬性。此外,由于Envoy會協(xié)調(diào)此交互過程,因此可以隱藏或清除擴展中的敏感信息(例如,HTTP標頭中的“Authorization”和“ Cookie”屬性,或客戶端的IP地址)。
靈活性:可以將30多種編程語言編譯為WebAssembly,從而使來自各種背景(C++,Go,Rust,Java,TypeScript等)的開發(fā)人員都可以使用他們選擇的語言來編寫Envoy擴展。
“看到WASM在Envoy中的支持,我感到非常興奮;這是Envoy可擴展性的未來。Envoy的WASM支持與社區(qū)驅(qū)動hub相結(jié)合,將在服務網(wǎng)格和API網(wǎng)關(guān)用例中釋放出令人難以置信的網(wǎng)絡領(lǐng)域創(chuàng)新。我迫不及待地想看到社區(qū)的建設向前發(fā)展。” –Envoy創(chuàng)作者Matt Klein。
有關(guān)實現(xiàn)的技術(shù)細節(jié),請關(guān)注即將在Envoy博客上發(fā)布的帖子。
主機環(huán)境和擴展之間的Proxy-Wasm接口有意設計為與代理無關(guān)。我們已將其內(nèi)置到Envoy中,但旨在供其他代理供應商采用。我們希望看到一個世界,您可以獲取為Istio和Envoy編寫的擴展,并在其他基礎架構(gòu)中運行它。您很快就會聽到更多有關(guān)此的信息。
在Istio中構(gòu)建WebAssembly
為了提高性能,Istio將其幾個擴展移動到了1.5版本中內(nèi)置的Envoy構(gòu)建中。在執(zhí)行此工作時,我們一直在測試以確保這些相同的擴展可以作為Proxy-Wasm模塊進行編譯和運行,而行為沒有任何變化。鑒于我們認為Wasm目前的支持為Alpha,因此我們還沒有準備好將此設置設為默認設置。然而,這使我們對通用方法以及已開發(fā)的主機環(huán)境ABI和SDK充滿了信心。
我們還非常小心地確保Istio控制平面及其Envoy配置API可以支持Wasm。我們有一些示例來說明如何執(zhí)行幾種常見的定制操作,例如定制標頭解碼或程序化路由,這是用戶的常見要求。當我們將支持轉(zhuǎn)移到Beta時,您將看到說明在Istio中使用Wasm的最佳實踐的文檔。
最后,我們正在與許多編寫了Mixer適配器的供應商合作,以幫助他們遷移到Wasm —如果這是前進的最佳途徑。Mixer將在將來的版本中轉(zhuǎn)為社區(qū)項目,在那里它將仍可用于遺留用例。
開發(fā)者體驗
沒有出色的開發(fā)人員體驗,再強大的工具也毫無用處。Solo.io最近宣布發(fā)布WebAssembly Hub,這是一套用于構(gòu)建,部署,共享和發(fā)現(xiàn)Envoy和Istio的Envoy Proxy Wasm擴展的工具和存儲庫。
WebAssembly Hub完全自動化了開發(fā)和部署Wasm擴展所需的許多步驟。使用WebAssembly Hub工具,用戶可以輕松地以任何受支持的語言將其代碼編譯為Wasm擴展。然后,可以將這些擴展上傳到Hub注冊表,并使用單個命令將其部署和取消部署到Istio。
在后臺,Hub會處理很多細節(jié)問題,例如引入正確的工具鏈,ABI版本驗證,權(quán)限控制等。該工作流程還通過自動化擴展部署,消除了跨Istio服務代理的配置更改帶來的麻煩。該工具可幫助用戶和運維人員避免由于配置錯誤或版本不匹配而引起的意外行為。
WebAssembly Hub工具提供了功能強大的CLI和優(yōu)雅且易于使用的圖形用戶界面。WebAssembly Hub的一個重要目標是簡化構(gòu)建Wasm模塊的體驗,并為開發(fā)人員提供共享和發(fā)現(xiàn)有用擴展的協(xié)作場所。
請查看入門指南,以創(chuàng)建您的第一個Proxy-Wasm擴展。
下一步
除了努力發(fā)布Beta版,我們還致力于確保圍繞Proxy-Wasm有一個持久的社區(qū)。ABI需要最終確定,而將其轉(zhuǎn)變?yōu)闃藴实墓ぷ鲗谶m當?shù)臉藴蕶C構(gòu)內(nèi)獲得更廣泛的反饋后完成。向Envoy主干提供上游支持的工作仍在進行中。我們還在為工具和WebAssembly Hub尋找合適的社區(qū)之家。
點擊?閱讀原文?查看更多
總結(jié)
以上是生活随笔為你收集整理的重新定义代理的扩展性:WebAssembly在Envoy与Istio中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Asp.Net Core 中Identi
- 下一篇: .NET Core开发实战(第22课:异