導語:在Kubernetes的實踐、部署中,為了解決 Pod 遷移、Node Pod 埠、域名動態分配等問題,需要開發人員選擇合適的 Ingress 解決方案。面對市場上眾多Ingress產品,開發者該如何分辨它們的優缺點?又該如何結合自身的技術棧選擇合適的技術方案呢?在本文中,騰訊雲中間件核心研發工程師厲輝將為你介紹如何進行Kubernates Ingress 控制器的技術選型。(編輯:中間件小Q妹)
閱讀本文需要熟悉以下基本概念:
Kubernetes 的外部訪問方式
在 Kubernetes 中,服務跟 Pod IP 主要供服務在集群內訪問使用,對於集群外的應用是不可見的。怎麼解決這個問題呢?為了讓外部的應用能夠訪問 Kubernetes 集群中的服務,通常解決辦法是 NodePort 和 LoadBalancer。
這兩種方案其實各自都存在一些缺點:
在Kubernetes的實踐、部署中,為了解決像 Pod 遷移、Node Pod 埠、域名動態分配,或者是 Pod 後台地址動態更新這種問題,就產生了 Ingress 解決方案。
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 架構圖
上圖為Ingress controller 項目的整體架構圖。左邊部分為 Kubernetes 集群,這裡可以導入一些 yaml 文件,對 Kubernetes 的配置進行變更。右邊部分則是 APISIX 集群,以及它的控制面和數據面。從架構圖中可以看出,APISIX Ingress 充當了 Kubernetes 集群以及 APISIX 集群之間的連接者。它主要負責監聽 Kubernetes 集群中節點的變化,將集群中的狀態同步到 APISIX 集群。另外,由於Kubernetes 倡導所有組件都要具備高可用的特性,所以在 APISIX Ingress 設計之初,我們通過雙節點或多節點的模式來保證 APISIX Ingress controller 的保障高可用。
各類 Ingress 橫向對比
相對於市面上流行的 Ingress 控制器,我們簡單對比來看看 APISIX Ingress 有什麼優缺點。上圖是外國開發人員針對 Kubernetes Ingress 選型做的一張表格。我在原來表格的基礎上,結合自己的理解,將 APISIX Ingress 的功能加入了進來。我們可以看到,最左邊的是APISIX,後邊就是 Kubernetes Ingress 和 Kong Ingress,後面的 Traefik,就是基於 Golang 的 Ingress。HAproxy 是比較常見的,過去是比較流行的負載均衡器。Istio 和 Ambassador 是國外非常流行的兩個Ingress。
接下來我們總結下這些 Ingress各自的優缺點:
綜上所述,大家在了解了各個 Ingress 的優劣勢後,可以結合自身情況快速選擇適合自己的 Ingress。