Kubernetes 成功普及了容器集群的概念。許多用戶已經在多個集群中部署應用,組織需要運行多個 Kubernetes 集群可能來自以下原因(并非詳盡列表):
??位置
??延遲(盡可能在靠近客戶的地方運行應用程序)
??管轄權(例如,要求將用戶數據保存在國內)
??數據引力(例如,數據存在于一個供應商)。
??隔離性
??環境(例如,開發、測試、預發布、生產等)
??性能隔離(團隊之間希望互不影響)
??安全隔離(敏感數據或不被信任的代碼)
??組織隔離(團隊有不同的管理領域)。
??成本隔離(團隊希望得到不同的賬單)
??可靠性
??爆炸半徑(一個集群中的基礎設施或應用問題不會使整個系統崩潰)
??基礎設施的多樣性(底層區域、地區或供應商的故障不會導致整個系統癱瘓)。
??規模(應用程序太大,無法在單個集群中安裝)。
??升級范圍(為你的應用程序的某些部分升級基礎設施,但不是全部;避免需要在原地進行集群升級)。
目前還沒有標準的方法來連接甚至考慮超出單一集群邊界的 Kubernetes Service,Kubernetes Multicluster SIG 已經提出了提案?KEP-1645[1],以便跨多個集群擴展 Kubernetes Service 概念。
Flomesh[2]?一直在努力解決多集群通信的挑戰,將南北向流量管理能力整合到兼容 SMI 的服務網格?osm-edge[3]?中,并回饋社區。
上一篇?Kubernetes 跨集群流量調度實戰,我們對?FSM[4]?進行了簡單的介紹并演示其使用方法。我們將探索 FSM 多集群支持的動機、目標、架構、組件,以及它如何與成熟的、輕量級的、兼容 SMI 并適用于云和邊緣的服務網格?osm-edge[5]?集成。
Flomesh 服務網格
FSM[6]?是來自?Flomesh[7]?的開源產品,用于 Kubernetes 南北向流量、網關 API 控制器和多集群管理。FSM 以可編程代理?Pipy[8]?為核心,提供 Ingress 控制器、Gateway API?控制器、負載均衡器、跨集群服務注冊發現等。
動機
在為社區、商業客戶和企業提供咨詢和支持期間,我們看到了大量需求和期望(有些在文章開頭提到的),關于他們為什么要將部署拆分到多個集群中,同時保持在這些集群中運行的工作負載的相互依賴性。目前,集群是一個明顯邊界,服務對于遠端 K8s 消費者來說是不透明的,否則他們可能會使用元數據(例如端點拓撲)來更好地引導流量。用戶可能希望使用跨集群分布的服務來支持故障轉移或在集群遷移期間提供臨時的支持,然而,這都需要當今非常重的定制解決方案。
Flomesh 團隊旨在通過為這些問題提供解決方案來幫助社區。
目標
??定義一個最小的 API 來支持跨集群的服務發現和消費。
??使用另一個集群中的服務。
??將部署在多個集群中的服務作為單個服務使用。
??當一個服務被另一個集群消費時,它的行為應該是可預測的,并且與它在集群中的消費方式一致。
??允許在多集群環境中進行灰度發布。
??提供一個獨立的實現,可以在不與任何產品和/或解決方案耦合的情況下使用。
??與?osm-edge[9]?服務網格的透明集成,適用于希望通過服務網格功能獲得多集群支持的用戶。
??完全開源,歡迎社區參與貢獻。
架構
??控制平面

??osm-edge 集成 (納管集群)

FSM 為集群連接器提供了一套 Kubernetes 自定義資源(CRD),并使用?KEP-1645[10]?用于導出和導入服務的?ServiceExport
?和?ServiceImport
?API。
FSM 多集群支持已經處于 alpha 階段,歡迎從?FSM Github[11]?下載嘗試。
對 FSM 多集群方案感興趣的小伙伴,也可以關注我們在 12 月 17 日中國 DevOps 社區峰會武漢站上關于《云時代的多集群流量調度》的分享,屆時會多對方案進行深度的介紹。

總結
Kubernetes 不再局限于單一邊界,擁有多個 Kubernetes 集群的場景變得非常普遍,且沒有一種典型或標準的方式來連接多集群并提供透明的方式來跨邊界訪問服務。Kubernetes Multicluster SIG 正在研究提案,以提供一組可以由供應商實現的通用 API,并為 k8s 用戶提供一致的方式來訪問內部或外集群的服務。
在后續的文章中,我們會進一步介紹 FSM 更多場景的使用,以及 FSM 能力的黑魔法。
引用鏈接
[1]
?KEP-1645:?https://github.com/kubernetes/enhancements/tree/master/keps/sig-multicluster/1645-multi-cluster-services-api[2]
?Flomesh:?https://flomesh.io[3]
?osm-edge:?https://flomesh.io/osm-edge[4]
?FSM:?https://github.com/flomesh-io/fsm[5]
?osm-edge:?https://flomesh.io/osm-edge[6]
?FSM:?https://github.com/flomesh-io/fsm[7]
?Flomesh:?https://flomesh.io[8]
?Pipy:?https://flomesh.io[9]
?osm-edge:?https://flomesh.io/osm-edge[10]
?KEP-1645:?https://github.com/kubernetes/enhancements/tree/master/keps/sig-multicluster/1645-multi-cluster-services-api[11]
?FSM Github:?https://github.com/flomesh-io/fsm