在現(xiàn)代的微服務(wù)架構(gòu)中,應(yīng)用程序網(wǎng)絡(luò)是實現(xiàn)微服務(wù)之間分布式通信的關(guān)鍵。無論是在單個 Kubernetes 集群中部署還是跨多個集群和不同基礎(chǔ)設(shè)施環(huán)境中部署,都需要建立一個強大的應(yīng)用程序網(wǎng)絡(luò),讓微服務(wù)能夠相互交流。這種通信不僅需要高效可靠,還需要具備適應(yīng)各種逆境的韌性。
除了建立應(yīng)用程序網(wǎng)絡(luò),我們還需要監(jiān)控微服務(wù)之間的通信,即可觀察性(observability)。在微服務(wù)通信中,可觀察性非常重要,可以了解微服務(wù)之間的相互作用方式。此外,微服務(wù)之間的通信也需要安全保護(hù),通信應(yīng)當(dāng)進(jìn)行加密,防止中間人攻擊。每個微服務(wù)應(yīng)具有身份標(biāo)識,并能夠證明其與其他微服務(wù)之間的授權(quán)通信。
那么,為什么需要服務(wù)網(wǎng)格(Service Mesh)呢?為什么這些需求不能在 Kubernetes 中滿足?答案在于 Kubernetes 的架構(gòu)和設(shè)計目標(biāo)。正如之前提到的,Kubernetes 是應(yīng)用程序生命周期管理軟件,它提供了基本級別的應(yīng)用程序網(wǎng)絡(luò)、可觀察性和安全性支持,但無法滿足現(xiàn)代動態(tài)微服務(wù)架構(gòu)的需求。這并不意味著 Kubernetes 不是現(xiàn)代化的軟件,它確實是一項非常先進(jìn)和前沿的技術(shù),但它主要用于容器編排。
在 Kubernetes 中,流量管理由 Kubernetes 網(wǎng)絡(luò)代理(kube-proxy)負(fù)責(zé)。kube-proxy 在每個節(jié)點上運行,并與 Kubernetes API 服務(wù)器通信,獲取關(guān)于 Kubernetes 服務(wù)的信息。Kubernetes 服務(wù)是一種將一組 Pod 作為網(wǎng)絡(luò)服務(wù)公開的抽象層。kube-proxy 通過設(shè)置 iptables 規(guī)則,定義了如何將流量路由到對應(yīng)的端點(實際上是承載應(yīng)用程序的底層 Pod)。
這就是服務(wù)網(wǎng)格發(fā)揮作用的地方。服務(wù)網(wǎng)格通過提供高級流量管理、可觀察性和安全性功能,彌補了 Kubernetes 的不足。服務(wù)網(wǎng)格位于應(yīng)用程序?qū)?,并與微服務(wù)并行工作,攔截和管理它們之間的通信。借助服務(wù)網(wǎng)格,您可以實現(xiàn)細(xì)粒度的流量控制、收集豐富的遙測數(shù)據(jù)以實現(xiàn)可觀察性,并強制實施微服務(wù)之間的安全通信。
服務(wù)網(wǎng)格,例如 Istio、FloMesh、和 Linkerd,與 Kubernetes 緊密集成,并增強其功能,以滿足現(xiàn)代微服務(wù)架構(gòu)的要求。通過采用服務(wù)網(wǎng)格,組織可以實現(xiàn)微服務(wù)部署的增強韌性、可觀察性和安全性。
服務(wù)網(wǎng)格技術(shù)填補了 Kubernetes 在微服務(wù)架構(gòu)中先進(jìn)的應(yīng)用程序網(wǎng)絡(luò)、可觀察性和安全性方面的不足。它提供了一個強大且靈活的基礎(chǔ)設(shè)施層,與 Kubernetes 互補,使組織能夠構(gòu)建和運行具備韌性和安全性的分布式系統(tǒng)。通過采用服務(wù)網(wǎng)格,組織可以實現(xiàn)微服務(wù)部署的增強韌性、可觀察性和安全性。
分布式系統(tǒng)謬誤
當(dāng)設(shè)計分布式應(yīng)用程序時,軟件開發(fā)人員經(jīng)常會犯一些錯誤的假設(shè),這些假設(shè)被稱為"分布式系統(tǒng)的謬論"(Fallacies of a distributed system)。這些謬論最初由 L Peter Deutsch 和其他 Sun Microsystems 的工程師提出,并被廣泛接受。它們揭示了關(guān)于分布式系統(tǒng)性質(zhì)和挑戰(zhàn)的常見誤解。下面是這些謬論的總結(jié):
1. 網(wǎng)絡(luò)是可靠的:這個假設(shè)認(rèn)為網(wǎng)絡(luò)始終可用且沒有故障。然而,在現(xiàn)實中,網(wǎng)絡(luò)可能會出現(xiàn)中斷、故障或間歇性的連接問題。
2. 延遲為零:這個謬論假設(shè)網(wǎng)絡(luò)傳輸數(shù)據(jù)時沒有延遲。然而,在實際情況下,網(wǎng)絡(luò)延遲受到距離、擁塞和處理時間等因素的影響,會有不同程度的延遲。
3. 帶寬是無限的:這個假設(shè)認(rèn)為網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量沒有限制。然而,在現(xiàn)實中,網(wǎng)絡(luò)帶寬是有限的,會存在擁塞和性能降低的情況。
4. 網(wǎng)絡(luò)是安全的:這個謬論認(rèn)為網(wǎng)絡(luò)本身是安全的,能夠防止未經(jīng)授權(quán)的訪問或數(shù)據(jù)泄漏。實際上,網(wǎng)絡(luò)需要強大的安全措施來確保機密性、完整性和可用性。
5. 拓?fù)浣Y(jié)構(gòu)不會改變:這個假設(shè)認(rèn)為網(wǎng)絡(luò)的結(jié)構(gòu)和配置在時間上保持靜態(tài)不變。然而,網(wǎng)絡(luò)是動態(tài)的,節(jié)點可能加入、離開或改變連接,應(yīng)用程序需要對此進(jìn)行適應(yīng)。
6. 只有一個管理員:這個謬論認(rèn)為單個實體對整個網(wǎng)絡(luò)具有完全的控制和管理權(quán)。實際上,分布式系統(tǒng)通常涉及多個管理員,他們擁有不同的控制權(quán)和責(zé)任。
7. 傳輸成本為零:這個假設(shè)認(rèn)為在網(wǎng)絡(luò)中傳輸數(shù)據(jù)沒有任何成本。然而,在現(xiàn)實中,網(wǎng)絡(luò)基礎(chǔ)設(shè)施、帶寬使用等因素都會帶來成本。
8. 網(wǎng)絡(luò)是同質(zhì)的:這個謬論認(rèn)為網(wǎng)絡(luò)的各個組件具有相同的特性和統(tǒng)一的行為。實際上,網(wǎng)絡(luò)可能由不同類型的設(shè)備、操作系統(tǒng)、協(xié)議和能力組成。
服務(wù)治理痛點
1. 多語言、多技術(shù)棧
微服務(wù)架構(gòu)中,團(tuán)隊可能使用不同的編程語言和技術(shù)棧來開發(fā)微服務(wù)。這導(dǎo)致了多語言和多技術(shù)棧的挑戰(zhàn),需要找到一種統(tǒng)一的方式來協(xié)調(diào)不同語言的微服務(wù)之間的通信和交互。這涉及到如何選擇合適的通信協(xié)議、數(shù)據(jù)格式以及尋找跨語言的解決方案。
2. 有侵入性
傳統(tǒng)的服務(wù)治理解決方案可能需要對現(xiàn)有的微服務(wù)代碼進(jìn)行侵入性的修改或添加額外的依賴庫,以實現(xiàn)服務(wù)發(fā)現(xiàn)、負(fù)載均衡、故障轉(zhuǎn)移等功能。這樣的侵入性可能增加了開發(fā)團(tuán)隊的工作量,并且可能引入不必要的復(fù)雜性和風(fēng)險。
3. 重復(fù)建設(shè)
在大規(guī)模微服務(wù)架構(gòu)中,可能存在大量的微服務(wù)實例需要進(jìn)行服務(wù)治理。在傳統(tǒng)的方式下,每個微服務(wù)都需要重復(fù)構(gòu)建和維護(hù)自己的服務(wù)發(fā)現(xiàn)、負(fù)載均衡、故障轉(zhuǎn)移等功能,導(dǎo)致了重復(fù)建設(shè)的問題。這不僅浪費了開發(fā)資源,還增加了系統(tǒng)的復(fù)雜性和維護(hù)成本。
4. SDK 版本碎片化
當(dāng)微服務(wù)通過共享的 SDK 進(jìn)行通信時,不同微服務(wù)可能使用不同版本的 SDK。這導(dǎo)致了 SDK 版本碎片化的問題,可能會導(dǎo)致兼容性和一致性方面的挑戰(zhàn)。當(dāng)需要更新 SDK 版本或解決 SDK 中的漏洞時,需要協(xié)調(diào)和管理各個微服務(wù)的 SDK 版本,這增加了額外的復(fù)雜性和風(fēng)險。
5. 跨機房、跨地域調(diào)度
在分布式系統(tǒng)中,微服務(wù)可能部署在不同的機房或地域中。在進(jìn)行跨機房或跨地域的調(diào)度時,需要考慮網(wǎng)絡(luò)延遲、帶寬限制等因素,以確保微服務(wù)之間的通信效率和質(zhì)量。這需要一種靈活而智能的調(diào)度策略,能夠根據(jù)實際情況進(jìn)行動態(tài)的負(fù)載均衡和故障轉(zhuǎn)移。
演進(jìn)趨勢
1. 擴展性
Service Mesh 提供了一系列的功能來增強微服務(wù)的擴展性。這包括熔斷、限流、超時控制、灰度發(fā)布和故障注入等機制,以確保微服務(wù)在面對高負(fù)載、異常情況或部分故障時能夠保持穩(wěn)定和可靠。Service Mesh 支持多種通信協(xié)議,如 HTTP、gRPC、Dubbo、Thrift 等,使得這些功能可以適用于不同類型的微服務(wù)。
2. 連通性
Service Mesh 提供了強大的連接管理功能,確保微服務(wù)之間的連通性。它通過服務(wù)發(fā)現(xiàn)和負(fù)載均衡機制,使得微服務(wù)能夠自動發(fā)現(xiàn)和定位其他微服務(wù),并能夠?qū)崿F(xiàn)跨不同語言和技術(shù)棧的通信。Service Mesh 還提供了智能路由和流量控制功能,以便在微服務(wù)之間實現(xiàn)靈活的流量轉(zhuǎn)發(fā)和負(fù)載均衡策略。
3. 性能與資源
Service Mesh 關(guān)注微服務(wù)架構(gòu)的性能和資源管理。它通過優(yōu)化網(wǎng)絡(luò)通信、請求處理和數(shù)據(jù)傳輸?shù)确矫娴男阅埽岣呶⒎?wù)的響應(yīng)速度和吞吐量。同時,Service Mesh 還提供了對微服務(wù)的監(jiān)控、追蹤和日志記錄功能,以便進(jìn)行性能分析、故障排查和容量規(guī)劃等任務(wù)。通過對資源的細(xì)粒度管理和調(diào)控,Service Mesh 可以有效地提高微服務(wù)架構(gòu)的資源利用率和效率。
4. 易用性
Service Mesh 設(shè)計了一套簡潔易用的接口和控制平面,使得開發(fā)人員和運維人員可以輕松地配置、管理和監(jiān)控微服務(wù)。它提供了可視化的管理界面和命令行工具,簡化了配置和部署的流程。同時,Service Mesh 還支持自動化的服務(wù)注冊和發(fā)現(xiàn),減輕了手動管理的負(fù)擔(dān)。通過這些易用性的特點,Service Mesh 提供了一種簡單而高效的方式來管理和維護(hù)微服務(wù)架構(gòu)。
Istio & FloMesh
1. 相同點
Istio 和 FloMesh 都使用了 sidecar 模型,它們具有這些優(yōu)點:解耦服務(wù)邏輯和網(wǎng)絡(luò)治理、統(tǒng)一的通信層、動態(tài)的網(wǎng)絡(luò)治理、安全性和可觀測性增強、無侵入性。
但是在使用的同時也增加了一些損耗,具體可以從下面的示例圖中看出:sidecar 模型在服務(wù)之間進(jìn)行通訊的時候有三個 connection 需要維護(hù)。
2. 不同點
Istio 固有地支持諸如斷路、速率限制、超時控制、金絲雀部署和故障注入等機制。一旦正確安裝了 Istio,這些特性就可以開箱即用了。而 FloMesh 采取了不同的方法。它提供了一個基于 JavaScript 的可擴展性模型,允許開發(fā)人員根據(jù)他們的具體需求定制和擴展這些功能。通過編寫 JavaScript 代碼,F(xiàn)loMesh 實現(xiàn)了對這些機制的細(xì)粒度控制,給予開發(fā)人員更多的靈活性,并使其能夠根據(jù)自己的獨特需求進(jìn)行調(diào)整。
在 Istio 和 FloMesh 之間的選擇應(yīng)該基于你的具體需求和優(yōu)先事項。Istio 提供了具有廣泛內(nèi)置特性的健壯和成熟的服務(wù)網(wǎng)格解決方案,而 FloMesh 為那些尋求對其服務(wù)網(wǎng)格功能進(jìn)行細(xì)粒度控制的人提供了更可定制的方法。考慮諸如易用性、開發(fā)靈活性。
看看下面的圖或許就能夠理解了設(shè)計的區(qū)別:
未來
1. Wasm sidecar
采用 WebAssembly (Wasm) sidecar 形式相對于傳統(tǒng)的 sidecar 具有以下優(yōu)勢:
跨平臺兼容性:Wasm 是一種可移植的二進(jìn)制格式,可以在不同的操作系統(tǒng)和架構(gòu)上運行。使用 Wasm sidecar 可以輕松實現(xiàn)跨平臺部署,而無需擔(dān)心依賴于特定環(huán)境的問題。
輕量高效:Wasm 代碼通常比傳統(tǒng)的 sidecar 容器更小、更輕量,因為它是一種二進(jìn)制指令格式。這使得 Wasm sidecar 在啟動時間和資源消耗方面表現(xiàn)更加高效,提供更快的響應(yīng)和更低的延遲。
安全性:Wasm 提供了一種沙箱環(huán)境,在其中運行代碼可以被有效地隔離和限制。使用 Wasm sidecar 可以增加安全性,因為它可以將應(yīng)用程序與主機環(huán)境隔離開來,防止惡意代碼的影響。
可擴展性:由于 Wasm 的靈活性,可以使用多種編程語言編寫 Wasm 模塊,而不僅僅局限于特定的編程語言或框架。這使得開發(fā)人員能夠選擇最適合他們需求的語言和工具,并提供更大的靈活性和可擴展性。
2. Ambient Mesh
通過采用每個節(jié)點的代理模型,我們能夠擺脫其中一個代理的需求,因為我們不再依賴于在每個工作負(fù)載內(nèi)運行一個附屬容器。這種轉(zhuǎn)變帶來了 ambient mesh 相對于 sidecar 模型的幾個顯著優(yōu)勢。
首先,使用 ambient mesh,我們可以減少運行在每個工作負(fù)載內(nèi)的附屬容器數(shù)量,從而減輕了系統(tǒng)的負(fù)擔(dān)和復(fù)雜性。
其次,ambient mesh 不再依賴于每個工作負(fù)載的 sidecar 容器,這意味著我們不再需要為每個工作負(fù)載額外的連接。雖然仍然需要一些額外的連接,但這比始終需要兩個額外連接要好得多。
最重要的是,ambient mesh 提供了更靈活的部署選項。由于不再需要在每個工作負(fù)載內(nèi)運行附屬容器,我們可以更輕松地將應(yīng)用程序部署到不同的環(huán)境中,而無需過多的修改。
3. eBPF
在每個工作負(fù)載中運行附屬容器會導(dǎo)致大量的代理實例,即使每個代理實例的內(nèi)存占用已經(jīng)進(jìn)行了優(yōu)化,但實例數(shù)量的增加仍會對整體系統(tǒng)造成重大影響。此外,每個代理還要維護(hù)諸如路由和終端點表等數(shù)據(jù)結(jié)構(gòu),隨著集群規(guī)模的增長,這些數(shù)據(jù)結(jié)構(gòu)也會增加,導(dǎo)致每個代理所消耗的內(nèi)存隨著集群規(guī)模的擴大而增加。為了解決這個問題,一些服務(wù)網(wǎng)格嘗試將部分路由表推送到各個代理中,以限制它們的路由范圍。
eBPF 是一種靈活的內(nèi)核擴展框架,它允許在內(nèi)核空間中執(zhí)行自定義的網(wǎng)絡(luò)過濾和處理邏輯。相比于運行在用戶空間的附屬容器,eBPF 的運行開銷更低,因為它直接在內(nèi)核中執(zhí)行,避免了用戶態(tài)和內(nèi)核態(tài)之間的頻繁切換。
采用 eBPF 而不使用附屬容器具有輕量高效、低延遲、強大的可編程性、節(jié)省系統(tǒng)資源以及簡化部署和管理的優(yōu)勢。這使得 eBPF 成為一種強大的工具,在現(xiàn)代網(wǎng)絡(luò)環(huán)境中實現(xiàn)高性能和靈活的網(wǎng)絡(luò)處理和功能成為可能。
總結(jié)
微服務(wù)架構(gòu)中的應(yīng)用程序網(wǎng)絡(luò)是實現(xiàn)微服務(wù)之間分布式通信的關(guān)鍵。為了建立高效可靠的通信,需要具備適應(yīng)各種逆境的韌性。此外,可觀察性和安全性也是微服務(wù)通信中的重要方面。
服務(wù)網(wǎng)格位于應(yīng)用程序?qū)?,與微服務(wù)并行工作,攔截和管理微服務(wù)之間的通信。它能實現(xiàn)細(xì)粒度的流量控制、收集豐富的遙測數(shù)據(jù)以實現(xiàn)可觀察性,并強制實施微服務(wù)之間的安全通信。一些常見的服務(wù)網(wǎng)格技術(shù)包括 Istio、FloMesh 和 Linkerd,它們與 Kubernetes 緊密集成,增強其功能,滿足現(xiàn)代微服務(wù)架構(gòu)的要求。
-
通信
+關(guān)注
關(guān)注
18文章
5947瀏覽量
135768 -
網(wǎng)格
+關(guān)注
關(guān)注
0文章
139瀏覽量
15985 -
微服務(wù)
+關(guān)注
關(guān)注
0文章
131瀏覽量
7322
原文標(biāo)題:Service Mesh:探索分布式系統(tǒng)的幻覺與未來
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論