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