- Nuclio實戰及源碼分析:基于Kubernetes的Serverless FaaS平臺
- 李彬 詹煜卓 任勝寒 張晨編著
- 1593字
- 2024-08-06 16:59:57
1.3.5 路由基礎——Ingress
Kubernetes基于傳輸層通過kube-proxy服務實現了Service的對外發布及負載均衡。在實際的互聯網應用場景中,不僅要實現單純的轉發,還有更加細致的策略需求,使用真正的負載均衡器會增加操作的靈活性和轉發性能。
基于以上需求,Kubernetes引入了資源對象Ingress,它為Service提供了可直接被集群外部訪問的虛擬主機、負載均衡、SSL代理、HTTP路由等應用層轉發功能。
Ingress服務由兩部分組成。
1)Ingress控制器:將新加入的Ingress轉化成Nginx/Traefik的配置文件并使之生效。
2)Ingress服務:將Nginx/Traefik的配置抽象成一個Ingress對象,每添加一個新的服務只需寫一個新的Ingress的YAML文件即可。
Ingress控制器目前主要有兩種:一種是基于Nginx服務的Ingress控制器,另一種是基于Traefik的Ingress控制器。
(1)Nginx Ingress
Nginx Ingress由資源對象Ingress、Ingress控制器、Nginx三部分組成。Ingress控制器用以將Ingress資源實例組裝成Nginx配置文件(nginx.conf),并重新加載Nginx使配置生效。當它監聽到Service中Pod變化時通過動態變更的方式實現Nginx上游服務器組配置的變更,無須重新加載Nginx進程。Nginx Ingress的工作原理如圖1-7所示。

圖1-7 Nginx Ingress的工作原理
Ingress控制器通過同步循環機制實時監控API服務等資源對象的變化,當相關Service對應的端點列表有變化時,會通過HTTP POST請求將變化信息發送到Nginx內部運行的Lua程序進行處理,實現對Nginx upstream中后端Pod IP變化的動態修改。
每個后端Pod的IP及targetPort信息都存儲在Nginx的共享內存區域,Nginx對每個獲取的請求使用配置的負載均衡算法進行轉發,Nginx的配置中應用Lua模塊的balancer_by_lua功能實現upstream指令域的動態操作,Pod IP變化及資源對象Ingress對upstream指令域相關注解(annotation)的變化無須執行Nginx的reload操作。
當Ingress控制器監控的其他資源對象變化時,會對當前變化的內容創建Nginx配置模型。如果新的配置模型與當前運行的Nginx配置模型不一致,則將新的配置模型按照模板生成新的Nginx配置,并對Nginx執行reload操作。
Nginx配置模型避免了Nginx的無效reload操作。為避免因Nginx配置語法錯誤導致意外中斷,Ingress控制器為Nginx的配置內容提供了沖突檢測及合并機制。Ingress控制器使用了準入控制插件(Validating Admission Webhook)做驗證Ingress配置語法的準入控制,驗證通過的資源對象Ingress才會被保存在存儲服務Etcd中,并被Ingress控制器生成確保沒有語法錯誤的Nginx配置文件。
(2)Traefik
Traefik是一個開源的邊緣路由器。Traefik自動為服務發現正確的位置,將接收到的請求轉發到對應的服務。
Traefik兼容所有主要的集群技術,例如Kubernetes、Docker、Docker Swarm、AWS、Mesos、Marathon等。Traefik還可以在裸機上運行,為遺留軟件提供路由服務。Traefik兼容系統環境如圖1-8所示。

圖1-8 Traefik兼容系統環境
Traefik主要包含以下兩部分:
1)邊緣路由。
Traefik是一個邊緣路由器,這意味著它是平臺的大門,將攔截并路由每個傳入的請求。Traefik邊緣路由器邏輯功能結構如圖1-9所示。

圖1-9 Traefik邊緣路由器邏輯功能結構
Traefik管理所有的邏輯和規則,并確定哪些服務處理哪些請求(基于路徑、主機、請求頭部信息等)
2)服務自動發現。
傳統的邊緣路由器(或反向代理)需要一個包含所有可能路由到服務的配置文件,Traefik不需要手動維護而是從服務本身獲取這些配置文件。Traefik的服務自動發現如圖1-10所示。

圖1-10 Traefik的服務自動發現
這意味著當一個服務被部署時,Traefik會立即檢測到它并實時更新路由規則。類似地,當服務從基礎結構中刪除時,相應的路由也會被刪除。
下面舉例詳細說明Traefik是如何工作的。
假設已經在Kuberbetes集群上部署了一堆服務。這時需要一個服務發現系統來管理這些服務(如k8s的Etcd)。如果服務需要外部資源訪問,這時還需要配置一個虛擬的域名或者前綴路徑來配置一個反向代理。
1)API.DOMAIN.COM:指向私有網絡中微服務API的路徑。
2)DOMAIN.COM/web:指向私有網絡中Web的域名。
3)BACKOFFICE.DOMAIN.com:指向私有網絡中的微服務Backoffice,并在多實例間負載均衡。
Traefik的內部結構如圖1-11所示。
1)請求在入口點處結束,它們是Traefik的網絡入口(監聽端口、SSL、流量重定向等)。
2)之后流量會被導向一個匹配的前端。前端是定義入口點到后端之間的路由的地方。路由是通過請求字段(Host、Path、Headers等)來定義的,它可以匹配或否定一個請求。
3)前端將會把請求發送到后端。后端可以由一臺或一個通過負載均衡策略配置后的多臺服務器組成。
4)服務器轉發請求到對應私有網絡的微服務當中。

圖1-11 Traefik內部結構
- Instant Testing with CasperJS
- Android應用程序開發與典型案例
- MATLAB圖像處理超級學習手冊
- Cross-platform Desktop Application Development:Electron,Node,NW.js,and React
- JMeter 性能測試實戰(第2版)
- 軟件測試技術指南
- ANSYS Fluent 二次開發指南
- Mastering Unity 2D Game Development(Second Edition)
- 小程序,巧應用:微信小程序開發實戰(第2版)
- JavaScript程序設計(第2版)
- MySQL程序員面試筆試寶典
- 3ds Max印象 電視欄目包裝動畫與特效制作
- 計算機應用基礎項目化教程
- Clojure Polymorphism
- Mastering SciPy