作者|王夕寧阿里巴巴高級(jí)技術(shù)專家
在服務(wù)網(wǎng)格技術(shù)使用之前,為了更快更靈活地進(jìn)行業(yè)務(wù)創(chuàng)新,我們常常會(huì)把現(xiàn)有應(yīng)用進(jìn)行現(xiàn)代化改造,把單體應(yīng)用程序分拆為分布式的微服務(wù)架構(gòu)。通常來說,在微服務(wù)架構(gòu)模式的變遷過程中,最初都是面向代碼庫的模式。
對(duì)這些微服務(wù)治理的實(shí)現(xiàn),往往是以代碼庫的方式把這些服務(wù)治理的邏輯構(gòu)建在應(yīng)用程序本身中,這些代碼庫中包括了流量管理、熔斷、重試、客戶端負(fù)載均衡、安全以及可觀測(cè)性等這樣的一些功能。這些代碼庫隨著功能的不斷增強(qiáng),版本也隨之變更,因?yàn)榘姹静煌瑢?dǎo)致的沖突問題處處可見。此外,庫的版本一旦變更,即使你的應(yīng)用邏輯并沒有任何變化,整個(gè)應(yīng)用也要隨之全部變更。由此可見,隨著應(yīng)用的增長和團(tuán)隊(duì)數(shù)量的增加,跨服務(wù)一致地使用這些服務(wù)治理功能會(huì)變得非常復(fù)雜。
服務(wù)治理的能力Sidecar化
通過把這些服務(wù)治理的能力Sidecar化,就能夠把服務(wù)治理的能力與應(yīng)用程序本身進(jìn)行了解耦,可以較好地支持多種編程語言、同時(shí)這些Sidecar能力不需要依賴于某種特定技術(shù)框架。這就是我們常說的面向Sidecar proxy的架構(gòu)模式。
隨著這些Sidecar代理功能的增強(qiáng),原本需要在代碼庫中實(shí)現(xiàn)的服務(wù)治理功能被抽象化為一個(gè)個(gè)通用組件,并被逐漸地下沉到代理中。這些服務(wù)治理能力的標(biāo)準(zhǔn)化、統(tǒng)一化,可以解決復(fù)雜系統(tǒng)微服務(wù)實(shí)現(xiàn)中面臨的差異大、缺少共性的問題,可以很好地支持不同的編程語言、不同的框架。
通過把應(yīng)用服務(wù)通信能力抽象下沉到基礎(chǔ)設(shè)施,使得開發(fā)人員可以更加聚焦于業(yè)務(wù)應(yīng)用本身開發(fā),而讓基礎(chǔ)設(shè)施來提供這些通用的能力。
與此同時(shí),容器編排技術(shù)的更加成熟,也加速了Sidecar代理的普及與使用的便捷。Kubernetes作為一個(gè)出色的容器部署和管理平臺(tái)、Istio作為應(yīng)用服務(wù)治理的平臺(tái),兩者的結(jié)合成為了將這些應(yīng)用服務(wù)通信能力下沉到基礎(chǔ)設(shè)施的載體。
在云原生應(yīng)用模型中,一個(gè)應(yīng)用程序可能會(huì)包含數(shù)百個(gè)服務(wù),每個(gè)服務(wù)又有數(shù)百個(gè)實(shí)例構(gòu)成,那么這些成百上千個(gè)應(yīng)用程序的Sidecar代理如何統(tǒng)一管理,這就是服務(wù)網(wǎng)格中定義的控制平面部分要解決的問題。作為代理,Envoy非常適合服務(wù)網(wǎng)格的場(chǎng)景,但要發(fā)揮Envoy的最大價(jià)值,就需要使它很好地與底層基礎(chǔ)設(shè)施或組件緊密配合。
這些Sidecar代理形成一個(gè)網(wǎng)狀的數(shù)據(jù)平面,通過該數(shù)據(jù)平面處理和觀察所有服務(wù)間的流量。數(shù)據(jù)平面扮演了一個(gè)用來建立、保護(hù)和控制通過網(wǎng)格的流量的角色。
負(fù)責(zé)數(shù)據(jù)平面如何執(zhí)行的管理組件稱為控制平面。控制平面是服務(wù)網(wǎng)格的大腦,并為網(wǎng)格使用人員提供公開API,以便較容易地操縱網(wǎng)絡(luò)行為。
啟用服務(wù)網(wǎng)格之后,開發(fā)人員、運(yùn)維人員以及SRE團(tuán)隊(duì)將以統(tǒng)一的、聲明的方式解決應(yīng)用服務(wù)管理問題。
服務(wù)網(wǎng)格ASM產(chǎn)品架構(gòu)
作為業(yè)內(nèi)首個(gè)全托管Istio兼容的服務(wù)網(wǎng)格產(chǎn)品ASM,一開始從架構(gòu)上就保持了與社區(qū)、業(yè)界趨勢(shì)的一致性,控制平面的組件托管在阿里云側(cè),與數(shù)據(jù)面?zhèn)鹊挠脩艏邯?dú)立。ASM產(chǎn)品是基于社區(qū)開源的Istio定制實(shí)現(xiàn)的,在托管的控制面?zhèn)忍峁┝擞糜谥尉?xì)化的流量管理和安全管理的組件能力。通過托管模式,解耦了Istio組件與所管理的K8s集群的生命周期管理,使得架構(gòu)更加靈活,提升了系統(tǒng)的可伸縮性。
在深入分析服務(wù)網(wǎng)格方面,提供了網(wǎng)格診斷能力,把過去一年多來客戶遇到的問題以及如何解決這些問題的手段變成產(chǎn)品能力,幫助用戶快速定位遇到的問題;
在擴(kuò)展與集成方面,ASM產(chǎn)品整合阿里云服務(wù)包括可觀測(cè)性服務(wù)鏈路追蹤/日志服務(wù)/Prometheus監(jiān)控等、跨VPC網(wǎng)絡(luò)互連CEN能力等,同時(shí)也優(yōu)化整合了社區(qū)開源軟件包括OPA的支持、授權(quán)服務(wù)的定制化能力、限流服務(wù)等。
此外,隨著Istio新架構(gòu)的優(yōu)化,將WebAssembly技術(shù)引入服務(wù)網(wǎng)格,解決代理擴(kuò)展的問題。這樣一來,ASM架構(gòu)就變成了“托管的高可用彈性控制平面+可擴(kuò)展的插件式的數(shù)據(jù)平面“的模式。
在數(shù)據(jù)平面的支持上,ASM產(chǎn)品可以支持多種不同的計(jì)算基礎(chǔ)設(shè)施,這包括了阿里云提供的公有云ACK集群(其中包括了托管的K8s集群和專有K8s集群)、也包括對(duì)的無服務(wù)器Kubernetes容器服務(wù)ASK集群的支持。同時(shí),對(duì)非容器化應(yīng)用例如運(yùn)行在ECS虛擬機(jī)上的應(yīng)用服務(wù)網(wǎng)格化的支持。
此外,ASM也推出了一個(gè)支持多云混合云的能力,能夠針對(duì)外部的非阿里云K8s集群進(jìn)行支持,不論這個(gè)集群是在用戶自建的IDC機(jī)房,還是在其他的公有云之上,都可以通過ASM進(jìn)行統(tǒng)一的服務(wù)治理。
多種類型計(jì)算服務(wù)統(tǒng)一管理的基礎(chǔ)設(shè)施
接下來,將會(huì)介紹托管式服務(wù)網(wǎng)格在成為多種類型計(jì)算服務(wù)統(tǒng)一管理的基礎(chǔ)設(shè)施中,如何提供了統(tǒng)一的流量管理能力、統(tǒng)一的服務(wù)安全能力、統(tǒng)一的服務(wù)可觀測(cè)性能力、以及如何基于WebAssembly實(shí)現(xiàn)統(tǒng)一的數(shù)據(jù)面可擴(kuò)展能力。
1.統(tǒng)一的流量管理能力
關(guān)于統(tǒng)一的流量管理能力方面,重點(diǎn)講述2個(gè)方面。
第一個(gè)是基于位置實(shí)現(xiàn)流量路由請(qǐng)求。在大規(guī)模服務(wù)場(chǎng)景下,成千上萬個(gè)服務(wù)運(yùn)行在不同地域的多種類型計(jì)算設(shè)施上,這些服務(wù)需要相互調(diào)用來完成完整的功能。為了確保獲得最佳性能,應(yīng)當(dāng)將流量路由到最近的服務(wù),使得流量盡可能在同一個(gè)區(qū)域內(nèi),而不是只依賴于Kubernetes默認(rèn)提供的輪詢方式進(jìn)行負(fù)載均衡。服務(wù)網(wǎng)格應(yīng)當(dāng)提供這樣的基于位置的路由能力,一方面,可以將流量路由到最靠近的容器,實(shí)現(xiàn)本地優(yōu)先的負(fù)載均衡能力,并在主服務(wù)出現(xiàn)故障時(shí)可以切換到備用服務(wù)。另一方面,提供局部加權(quán)的負(fù)載平衡能力,能夠根據(jù)實(shí)際需要,將流量按比例拆分到不同的地域。
第二個(gè)是關(guān)于非K8s工作負(fù)載的網(wǎng)格化統(tǒng)一管理。在一個(gè)托管的服務(wù)網(wǎng)格實(shí)例中,我們可以添加若干個(gè)K8s集群,并在控制面定義路由規(guī)則的配置,也可以定義網(wǎng)關(guān)服務(wù)等。為了能夠統(tǒng)一地管理非K8s工作負(fù)載,我們通過一個(gè)WorkloadEntry的CRD來定義工作負(fù)載的標(biāo)簽以及該工作負(fù)載運(yùn)行的IP地址等信息。然后通過ServiceEntry CRD將這個(gè)工作負(fù)載注冊(cè)到服務(wù)網(wǎng)格中,并提供類似于K8s Pod的處理機(jī)制來處理這些非K8s工作負(fù)載。譬如可以通過selector機(jī)制路由到對(duì)應(yīng)的Pod或者這個(gè)非容器應(yīng)用上。
2.統(tǒng)一的服務(wù)安全能力
關(guān)于統(tǒng)一的服務(wù)安全能力,托管服務(wù)網(wǎng)格為多種不同計(jì)算基礎(chǔ)設(shè)施上的應(yīng)用服務(wù)提供統(tǒng)一的主子賬戶支持/RAM授權(quán)支持。在此基礎(chǔ)上,提供統(tǒng)一的TLS認(rèn)證與JWT認(rèn)證,支持啟用與禁用TLS認(rèn)證的簡(jiǎn)易切換、支持以漸進(jìn)方式逐步實(shí)現(xiàn)雙向TLS認(rèn)證;支持以細(xì)粒度的認(rèn)證范圍,包括namespace與workload級(jí)別。此外,服務(wù)網(wǎng)格也提供對(duì)JWT認(rèn)證能力的支持,使得這種TOKEN認(rèn)證機(jī)制不再依賴于某種特定實(shí)現(xiàn)框架就可以統(tǒng)一透出。
在RBAC授權(quán)方面,針對(duì)不同協(xié)議提供了統(tǒng)一的授權(quán)策略,可以在不同粒度上支持,包括namespace/service/port級(jí)別的授權(quán);
在審計(jì)方面,可以靈活開啟網(wǎng)格審計(jì)功能,并可以查看審計(jì)報(bào)表、查看日志記錄以及設(shè)置告警規(guī)則等;
在策略管理方面,提供了開放策略代理(OPA)的集成,用戶可以使用描述性策略語言定義相應(yīng)的安全策略。此外也提供了自定義授權(quán)服務(wù)external_auth grpc的對(duì)接。只要遵循這一接口定義,任意授權(quán)服務(wù)都可以集成到服務(wù)網(wǎng)格中。
3.統(tǒng)一的服務(wù)可觀測(cè)性
統(tǒng)一的服務(wù)可觀測(cè)性,分為3個(gè)方面。
一是日志分析能力:通過對(duì)數(shù)據(jù)平面的AccessLog采集分析,特別是對(duì)入口網(wǎng)關(guān)日志的分析,可以分析出服務(wù)請(qǐng)求的流量情況、狀態(tài)碼比例等,從而可以進(jìn)一步優(yōu)化這些服務(wù)間的調(diào)用;
二是分布式追蹤能力:為分布式應(yīng)用的開發(fā)者提供了完整的調(diào)用鏈路還原、調(diào)用請(qǐng)求量統(tǒng)計(jì)、鏈路拓?fù)?、?yīng)用依賴分析等工具,可以幫助開發(fā)者快速分析和診斷分布式應(yīng)用架構(gòu)下的性能瓶頸,提高微服務(wù)時(shí)代下的開發(fā)診斷效率;
三是監(jiān)控能力:根據(jù)監(jiān)視的四個(gè)維度(延遲,流量,錯(cuò)誤和飽和度)生成一組服務(wù)指標(biāo),來了解、監(jiān)視網(wǎng)格中服務(wù)的行為。
4.統(tǒng)一的數(shù)據(jù)面可擴(kuò)展能力
盡管sidecar代理已經(jīng)把服務(wù)治理過程中常用的一些功能進(jìn)行了封裝實(shí)現(xiàn),但它的可擴(kuò)展能力一定是必須具備的,譬如如何與已有的后端系統(tǒng)做對(duì)接,如何解決用戶的一些特定需求。這個(gè)時(shí)候,一個(gè)Sidecar代理的可擴(kuò)展性顯得尤為重要,而且在一定程度上會(huì)影響Sidecar代理的普及。
在Istio之前的架構(gòu)中,對(duì)Sidecar能力的擴(kuò)展主要集中在Mixer組件上。Sidecar代理的每個(gè)服務(wù)到服務(wù)連接都需要連接到Mixer,以進(jìn)行指標(biāo)報(bào)告和授權(quán)檢查,這樣會(huì)導(dǎo)致服務(wù)之間的調(diào)用延遲更長,伸縮性也變差。同時(shí),Envoy要求使用代理程序的編程語言C++編寫,然后編譯為代理二進(jìn)制文件。對(duì)于大多Istio用戶而言,這種擴(kuò)展能力具有一定的挑戰(zhàn)性。
而在采用了新架構(gòu)之后,Istio把代理的擴(kuò)展能力從Mixer下移到了數(shù)據(jù)平面的Envoy本身中,并且使用WebAssembly技術(shù)將其擴(kuò)展模型與Envoy進(jìn)行了合并。WebAssembly支持幾種不同語言的開發(fā),然后將擴(kuò)展編譯為可移植字節(jié)碼格式。這種擴(kuò)展方式既簡(jiǎn)化了向Istio添加自定義功能的過程,又通過將決策過程轉(zhuǎn)移到代理中而不是將其種植到Mixer上來減少了延遲。使用WebAssembly(WASM)實(shí)現(xiàn)過濾器Filter的擴(kuò)展,可以獲得以下好處:
敏捷性:過濾器Filter可以動(dòng)態(tài)加載到正在運(yùn)行的Envoy進(jìn)程中,而無需停止或重新編譯;
可維護(hù)性:不必更改Envoy自身基礎(chǔ)代碼庫即可擴(kuò)展其功能;
多樣性:可以將流行的編程語言(例如C/C++和Rust)編譯為WASM,因此開發(fā)人員可以使用他們選擇的編程語言來實(shí)現(xiàn)過濾器Filter;
可靠性和隔離性:過濾器Filter會(huì)被部署到VM沙箱中,因此與Envoy進(jìn)程本身是隔離的;即使當(dāng)WASM Filter出現(xiàn)問題導(dǎo)致崩潰時(shí),它也不會(huì)影響Envoy進(jìn)程;
安全性:過濾器Filter通過預(yù)定義API與Envoy代理進(jìn)行通信,因此它們可以訪問并只能修改有限數(shù)量的連接或請(qǐng)求屬性。
阿里云服務(wù)網(wǎng)格ASM產(chǎn)品中提供了對(duì)WebAssembly(WASM)技術(shù)的支持,服務(wù)網(wǎng)格使用人員可以把擴(kuò)展的WASM Filter通過ASM部署到數(shù)據(jù)面集群中相應(yīng)的Envoy代理中。通過自研的ASMFilterDeployment組件,可以支持動(dòng)態(tài)加載插件、簡(jiǎn)單易用、以及支持熱更新等能力。
通過這種過濾器擴(kuò)展機(jī)制,可以輕松擴(kuò)展Envoy的功能并將其在服務(wù)網(wǎng)格中的應(yīng)用推向了新的高度。
服務(wù)網(wǎng)格實(shí)踐之成熟度模型
服務(wù)網(wǎng)格作為應(yīng)用服務(wù)通信的統(tǒng)一基礎(chǔ)設(shè)施,可以(并且應(yīng)該)逐步采用。在此,我們推出了它的實(shí)踐之成熟度模型,分為了5個(gè)層次,分別為一鍵啟用、可觀測(cè)提升、安全加固、多種基礎(chǔ)設(shè)施的支持,以及多集群混合管理。這5個(gè)方面分別涵蓋了前面講述的統(tǒng)一流量管理、統(tǒng)一可觀測(cè)性、統(tǒng)一服務(wù)安全以及支持不同的計(jì)算基礎(chǔ)設(shè)施和多集群非容器化應(yīng)用的混合管理。
《Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)戰(zhàn)》讀者可免費(fèi)體驗(yàn)ASM產(chǎn)品進(jìn)行學(xué)習(xí)!點(diǎn)擊了解阿里云服務(wù)網(wǎng)格產(chǎn)品ASM:www.aliyun.com/product/servicemesh
作者簡(jiǎn)介
王夕寧阿里云高級(jí)技術(shù)專家,阿里云服務(wù)網(wǎng)格產(chǎn)品ASM及Istio on ACK技術(shù)負(fù)責(zé)人,關(guān)注Kubernetes、云原生、服務(wù)網(wǎng)格等領(lǐng)域。之前曾在IBM中國開發(fā)中心工作,曾擔(dān)任專利技術(shù)評(píng)審委員會(huì)主席,作為架構(gòu)師和主要開發(fā)人員負(fù)責(zé)參與了一系列在SOA中間件、云計(jì)算等領(lǐng)域的工作,擁有50多項(xiàng)相關(guān)領(lǐng)域的國際技術(shù)專利。著有《Istio服務(wù)網(wǎng)格技術(shù)解析與實(shí)踐》。xining.wxn alibaba-inc.com