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