官术网_书友最值得收藏!

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內部結構

主站蜘蛛池模板: 成都市| 安徽省| 青神县| 普格县| 永平县| 安徽省| 宜章县| 越西县| 临邑县| 哈尔滨市| 开原市| 历史| 吉首市| 鹤岗市| 荥经县| 虎林市| 宁远县| 邵东县| 奉节县| 民丰县| 五寨县| 德惠市| 芜湖市| 宁阳县| 兴山县| 揭阳市| 大化| 城市| 石家庄市| 正蓝旗| 县级市| 安康市| 金阳县| 措勤县| 页游| 成安县| 隆化县| 无极县| 宕昌县| 钟祥市| 滦平县|