導語:在Kubernetes的實踐、部署中,爲了解決 Pod 遷移、Node Pod 端口、域名動態分配等問題,須要開發人員選擇合適的 Ingress 解決方案。面對市場上衆多Ingress產品,開發者該如何分辨它們的優缺點?又該如何結合自身的技術棧選擇合適的技術方案呢?在本文中,騰訊雲中間件核心研發工程師厲輝將爲你介紹如何進行Kubernates Ingress 控制器的技術選型。(編輯:中間件小Q妹)程序員
閱讀本文須要熟悉如下基本概念:算法
△ Kubernetes 的外部訪問方式後端
在 Kubernetes 中,服務跟 Pod IP 主要供服務在集羣內訪問使用,對於集羣外的應用是不可見的。怎麼解決這個問題呢?爲了讓外部的應用可以訪問 Kubernetes 集羣中的服務,一般解決辦法是 NodePort 和 LoadBalancer。服務器
這兩種方案其實各自都存在一些缺點:微信
在Kubernetes的實踐、部署中,爲了解決像 Pod 遷移、Node Pod 端口、域名動態分配,或者是 Pod 後臺地址動態更新這種問題,就產生了 Ingress 解決方案。markdown
Ingress 是 Kubernetes 中很是重要的外網流量入口。在Kubernetes中所推薦的默認值爲Nginx Ingress,爲了與後面Nginx 提供的商業版 Ingress 區分開來,我就稱它爲Kubernetes Ingress。網絡
Kubernetes Ingress,顧名思義基於 Nginx 的平臺,Nginx 如今是世界上最流行的 Nginx HTTP Sever,相信你們都對 Nginx 也比較熟悉,這是一個優勢。它還有一個優勢是 Nginx Ingress 接入 Kubernetes 集羣所需的配置很是少,並且有不少文檔來指引你如何使用它。這對於大部分剛接觸 Kubernetes 的人或者創業公司來講,Nginx Ingress 的確是一個很是好的選擇。架構
可是當 Nginx Ingress 在一些大環境上使用時,就會出現不少問題:負載均衡
既然發現了 Nginx Ingress 有不少問題,那是否是考慮選擇其餘開源的、更好用的 Ingress?市場上比 Kubernetes Ingress 好用的Ingress起碼有十幾家,那麼如何從這麼多 Ingress 中選擇適合本身的呢?微服務
Ingress 最終是基於 HTTP 網關的,市面上 HTTP 網關主要有這麼幾種:Nginx、Golang 原生的網關,以及新崛起的 Envoy 。可是每一個開發人員所擅長的技術棧不一樣,因此適合的 Ingress 也會不同。
那麼問題來了,咱們如何選擇一個更加好用的 Ingress 呢?或者縮小點範圍,熟悉 Nginx 或 OpenResty 的開發人員,應該選擇哪個 Ingress 呢?
下面來介紹一下我對 Ingress 控制器選型的一些經驗。
首先我認爲Ingress 控制器應該具有如下基本功能,若是連這些功能都沒有,那徹底能夠直接pass。
前面有提到,每一個人擅長的技術平臺不同,因此選擇本身更加熟悉的 HTTP 網關也顯得相當重要。好比 Nginx、HAProxy、Envoy 或者是 Golang 原生網關。由於你熟悉它的原理,在使用中能夠實現快速落地。
在生產環境上,高性能是一個很重要的特性,但比之更重要的是高可用。這意味着你選擇的網關,它的可用性、穩定性必定要很是強,只有這樣,服務才能穩定。
拋開上述兩點,就是公司業務對網關的特殊需求。你選擇一個開源產品,最好確定是開箱能用的。好比你須要 GRPC 協議轉換的能力,那固然但願選的網關具有這樣的功能。這裏簡單列一下影響選擇的因素:
相比Kubernetes Ingress,我我的更推薦 APISIX。雖然它在功能上比 Kong 會少不少,可是 APISIX 很好的路由能力、靈活的插件能力,以及自己的高性能,可以彌補在 Ingress 選型上的一些缺點。對於基於 Nginx 或 Openresty 開發的程序員,若是對如今的 Ingress 不滿意,我推薦大家去使用 APISIX 做爲 Ingress。
如何將 APISIX 做爲 Ingress 呢?咱們首先要作出一個區分,Ingress 是 Kubernetes 名稱的定義或者規則定義,Ingress controller 是將 Kubernetes 集羣狀態同步到網關的一個組件。但 APISIX 自己只是 API 網關,怎麼把 APISIX 實現成 Ingress controller 呢?咱們先來簡要了解一下如何實現 Ingress。
實現 Ingress,本質上就只有兩部份內容:
若是實現了第二部分,經過 Kubernetes Ingress 的配置,即可以很快的產生 APISIX。經過 APISIX Ingress controller 就能夠產生 APISIX 相關的配置。當前爲了快速的將 APISIX 落地爲可以支持 Kubernetes 的 Ingress ,咱們建立了一個開源項目,叫 Ingress controller。
上圖爲Ingress controller 項目的總體架構圖。左邊部分爲 Kubernetes 集羣,這裏能夠導入一些 yaml 文件,對 Kubernetes 的配置進行變動。右邊部分則是 APISIX 集羣,以及它的控制面和數據面。從架構圖中能夠看出,APISIX Ingress 充當了 Kubernetes 集羣以及 APISIX 集羣之間的鏈接者。它主要負責監聽 Kubernetes 集羣中節點的變化,將集羣中的狀態同步到 APISIX 集羣。另外,因爲Kubernetes 倡導全部組件都要具有高可用的特性,因此在 APISIX Ingress 設計之初,咱們經過雙節點或多節點的模式來保證 APISIX Ingress controller 的保障高可用。
相對於市面上流行的 Ingress 控制器,咱們簡單對比來看看 APISIX Ingress 有什麼優缺點。上圖是外國開發人員針對 Kubernetes Ingress 選型作的一張表格。我在原來表格的基礎上,結合本身的理解,將 APISIX Ingress 的功能加入了進來。咱們能夠看到,最左邊的是APISIX,後邊就是 Kubernetes Ingress 和 Kong Ingress,後面的 Traefik,就是基於 Golang 的 Ingress。HAproxy 是比較常見的,過去是比較流行的負載均衡器。Istio 和 Ambassador 是國外很是流行的兩個Ingress。
接下來咱們總結下這些 Ingress各自的優缺點:
綜上所述,你們在瞭解了各個 Ingress 的優劣勢後,能夠結合自身狀況快速選擇適合本身的 Ingress。
厲輝,騰訊雲中間件API網關核心研發成員,Apache APISIX PPMC。熱愛開源,樂於分享,活躍於Apache APISIX社區。
歡迎掃碼關注咱們的微信公衆號,期待與你相遇~