一文搞懂 Ingress Controller 本質
今天我們來聊一下云原生生態核心技術之流量管理—— Kubernetes Ingress Controller。
什么是 Ingress Controller ?
在云原生生態中,通常來講,入口控制器( Ingress Controller )是 Kubernetes 中的一個關鍵組件,用于管理入口資源對象。
Ingress 資源對象用于定義來自外網的 HTTP 和 HTTPS 規則,以控制進入集群內服務的流量。而 Ingress Controller 則是真正實現 Ingress 規則的組件。
從更為準確的角度而言,入口控制器( Ingress Controller )管理 L4 和 L7 層請求的南北向流量,也就是我們所說的從集群外部進入或離開集群的流程。它通過解析 Ingress資源對象,配置負載調度規則,將外部請求按照域名、路徑等規則轉發到集群內后端服務 Pod 上。
而集群內服務之間的東西向流量,則由服務發現機制進行管理。例如 Pod 根據服務名稱查詢對方 Pod IP 進行通信。
我們可以從更廣泛的視角來理解這兩種流量:
- 南北向流量指集群與外部網絡交互的流量。入口控制器( Ingress Controller )負責將外部請求路由到集群,同時支持外部訪問集群內服務。
- 東西向流量指集群內各個微服務之間的調用流量。這里不需要顧慮網絡安全隔離問題,負載由服務發現機制直接調度實現。
在整個網絡拓撲架構中,兩者各司其職,形成了完整流量治理體系。入口控制器( Ingress Controller )統一入口,服務發現則實現內部流量的松耦合通訊。這樣既保證了外部訪問安全,也實現了集群內各服務的高可用調用。這對于 Kubernetes 原生應用架構調優和流量管控都大有利處。
從更為專業的角度進行補充:Ingress 本身只是一個 API 對象,定義了集群外部流量如何進入集群內各個服務的路由規則,但是它本身無法直接實現這些路由。
這里需要一個控制平面組件-入口控制器( Ingress Controller ),它監聽 Ingress 資源對象的變更,并根據 Ingress 規則進行配置。一般來說,入口控制器實現了反向代理功能,例如 Nginx Ingress 或 Traefik 等。
入口控制器( Ingress Controller )通過監聽節點的某個端口,接收集群外部流量。它將根據 Ingress 定義的規則,如域名、URL路徑、主機名等進行匹配,然后利用負載均衡技術將流量轉發至后端對應的 Pod 服務實例上。
同時,入口控制器( Ingress Controller )也可以提供更豐富的流量管理能力,諸如基于IP或用戶名密碼的訪問控制;超時重試與隔離;跨區域流量管理等。它通過對外提供統一入口,為內部服務提供安全可靠的對外訪問表現層。
一定需要入口控制器 (Ingress Controller)嗎 ?
通常,在容器云平臺,尤其是私有云環境下,Kubernetes Cluster 內各個 Pod 僅能互相訪問,但外部網絡無法直接訪問到集群內的 Pod,這樣保證了集群的安全性。
當需要對外提供服務時,我們可以創建 Ingress 資源對象來定義路由規則,比如基于域名或 URL 路徑將流量轉發到后端不同服務上。
但是 Ingress 資源本身只是一個聲明,無法直接實現流量轉發這一功能。此時需要部署一個控制平面組件 入口控制器( Ingress Controller ) Pod(如 Nginx 或者 Traefik ),它會檢測 Ingress 對象的變更,并根據 Ingress 規則配置負載均衡設備或自身作反向代理。
入口控制器( Ingress Controller )以 Pod 形式運行在集群內,從集群外部流入的請求通過 入口控制器( Ingress Controller ) 入口被轉發到后端服務上。
同時,入口控制器( Ingress Controller ) 不僅可以實現單純的循環請求分配,也支持根據目標 URL 或域名提供虛擬主機、HTTPS、認證等附加能力,充分利用其作為入口的功能。
因此,只有通過入口控制器( Ingress Controller ),才能真正意義上實現 Ingress 定義的復雜流量管理規則,同時也通過統一入口對外提供安全可靠的服務訪問能力,這就是 Ingress 實現外部訪問的標準解決方案。
入口控制器 (Ingress Controller)工作原理 ?
通常而言,入口控制器( Ingress Controller )的一般工作原理,注涉及如下,具體:
- 定義 Ingress 規則:管理員通過 Kubernetes 的 Ingress 資源對象定義流量的路由規則。Ingress 規則通常包括主機名、路徑、服務端口等信息,用于描述流量應該如何被路由。
- Ingress Controller 監聽 Ingress 資源:入口控制器( Ingress Controller )會監聽 Kubernetes Cluster 中的 Ingress 資源對象的變化。它通過與 Kubernetes API 服務器進行交互,獲取 Ingress 規則的更新和創建。
- 配置負載均衡器:入口控制器( Ingress Controller )根據 Ingress 規則中定義的信息配置負載均衡器,以便將流量分發到后端服務。這通常涉及到負載均衡器的配置和更新,以反映 Ingress 規則的變化。
- 路由流量到后端服務:一旦負載均衡器配置完畢,入口控制器( Ingress Controller )會根據 Ingress 規則將流量路由到相應的后端服務。它可能使用反向代理、 DNS 解析等技術來實現流量的轉發。
入口控制器 (Ingress Controller)能夠解決哪些問題?
通常而言,入口控制器(Ingress Controller)是一個在 Kubernetes Cluster 中運行的組件,用于管理和控制流入集群的網絡流量。其主要解決了以下幾個關鍵問題:
- 負載均衡和流量路由:入口控制器(Ingress Controller)作為反向代理,通過負載均衡和流量路由機制將流量分發到后端服務。它可以根據請求的主機名、路徑、標頭等條件將流量導向不同的服務,實現靈活的流量管理。通過負載均衡和路由,入口控制器確保服務的可用性、可靠性和性能優化。
- SSL/TLS 終止和證書管理:入口控制器(Ingress Controller)可以處理入站請求的 SSL/TLS 終止,即將加密的流量解密并轉發到后端服務。它支持在集群內部生成、管理和更新 SSL/TLS 證書,或與外部證書頒發機構(如 Let's Encrypt)集成,實現自動化的證書管理。通過 SSL/TLS 終止和證書管理,入口控制器提供了安全的通信渠道,保護用戶數據的機密性和完整性。
- 訪問控制和安全策略:入口控制器(Ingress Controller)提供了訪問控制機制,允許管理員定義和強制執行網絡流量的安全策略。它可以基于 IP 地址、網絡段、標頭、請求方法等條件來限制對后端服務的訪問。通過訪問控制和安全策略,入口控制器可以防止未經授權的訪問和惡意請求,提高系統的安全性。
- 域名管理和多租戶支持:入口控制器(Ingress Controller)允許管理員輕松管理多個域名,并將其映射到不同的服務和路徑上。這對于支持多租戶環境非常有用,可以為每個租戶分配獨立的域名和訪問路徑,實現隔離和定制化。通過域名管理和多租戶支持,入口控制器使得在同一個集群中托管多個應用程序或服務更加靈活和可管理。
- 觀測及可見性:入口控制器(Ingress Controller)通常提供豐富的監控和日志記錄功能,用于跟蹤和分析流入集群的網絡流量。它可以記錄請求和響應的詳細信息,包括響應時間、狀態碼、請求量等指標。通過監控和日志記錄,入口控制器幫助管理員了解流量模式、識別潛在問題,并進行系統性能優化。