一文讀懂 “云原生網關” 演進史
Hello folks,我是 Luga,今天我們來聊一下云原生網關的歷史演進歷程:從 Ingress 到 Gateway API。
眾所周知,Kubernetes 網絡格局正在發生深刻的變化。傳統的 Kubernetes Ingress 方法正在被一種更強大、更靈活、更具擴展性的標準所補充,甚至在某些情況下被其取代:Kubernetes Gateway API。
1.云原生網關發展歷史點滴
眾所周知,在云原生生態體系下,Kubernetes 事實上已成為編排和管理容器化應用程序的首選平臺,其核心能力之一是網絡流量管理。因為網絡的高效管理對于確保這些應用程序的性能和可用性至關重要。然而,在處理 Kubernetes 網絡的復雜性通常會導致 Ingress 方法面臨諸多挑戰。雖然 Ingress 是當前管理集群服務外部流量的標準方法,但在復雜的環境中,往往需要依賴自定義注釋和自定義資源定義 (CRD) 來實現所需的操作,從而無疑增加了管理難度和維護成本。
傳統的 Ingress 控制器提供了基本的 HTTP 路由功能,但在面對更復雜的流量管理需求時,其靈活性和擴展性顯得力不從心。用戶不得不通過添加各種自定義注釋或引入額外的 CRD 來實現高級功能,如細粒度的流量控制、安全策略、多租戶隔離等。這種方式不僅增加了配置的復雜性,還可能導致不同環境下的行為不一致,進而影響系統的穩定性和可維護性。
Kubernetes Gateway API 帶來了令人期待的變革。作為一種更現代化的解決方案,Gateway API 提供了一個基于角色的、適應性強的框架,與使用 Kubernetes 服務網絡的組織角色保持一致,簡化了網絡管理和流量控制。Gateway API 不僅保留了 Ingress 的優點,還在多個方面進行了改進和擴展。它提供了更豐富的路由功能,支持多種協議和高級流量管理策略,能夠更好地適應復雜的微服務環境和高并發場景。
此外,Gateway API 注重安全性和可擴展性,通過細粒度的策略控制和靈活的配置選項,確保在多租戶環境下的資源隔離和安全性。它引入了控制平面和數據平面的分離,允許不同團隊基于各自的角色和職責,獨立管理和配置流量策略。這不僅提高了系統的可維護性和可擴展性,還增強了團隊協作的效率。
2.Ingress :讓 Kubernetes 流量管理變得簡單
在 Kubernetes 中,Ingress 是一個關鍵的 API 對象,通常被用于管理集群中服務的外部 IP 訪問。其主要功能是將外部的 HTTP 和 HTTPS 流量路由到集群內的相應服務,從而提供了一種將外部請求引導至內部應用的簡便方式。通過定義一組規則,Ingress 資源控制了這些流量的路由路徑,可以實現多種復雜的流量管理需求。
Ingress 資源不僅支持基本的 HTTP 和 HTTPS 路由,還可以配置為提供服務的 SSL/TLS 終止,這意味著它可以處理加密流量并在入口點解除加密,從而減輕后端服務的負擔。此功能在保證數據傳輸安全的同時,提升了系統的整體性能。此外,Ingress 還支持流量負載平衡,通過將外部請求均勻分配到多個后端服務實例上,確保了服務的高可用性和可靠性。它還能提供外部可訪問的 URL,使得用戶可以通過域名直接訪問集群中的服務,簡化了對外服務的配置和管理。
基于名稱的虛擬托管也是 Ingress 的一大特點。通過配置不同的域名和路徑,Ingress 可以將來自同一入口點的流量路由到不同的服務,從而實現同一 IP 地址上的多服務托管。這對運行多個微服務的應用架構尤其有用,可以顯著簡化外部流量的管理。
Ingress 的功能實現通常依賴于 Ingress 控制器。Ingress 控制器是一種專門的組件,它負責監控 Ingress 資源的變化并相應地配置底層負載均衡器或其他前端設備。雖然負載均衡器是最常見的 Ingress 控制器實現方式,但它也可以配置其他前端設備(例如邊緣路由器)來協助管理流量。這種靈活性使得 Ingress 能夠適應各種不同的網絡拓撲和需求場景。
通過使用 Ingress,用戶可以集中管理集群內的服務訪問,避免了在每個服務上公開節點 IP 或者為每個服務創建單獨的負載均衡器。這不僅簡化了配置管理,還降低了資源消耗和運營成本。因此,Ingress 被廣泛應用于 Kubernetes 集群中,成為了管理外部流量訪問的標準方法。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: devops-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /api
backend:
serviceName: api-service
servicePort: 8080
- path: /web
backend:
serviceName: web-service
servicePort: 80
其實,從本質上來講,起初,Ingress 控制器被引入 Kubernetes 生態系統,以解決集群內外部流量的管理問題。Ingress 提供了一種簡潔的方式來定義路由規則,使得外部請求能夠正確地到達內部服務。通過配置 Ingress 資源,用戶可以實現基于 HTTP 和 HTTPS 的路徑路由、負載均衡以及 SSL 終止等功能。Ingress 控制器作為 Kubernetes 集群中的標準組件,被廣泛采用。
然而,隨著微服務架構的復雜性增加,Ingress 的局限性逐漸顯現。其配置方式相對簡單,難以滿足復雜路由規則和高級流量管理需求。此外,Ingress 缺乏對多租戶隔離、細粒度安全策略等功能的支持,這使得在大規模應用場景中顯得力不從心。
3.IngressRoute :解鎖 Kubernetes 流量管理的精細化密鑰
Ingress Route 作為 Kubernetes Ingress 的擴展實現,旨在解決標準 Kubernetes Ingress 功能有限的問題,為云原生應用提供更加豐富、靈活和強大的流量管理能力。它由 Kubernetes Ingress 社區獨立維護,與眾多流行的 Ingress 控制器相兼容,如 Contour、Nginx Ingress Controller、Envoy 等,為用戶提供了更廣闊的選擇空間。
標準 Kubernetes Ingress 的功能相對較為簡單,主要基于域名和 URL 路徑進行路由轉發,缺乏更高級的路由策略和協議支持。而 Ingress Route 在此基礎上做了大幅增強,提供了諸多強大的功能特性。
apiVersion: contour.heptio.com/v1
kind: IngressRoute
metadata:
name: devops-ingress-route
spec:
virtualhost:
fqdn: example.com
routes:
- match: /api
services:
- name: api-service
port: 8080
- match: /web
services:
- name: web-service
port: 80
通常而言,Ingress Route 主要解決了傳統 Ingress 對象在以下幾個方面的問題,具體可參考如下所示:
(1) 配置復雜性和靈活性
傳統 Ingress 使用標準的 Kubernetes Ingress 對象,配置較為簡單,但靈活性有限,尤其是對于復雜的流量管理需求(如多層次的路徑路由、基于頭信息的路由、加權路由等)。而 Ingress Route 則提供了更細粒度的控制和配置選項,可以定義更復雜的路由規則、流量管理策略等。
(2) TLS管理
傳統 Ingress 的 TLS 配置相對簡單,支持單一的 TLS 證書管理,無法輕松地為不同域名或路徑配置不同的 TLS 策略。而 Ingress Route 則通常支持更豐富的 TLS 配置,可以為不同的路由定義獨立的 TLS 證書和策略,從而提高了安全性和管理的靈活性。
(3) 路由規則的表達能力
傳統 Ingress 路由規則的表達能力有限,主要基于路徑前綴匹配。而 Ingress Route 則支持更復雜的路由規則,例如基于請求頭、查詢參數、路徑等多種條件的路由規則,滿足更精細的流量管理需求。
(4) 流量分配和負載均衡
傳統 Ingress 的負載均衡策略比較簡單,通常是基于輪詢等基本策略。而 Ingress Route 支持更復雜的流量分配策略,例如加權輪詢、基于請求屬性的負載均衡、流量鏡像等。
(5) 健康檢查和故障轉移
傳統 Ingress 健康檢查和故障轉移功能相對簡單。Ingress Route 則通常集成了更高級的健康檢查和故障轉移功能,能夠更有效地檢測和應對后端服務的故障。
(6) 擴展性和插件支持
傳統 Ingress 在擴展性層面支持有限,難以集成自定義的功能或第三方插件。而 Ingress Route 則通常設計為更易于擴展,可以方便地集成各種自定義功能和第三方插件,以滿足不同的業務需求。
總的來說,Ingress Route 雖然為云原生應用帶來了更加靈活和強大的流量管理能力,但也同時增加了管理和運維的復雜度。因此,在采用 Ingress Route 時,需要全面評估其帶來的好處和挑戰,并做好相應的準備工作,包括團隊技能培養、流程優化等,以確保能夠充分發揮其強大功能,并將復雜性控制在可管理的范圍內。同時,也需要根據實際需求和團隊情況,選擇合適的 Ingress 控制器,以盡可能減少不必要的復雜性。只有這樣,才能真正釋放 Ingress Route 的全部潛力,為云原生應用提供高效、可靠的流量管理服務。
4.Gateway API :云原生時代 API 管理新范式
Kubernetes Gateway API 是由 SIG-NETWORK 社區管理的一種規范或標準,旨在統一對 Kubernetes 集群中服務網絡的建模和描述方式。它提供了一種靈活且基于角色的接口,讓用戶可以更好地定義和管理 Kubernetes 服務網絡,從而優化服務暴露、流量管理和安全策略等方面的功能。
作為 Kubernetes 生態系統中的一項關鍵規范,Gateway API 為不同的網絡解決方案提供了統一的抽象層和模型語義。這種統一性使得各種網絡解決方案能夠遵循相同的模型和語義,從而極大提高了跨平臺的可移植性和可重用性。用戶無需重新學習新的操作界面和流程,只需在不同環境和平臺之間無縫切換,即可享受到相同的使用體驗。
對于支持 Gateway API 的項目和公司而言,全面遵守該規范具有重要意義。這不僅可以確保它們實現了與規范完全一致的功能和行為,而且還可以獲得 Kubernetes 社區的大力支持。Gateway API 由活躍的 Kubernetes 社區集體維護,社區中的貢獻者們不遺余力地持續優化和完善這一規范,使其能夠與 Kubernetes 生態系統的發展同步演進。因此,支持 Gateway API 的項目和公司可以借助社區的力量,及時獲得規范的更新和改進,確保其產品和服務能夠隨時與最新版本的 Gateway API 保持一致,為用戶提供始終如一的優秀體驗。
Gateway API 的推出標志著 Kubernetes 服務網絡發展的一個新里程碑,為適應現代化復雜部署環境帶來了前所未有的功能支持。這項創新性的技術為組織在 Kubernetes 環境中高效管理流量提供了全新的工具,促進了跨部門之間的無縫運營協作,為構建靈活、可擴展的云原生體系架構注入了新的動力。
然而,Gateway API 技術的真正適用性和價值體現,取決于其是否與特定組織的架構模式和運維理念相契合,是否能夠成功地在不同的團隊和部門之間合理分配工作負荷。Gateway API 的有效性仍有待在實踐中經受更多的檢驗和觀察。
毋庸置疑,傳統的 Ingress 規范一直以其簡單直觀的性質而備受青睞,這使得它在處理基本的流量管理場景時游刃有余。但是,當面臨復雜的多租戶環境、微服務架構、數據平面與控制平面解耦等現代化需求時,Ingress 規范的局限性就暴露無遺了。
與之相比,Gateway API 憑借其增強的安全性、職責分離以及更豐富的功能集,為組織提供了一種全新的選擇方案。通過將控制平面和數據平面進行邏輯上的分離,Gateway API 實現了對流量管理職責的合理劃分,使得網絡管理員和應用開發人員能夠各司其職,提高了運維效率。同時,它支持豐富的流量控制策略、安全加固機制以及與服務網格的無縫集成,為組織構建更加健壯、可靠的云原生應用系統奠定了堅實基礎。
當然,我們也需要清醒地認識到,Gateway API 作為一種新興技術,其成熟度和生態建設仍有待時日。許多組織或許會秉持保守策略,繼續選擇 Ingress 規范,除非 Gateway API 真正展現出其無可替代的優勢。但無疑,對于那些追求卓越、渴望構建下一代云原生應用平臺的組織而言,Gateway API 值得被重點關注和評估。
因此,總的來說,Gateway API 的出現為 Kubernetes 生態注入了全新的活力,為云原生架構的發展路徑提供了更多可能性。作為一種具有變革性意義的技術創新,將如何與組織內部的運維實踐、架構模式相互融合、相互影響,如何在云原生領域掀起新的發展浪潮,這一切都將是非常值得期待和關注的。
Reference :
- [1] https://traefik.io/blog/getting-started-with-kubernetes-gateway-api-and-traefik/
- [2] https://avinetworks.com/glossary/kubernetes-ingress-services/