做者林育新,騰訊雲容器產品工程師。目前主要負責騰訊雲TKE的控制檯的相關研發工做。前端
概述
在開源社區當中,Kubernetes 的 Ingress Controller 的實現有多種方式,Nginx Ingress 只是其中的一種實現方式,固然也是目前社區中使用量最大的一種 Ingress Controller 的實現方式,其不只功能強大,並且性能極高。本文主要介紹如何使用騰訊雲容器服務實現多種方式進行 Nginx Ingress 的部署,並會簡單介紹各類方式的實現原理以及優缺點和適用場景。nginx
Nginx Ingress 是什麼
Nginx Ingress 是 Kubernetes 的一種對象,經過nginx-ingress-controller
將用戶聲明的 nginx-ingress
轉化成 nginx 的轉發規則。其核心解決的問題是流量的轉發和東西向的負載均衡。 主要的工做原理是nginx-ingress-controller
監聽api-server
的變化(Kubernetes Informers),經過 watch Kubernetes 的 Ingress、Service、Endpoint、Secret、ConfigMap 等對象變化,更改 Nginx 實例的配置,進行流量轉發。git
目前社區中,針對於 Nginx Ingress 主要有以下的兩種實現方式github
爲何須要 Nginx Ingress
開源社區當中,對 Ingress Controller
的實現方式有多種,每一種 Controller 都有其適用的場景以及各自的優缺點,爲何推薦使用 nginx-ingress-controller
?下面咱們來探討一下,若是不使用 nginx-ingress-controller
會給業務帶來什麼困擾後端
這裏以騰訊雲容器服務控制檯(如下簡稱 TKE
)默認推薦的 ingress controller
爲例子,存在以下的一些問題:api
- CLB 類型的 Ingress 能力沒法知足現有業務的需求,如沒法共享同一個外網入口,支持默認默認轉發後端等
- 原有業務已使用了
nginx-inrgess
,而且運維已習慣於配置nginx.conf
,不但願作過多的改變
使用 nginx-ingress-controller
,可以很好地解決以上的問題。網絡
須要什麼前提條件
部署 nginx-ingress-operator
組件部署安裝
進入騰訊雲容器服務控制檯當中,選擇須要部署 Nginx Ingress
的集羣,進入集羣-組件管理當中,部署安裝 Nginx Ingess
組件,以下圖:負載均衡
組件安裝而且正常運行
部署方案
TKE 提供了多種對於nginx-ingress-controller
的部署方案以及接入 LB 的方式,適配不一樣的業務場景需求,如下會對不一樣的方案進行介紹。運維
nginx-ingress-controller 部署方案
方案一: DaemonSet + 節點池
Nginx 做爲關鍵的流量接入網關,是相當重要的組件,不建議將 Nginx 與其餘業務部署在相同的節點內,能夠經過節點池設置污點的方式,進行部署。關於節點池的相關說明,能夠查看騰訊雲容器服務節點池概述。性能
使用此部署方案,應該注意以下幾個事項:
-
提早準備好部署
nginx-ingress-controller
的節點池,同時設置節點池的污點Taint
和Label
,防止其餘 Pod 調度到該節點池。 -
確保已成功部署安裝好
nginx-ingress-operator
組件,部署方式參考上方指引 -
進入組件詳情,建立
nginx-ingress-controller
實例(單一集羣內可同時存在多個實例)
- 部署方式選擇
指定節點池DaemonSet部署
- 設置容忍污點
- 設置 Request/Limit,其中 Request 需設置比節點池的機型配置小(節點自己有資源預留,避免實例因資源不足而不可用),Limit 可不設置
- 其餘參數根據業務須要進行設置便可
- 部署方式選擇
方案二:Deployment + HPA
使用 Deployment + HPA 的方案進行部署,您能夠根據業務須要配置污點和容忍,將 Nginx 和業務 Pod 進行分散部署。搭配 HPA,設置 CPU/內存等指標進行彈性伸縮。
使用此部署方案,應該注意以下幾個事項:
-
在集羣中設置即將部署
nginx-ingress-controller
的節點的 Label -
確保已成功部署安裝好
nginx-ingress-operator
組件,部署方式參考上方指引。 -
進入組件詳情,建立
nginx-ingress-controller
實例(單一集羣內可同時存在多個實例)
- 部署方式選擇
自定義Deployment+HPA部署
- 設置 HPA 觸發策略
- 設置 Request/Limit
- 設置節點調度策略,推薦
nginx-ingress-controller
獨佔節點,避免其餘業務資源侵佔而致使不可用 - 其餘參數根據業務須要進行設置便可
- 部署方式選擇
Nginx 前端接入 LB 的部署方式
上文介紹了在 TKE 的集羣當中部署 nginx-ingress-operator
和 nginx-ingress-controller
的使用流程和部署方案建議,完成以上步驟,僅僅是在集羣內部署了 Nginx 的相關組件,但要接收外部的流量,還須要配置,還須要配置 nginx 的前端 LB。當前 TKE 已完成對 Nginx Ingress 的產品化支持,能夠根據業務須要選擇如下部署模式之一。
方案一:VPC-CNI 模式集羣使用 CLB 直通 Nginx 的 Service(推薦)
前置條件(知足其一便可):
- 集羣自身網絡插件爲
VPC-CNI
- 集羣自身網絡插件爲
Global Router
,並已開啓VPC-CNI
的支持(兩種模式混用)
咱們以節點池部署的負載示例 當前方案性能好,全部的 Pod 都使用的彈性網卡,彈性網卡的 Pod 是支持 CLB 直綁 Pod 的,能夠繞過 NodePort,而且不須要手動維護 CLB,支持自動擴縮容,是最理想的方案。
方案二:Global Router 模式集羣使用普通 LoadBalancer 模式的 Service
當前 TKE 對於 LoadBalancer 類型的 Service 默認的實現是基於 NodePort,CLB 會綁定各節點的 NodePort 做爲後端的 RS,將流量轉發到節點的 NodePort,而後節點再經過 Iptables 或 IPVS 將請求路由到 Service 對應的後端 Pod(指 Nginx Ingress Controller 的 Pod)。
您的集羣若是不支持 VPC-CNI
的網絡模式,能夠經過常規的 LoadBalancer
訪問方式的 Service 接入流量。 這是在 TKE 上部署 Nginx Ingress 最簡單的方式,流量會通過一層 NodePort,多一層轉發,但可能存在如下的問題:
- 轉發路徑較長,流量到 NodePort 後,還會再通過 Kubernetes 內部負載均衡,經過 Iptables 或 IPVS 轉發到 Nginx,會增長一點網絡耗時
- 通過 NodePort,必然會發生 SNAT,若是流量過於集中,容易致使源端口耗盡或者 conntrack 插入衝突而致使丟包,引起部分流量異常。
- 每一個節點的 NodePort 也充當一個負載均衡器,CLB 若是綁定大量節點的 NodePort,負載均衡的狀態就分散在每一個節點上,容易致使全局負載不均。
- CLB 會對 NodePort 進行健康探測,探測包最終會被轉發到 Nginx Ingress 的 Pod,若是 CLB 綁定的節點數量多於 Nginx Ingress 的 Pod,會致使探測包對 Nginx Ingress 形成較大的壓力。
方案三:使用 HostNetwork + LB
方案二雖然是最簡單的部署方式,可是流量會通過一層 NodePort,且可能存在如上所描述的問題,咱們可讓 Nginx Ingress 使用 HostNetwork,CLB 直接綁定節點 IP + 端口(80,443)。因爲使用 HostNetwork,nginx ingress
的 Pod 就不能被調度到同一個節點當中,避免端口監聽衝突。 因爲 TKE 還沒有對此方案進行產品化,能夠經過提早規劃,選擇部分節點,專門用於部署 nginx-ingress-controller
,爲節點打上 Label
,而後以 DaemonSet 的方式部署在這些節點上(即 nginx-ingress-controller
的部署方案一)。
如何集成監控
TKE 經過集成 騰訊雲容器團隊的高性能雲原生監控服務(傳送門:https://console.cloud.tencent.com/tke2/prometheus ),也可在之前發佈的文章《如何用 Prometheus 監控十萬 container 的 Kubernetes 集羣》中瞭解 Prometheus,Kvass 和怎麼利用 kvass 爲基礎的 Prometheus 集羣化技術。
綁定監控實例
查看監控數據
如何採集和消費日誌
TKE 經過集成 騰訊雲日誌服務 CLS,提供了全套完整的產品化能力,實現 nginx-ingress-controller
的日誌採集和消費能力,但須要注意以下幾個事項:
- 前置要求:確保當前集羣已開啓日誌採集功能
- 在
nginx-ingress-controller
實例中,配置日誌採集的相關選項。
總結
本文梳理了如何使用騰訊雲容器服務控制檯玩轉 Nginx Ingress,主要介紹了控制檯上的對於 nginx-ingress-controller
的兩種部署方式以及建議,以及前端接入 LB 的三種方式,除了在 TKE 上進行 Nginx Ingress 的一鍵部署,TKE 還提供集羣所部署的 nginx-ingress-controller
日誌和監控的相關能力的產品化支持。對於想要在 TKE 上使用 Nginx Ingress,本文是一個很好的參考和指引。
【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公衆號,及時獲取更多幹貨!!