kubernetes ingress-nginx原理

Ingress 英文翻譯 進入;進入權;進食,更準確的講就是入口,即外部流量進入k8s集羣必經之口。這道大門到底有什麼做用?咱們如何使用Ingressk8s又是如何進行服務發現的呢?先看一張圖:
html

原理

雖然k8s集羣內部署的podserver都有本身的IP,可是卻沒法提供外網訪問,之前咱們能夠經過監聽NodePort的方式暴露服務,可是這種方式並不靈活,生產環境也不建議使用。Ingresssk8s集羣中的一個API資源對象,扮演邊緣路由器(edge router)的角色,也能夠理解爲集羣防火牆集羣網關,咱們能夠自定義路由規則來轉發、管理、暴露服務(一組pod),很是靈活,生產環境建議使用這種方式。另外LoadBlancer也能夠暴露服務,不過這種方式須要向雲平臺申請負債均衡器;雖然目前不少雲平臺都支持,可是這種方式深度耦合了雲平臺,因此你懂的。前端

首先咱們來思考用傳統的web服務器,好比Nginx,如何處理這種場景?
Nginx充當一個反向代理服務器攔截外部請求,讀取路由規則配置,轉發相應的請求到後端服務。nginx

kubernetes處理這種場景時,涉及到三個組件git

  1. 反向代理web服務器
    負責攔截外部請求,好比NginxApachetraefik等等。我通常以Deployment方式部署到kubernetes集羣中,固然也能夠用DeamonSet方式部署;這兩種部署方式我的以爲有利有弊,感興趣的請參考這篇文章,這裏就不敖述了。
  2. Ingress controller
    k8s中的controller有不少,好比CronJobDeamonSetDeploymentReplicationSetStatefulSet等等,你們最熟悉的應該是Deployment(嘿嘿,我也是),它的做用就是監控集羣的變化,使集羣始終保持咱們指望的最終狀態(yml文件)。同理,Ingress controller的做用就是實時感知Ingress路由規則集合的變化,再與Api Server交互,獲取ServicePod在集羣中的 IP等信息,而後發送給反向代理web服務器,刷新其路由配置信息,這就是它的服務發現機制。
  3. Ingress
    定義路由規則集合,上面已經詳細介紹,這裏就再也不敖述了。

通過上面的剖析,知道了吧,若是咱們僅僅建立Ingress對象,只是定義了一系列路由規則集合而已,沒有任何做用,不要想得太簡單了,嘿嘿github

Ingress 選型

這個我花費了很多時間,最終選用的是Traefik,它是一個用Golang開發的輕量級的Http反向代理和負載均衡器,雖然相比於Nginx,它是後起之秀,可是它自然擁抱kubernetes,直接與集羣k8s的Api Server通訊,反應很是迅速,實時感知集羣中Ingress定義的路由規則集合和後端ServicePod的變化,自動熱更新Traefik後端配置,根本不用建立Ingress controller對象,同時還提供了友好的控制面板和監控界面,不只能夠方便地查看Traefik根據Ingress生成的路由配置信息,還能夠查看統計的一些性能指標數據,如:總響應時間、平均響應時間、不一樣的響應碼返回的總次數等,Traefik部署請參考官網用戶示例Kubernetes Ingress Controller。不只如此,Traefik還支持豐富的annotations配置,可配置衆多出色的特性,例如:自動熔斷負載均衡策略黑名單白名單;還支持許多後端存儲,如:zookeeper、eureka、consul、rancher、docker等,它會自動感知這些統一配置中心的變化,熱更新本身的路由配置,因此Traefik對於微服務來講簡直就是一神器啊,嘿嘿。那麼Traefik性能又如何呢?容器化部署,還擔憂性能,不要這麼搞笑,好嗎。而Nginx在擁抱kubernetes這方面比較後知後覺,詳情請參考官方網站和開源項目ingress-nginx ;另外微軟開源的微服務示例項目 eShopOnContainers 採用了ingress-nginx,你們能夠下去自行研究。web

Traefik 
算法

示例說明

使用Ingress暴露微服務

apiVersion: extensions/v1beta1 kind: Ingress metadata:  labels:  app: light  component: frontend  name: light-edge-router  namespace: geekbuying-light  annotations: kubernetes.io/ingress.class: "traefik" ingress.kubernetes.io/ssl-redirect: "false" traefik.frontend.rule.type: "PathPrefixStrip" traefik.ingress.kubernetes.io/frontend-entry-points: "http,https" traefik.ingress.kubernetes.io/priority: "3" spec:  rules:  - host: <hostdomain literal>  http:  paths:  - path: /api/v1/light  backend:  serviceName: aggregation-light-api  servicePort: 80  - path: /api/v1/identity  backend:  serviceName: identity-api  servicePort: 80

很是重要docker

  1. 當咱們定義額外的路由時,好比這裏的/api/vi/identity,必須添加這個traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip註解傳遞路徑,不然會看不到任何效果;ingress.kubernetes.io/ssl-redirect: "false"是否強制使用https,其餘的配置信息,請查看詳情。另外,不一樣的Ingress選型,請參照各自的組件說明。
  2. 其餘命名空間下的服務發現規則爲:[serviceName].[namespace]:[port],如:exceptionless-ui.geekbuying-light-addons:80(備註:端口80能夠省略,其餘端口不能省略),表示查找geekbuying-light-addons命名空間下的exceptionless-ui服務,並匹配端口。

特性配置

traefik支持強大的annotations配置,須要添加到kubernetes相應資源對象的annotations下面。至於具體配置到的哪一個對象,先弄清楚三個概念:後端

  • EntryPoint(入口點)
    顧名思義,這是外部網絡進入traefik的入口,咱們上面就是經過監聽主機端口攔截請求。api

  • FrontEnd(前端)
    traefik攔截請求後,會轉發給FrontEnd。前端定義EntryPoint映射到BackEnd的路由規則集,字段包括HostPathHeaders 等,匹配請求後,默認經過加權輪詢負載算法路由到一個可用的BackEnd,而後進入指定的微服務,這就是服務發現。

    備註:這些路由規則能夠來自不一樣的後端存儲,如Kubernetes、zookeeper、eureka、consul等,Kubernetes使用的Ingress資源對象定義路由規則集。建議你們自行去官網學習Kubernetes Ingress Backend

  • BackEnd(後端)
    一組http服務集,kubernetes中對應一個service對象下的一組pod地址。對於後端的服務發現,可配置負載均衡策略熔斷器等特性。

一個後端service對象的配置例子

apiVersion: v1 kind: Service metadata: annotations: traefik.backend.circuitbreaker: NetworkErrorRatio() > 0.5 traefik.backend.loadbalancer.method: drr labels: app: light component: identity name: identity-api namespace: geekbuying-light spec: ports: - port: 80 selector: app: light component: identity type: webapi

效果圖

控制面板

前端優先級、後端熔斷器和負載均衡策略

監控界面

總結

綜上所述,首先部署擁抱k8s的反向代理服務器(treafik、nginx等)攔截請求,而後攔截的請求會根據Ingress定義的路由規則集,轉發到集羣內部對應的Service

 

 

原文:https://www.cnblogs.com/justmine/p/8991379.html

相關文章
相關標籤/搜索