K8s 工程师必懂的 10 种 Ingress 控制器
簡介: 為了幫助讀者對 Ingress Controler 建立更完整的認識,今天,社區(qū)對現(xiàn)下流行的十種方案做了具體介紹。
?
為特定的應(yīng)用部署 Kubernetes 集群時,我們通常需要實現(xiàn)來自應(yīng)用程序本身、業(yè)務(wù)和開發(fā)人員的需求。了解這些后,我們就可以進行架構(gòu)選擇,并為 Kubernetes 選擇合適的 Ingress 控制器。
?
為了方便工程師高效選用合適的 Ingress 控制器,本文對業(yè)內(nèi)的 Ingress 控制器做了整理和功能梳理,最后總結(jié)成一篇綜述。借助這篇文章,希望讀者能找到一個好的起點,然后開始自己的實踐。
選擇標準
為了進行客觀對比并得到有用的結(jié)果,首先我們需要一套特定的標準來確定研究方向。注意,以下評測并不能涵蓋所有 Kubernetes Ingress、API 網(wǎng)關(guān)、服務(wù)網(wǎng)格用例,但會盡可能覆蓋常見要求。如果讀者希望把評測結(jié)果用于自己的案例,建議結(jié)合自己的實踐再研究一下細節(jié)和特殊性。
首先是一些非常普遍的功能,所有解決方案都已實現(xiàn)了它們,所以你不需要對它們過多關(guān)注:
開源;
動態(tài)服務(wù)發(fā)現(xiàn);
SSL 終止;
對 WebSocket 的支持。
?
支持的協(xié)議
這就像是工程師選擇 Ingress 控制器時的基本“參數(shù)”。常規(guī)的 HTTP(S) 代理能夠滿足軟件要求嗎?還是需要通過 gRPC、HTTP/2.0?或是需要 TCP(帶有 SNI)、UDP?如果你的情況不是特別常規(guī),建議仔細考慮這些問題,防止以后需要重新配置集群。每個控制器都有自己的一組受支持的協(xié)議。
?
基于(基礎(chǔ)軟件)
控制器的核心可以有幾種類型的應(yīng)用程序,比如最受歡迎的 NGINX、Traefik、HAProxy 和 Envoy 等。通常情況下,這些選擇不會對你的流量處理方式產(chǎn)生巨大影響,但是了解“底層”的潛在特性和習(xí)慣總是有用的。
?
流量路由
將流量路由到特定服務(wù)的決策依據(jù)是什么?通常你可以用 host 和 path,但也有其他的可能性。匹配這些值是否也支持 RegEx(正則表達式)?
?
命名空間限制
命名空間提供了一種邏輯上分離 Kubernetes 中資源的方法。有些 Ingress 控制器必須被裝在不同的命名空間中,它們的作用是僅允許流量進入屬于該命名空間的 Pod。而大多數(shù) Ingress 控制器是針對整個集群進行全局操作的,在這種情況下,流量可以到達任何 Pod,而無需考慮其命名空間。
?
上游探針
如何將流量定向到應(yīng)用程序及其服務(wù)的正常實例?通常你有主動和被動檢查、重試、斷路器、自定義運行狀況檢查等解決方案。如果你對可用性有嚴格的要求,并希望迅速從負載均衡中刪除失敗的服務(wù),這個功能非常重要。
?
負載均衡算法
對于負載均衡我們有很多選擇,從傳統(tǒng)的 round-robin 到非傳統(tǒng)的 rdp-cookie。粘滯會話(Sticky Sessions)在這里也很常見。
?
認證方式
控制器支持哪些認證方式?Basic、digest、OAuth、external auth……如果你為開發(fā)人員使用了許多環(huán)境(層),或僅通過 Ingress 訪問的私有層,這是個值得注意的功能。
?
流量分配
控制器是否支持常用的流量分配機制,如金絲雀部署、A/B 測試、鏡像?對于需要精確流量管理、高效測試、最小影響進行錯誤調(diào)試、流量管理的應(yīng)用來說,這個功能非常敏感。
?
付費訂閱
控制器是否有帶擴展功能或技術(shù)支持的付費版本?
圖形用戶界面(Web UI)
有用于控制器配置的圖形界面嗎?這個功能對于那些喜歡簡單方便,或是需要對 Ingress 配置做一些更改的人很有用。如果開發(fā)人員希望“即時”測試流量,它也非常有用。
?
JWT 驗證
是否有內(nèi)置的 JSON Web 令牌驗證,用于對最終應(yīng)用程序的用戶進行驗證和確認?
?
定制配置
模板是否具備可擴展性,允許你將自己的指令、參數(shù)等添加到標準配置模板上?
基本的 DDOS 保護機制
基本請求速率,或基于地址、白名單、國家/地區(qū)等的流量過濾的更復(fù)雜變體。
?
請求跟蹤
能夠通過 OpenTracing 或其他選項監(jiān)視、跟蹤、調(diào)試從 Ingress 到特定服務(wù)、Pod(最好是在服務(wù)和 Pod 之間)的請求。
?
WAF
支持 Web 應(yīng)用程序防火墻。
?
Ingress 控制器
這一節(jié)將從 Kubernetes 官方控制器開始,逐漸擴展到其他廣為人知的 Ingress 控制器。
?
Kubernetes Ingress Controller
github.com/kubernetes/ingress-nginx
實現(xiàn):Go/Lua(nginx 是用 C 寫的)
許可證:Apache 2.0
Kubernetes 的“官方”控制器(之所以稱為官方,是想把它區(qū)別于 NGINX 公司的控制器)。這是社區(qū)開發(fā)的控制器,它基于 nginx Web 服務(wù)器,并補充了一組用于實現(xiàn)額外功能的 Lua 插件。
由于 NGINX 十分流行,再加上把它用作控制器時所需的修改較少,它對于 K8s 普通工程師來說,可能是最簡單和最直接的選擇。
?
NGINX Ingress Controller
github.com/nginxinc/kubernetes-ingress
實現(xiàn):Go
許可證:Apache 2.0
這是 NGINX 公司開發(fā)的官方產(chǎn)品,它也有一個基于 NGINX Plus 的商業(yè)版。NGINX 的控制器具有很高的穩(wěn)定性、持續(xù)的向后兼容性,且沒有任何第三方模塊。
由于消除了 Lua 代碼,和官方控制器相比,它保證了較高的速度,但也因此受到較大限制。相較之下,它的付費版本有更廣泛的附加功能,如實時指標、JWT 驗證、主動健康檢查等。
NGINX Ingress 重要的優(yōu)勢是對 TCP/UDP 流量的全面支持,最主要缺點是缺乏流量分配功能。
?
Kong Ingress
github.com/Kong/kubernetes-ingress-controller
實現(xiàn):Go
許可證:Apache 2.0
Kong Ingress 由 Kong Inc 開發(fā),有兩個版本:商業(yè)版和免費版。它基于 NGINX 構(gòu)建,并增加了擴展其功能的 Lua 模塊。
最初,Kong Ingress 主要用作 API 網(wǎng)關(guān),用于 API 請求的處理和路由。現(xiàn)在,它已經(jīng)成為成熟的 Ingress 控制器,主要優(yōu)點是擁有大量易于安裝和配置的附加模塊、插件(包括第三方插件)。它開啟了控制器具備大量附加功能的先河,其內(nèi)置函數(shù)也提供了許多可能性。Kong Ingress 配置是用 CRD 執(zhí)行的。
Kong Ingress 的一個重要特性是它只能在一個環(huán)境中運行(而不支持跨命名空間)。這是一個頗有爭議的話題:有些人認為這是一個缺點,因為必須為每個環(huán)境生成實例;而另一些人認為這是一個特殊特性,因為它是更高級別的隔離,控制器故障的影響僅限于其所在的環(huán)境。
?
Traefik
github.com/containous/traefik
實現(xiàn):Go
許可證:MIT
最初,這個代理是為微服務(wù)請求及其動態(tài)環(huán)境的路由而創(chuàng)建的,因此具有許多有用的功能:連續(xù)更新配置(不重新啟動)、支持多種負載均衡算法、Web UI、指標導(dǎo)出、對各種服務(wù)的支持協(xié)議、REST API、Canary 版本等。
支持開箱即用的 Let’s Encrypt 是它的另一個不錯的功能,但它的主要缺點也很明顯,就是為了控制器的高可用性,你必須安裝并連接其 Key-value store。
在 2019 年 9 月發(fā)布的 Traefik v2.0 中,雖然它增加許多不錯的新功能,如帶有 SNI 的 TCP/SSL、金絲雀部署、流量鏡像/shadowing 和經(jīng)過改進的 Web UI,但一些功能(如 WAF 支持)還在策劃討論中。
與新版本同期推出的還有一個名叫 Maesh 的服務(wù)網(wǎng)格,它建在 Traefik 之上。
?
HAProxy Ingress
github.com/jcmoraisjr/haproxy-ingress
實現(xiàn):Go(HAProxy 是用 C 寫的)
許可證:Apache 2.0
HAProxy 是眾所周知的代理服務(wù)器和負載均衡器。作為 Kubernetes 集群的一部分,它提供了“軟”配置更新(無流量損失)、基于 DNS 的服務(wù)發(fā)現(xiàn)和通過 API 進行動態(tài)配置。 HAProxy 還支持完全自定義配置文件模板(通過替換 ConfigMap)以及在其中使用 Spring Boot 函數(shù)。
通常,工程師會把重點放在已消耗資源的高速、優(yōu)化和效率上。而 HAProxy 的優(yōu)點之一正是支持大量負載均衡算法。值得一提的是,在今年 6 月發(fā)布的 v2.0 中,HAProxy 增加了許多新功能,其即將推出的 v2.1 有望帶來更多新功能(包括 OpenTracing 支持)。
?
Voyager
github.com/appscode/voyager
實現(xiàn):Go
許可證:Apache 2.0
Voyager 基于 HAProxy,并作為一個通用的解決方案提供給大量供應(yīng)商。它最具代表性的功能包括 L7 和 L4 上的流量負載均衡,其中,TCP L4 流量負載均衡稱得上是該解決方案最關(guān)鍵的功能之一。
在今年早些時候,盡管 Voyager 在 v9.0.0 中推出了對 HTTP/2 和 gRPC 協(xié)議的全面支持,但總的來看,對證書管理(Let’s Encrypt 證書)的支持仍是 Voyager 集成的最突出的新功能。
?
Contour
github.com/heptio/contour
實現(xiàn):Go
許可證:Apache 2.0
Contour 和 Envoy 由同一個作者開發(fā),它基于 Envoy。它最特別的功能是可以通過 CRD(IngressRoute)管理 Ingress 資源,對于多團隊需要同時使用一個集群的組織來說,這有助于保護相鄰環(huán)境中的流量,使它們免受 Ingress 資源更改的影響。
它還提供了一組擴展的負載均衡算法(鏡像、自動重復(fù)、限制請求率等),以及詳細的流量和故障監(jiān)控。對某些工程師而言,它不支持粘滯會話可能是一個嚴重缺陷。
?
Istio Ingress
istio.io/docs/tasks/traffic-management/ingress
實現(xiàn):Go
許可證:Apache 2.0
Istio 是 IBM、Google 和 Lyft 的聯(lián)合開發(fā)項目,它是一個全面的服務(wù)網(wǎng)格解決方案——不僅可以管理所有傳入的外部流量(作為 Ingress 控制器),還可以控制集群內(nèi)部的所有流量。
Istio 將 Envoy 用作每種服務(wù)的輔助代理。從本質(zhì)上講,它是一個可以執(zhí)行幾乎所有操作的大型處理器,其中心思想是最大程度的控制、可擴展性、安全性和透明性。
通過 Istio Ingress,你可以對流量路由、服務(wù)之間的訪問授權(quán)、均衡、監(jiān)控、金絲雀發(fā)布等進行優(yōu)化。
?
Ambassador
github.com/datawire/ambassador
實現(xiàn):Python
許可證:Apache 2.0
Ambassador 也是一個基于 Envoy 的解決方案,它有免費版和商業(yè)版兩個版本。
Ambassador 被稱為“Kubernetes 原生 API 微服務(wù)網(wǎng)關(guān)”,它與 K8s 原語緊密集成,擁有你所期望的從 Ingress controller 獲得的功能包,它還可以與各種服務(wù)網(wǎng)格解決方案,如 Linkerd、Istio 等一起使用。
順便提一下,Ambassador 博客日前發(fā)布了一份基準測試結(jié)果,比較了 Envoy、HAProxy 和 NGINX 的基礎(chǔ)性能。
?
Gloo
github.com/solo-io/gloo
實現(xiàn):Go
許可證:Apache 2.0
Gloo 是在 Envoy 之上構(gòu)建的新軟件(于 2018 年 3 月發(fā)布),由于它的作者堅持認為“網(wǎng)關(guān)應(yīng)該從功能而不是服務(wù)中構(gòu)建 API”,它也被稱為“功能網(wǎng)關(guān)”。其“功能級路由”的意思是它可以為后端實現(xiàn)是微服務(wù)、無服務(wù)器功能和遺留應(yīng)用的混合應(yīng)用路由流量。
由于擁有可插拔的體系結(jié)構(gòu),Gloo 提供了工程師期望的大部分功能,但是其中一些功能僅在其商業(yè)版本(Gloo Enterprise)中可用。
?
Skipper
github.com/zalando/skipper
實現(xiàn):Go
許可證:Apache 2.0
Skipper 是 HTTP 路由器和反向代理,因此不支持各種協(xié)議。從技術(shù)上講,它使用 Endpoints API(而不是 Kubernetes Services)將流量路由到 Pod。它的優(yōu)點在于其豐富的過濾器集所提供的高級 HTTP 路由功能,工程師可以借此創(chuàng)建、更新和刪除所有 HTTP 數(shù)據(jù)。
Skipper 的路由規(guī)則可以在不停機的情況下更新。正如它的作者所述,Skipper 可以很好地與其他解決方案一起使用,比如 AWS ELB。
?
其他
文章介紹了 Traefik 和 Istio,卻沒有詳細介紹另一個流行的服務(wù)網(wǎng)格解決方案 Linkerd。這是為什么呢?
為簡單起見,Linkerd 沒有提供自己的 Ingress 控制器,而是旨在和工程師選用的控制器兼容使用。
?
總結(jié)
下表是各種 Ingress 控制器的摘要:
本文旨在盡可能讓讀者對 Ingress 控制器形成更完整的理解,因為每種控制器都有其優(yōu)點和缺點。
- 社區(qū)官方的 Ingress 控制器成熟、易于使用,并提供了足以滿足大多數(shù)情況的出色功能;
- 如果對可靠性和功能實現(xiàn)的質(zhì)量有很高的要求,NGINX Ingress 的商業(yè)版會是一個合適的選擇;
- Kong 擁有最豐富的插件集,在其商業(yè)版本中也提供了更多功能,它還擁有基于自定義資源的動態(tài)配置;
- 如果比較關(guān)注負載均衡和授權(quán),請看看 Traefik 和 HAProxy。它們是開源項目,功能已經(jīng)經(jīng)過社區(qū)多年驗證,非常穩(wěn)定,而且還在不斷發(fā)展;
- Contour 雖然只有兩歲,但它已經(jīng)具備 Envoy 之上的基礎(chǔ)功能;
- 基于 Envoy 的解決方案擁有最豐富的功能集,尤其是 Istio。但這是一個復(fù)雜的解決方案,意味著工程師需要具備更多相關(guān)經(jīng)驗來配置、運行、操作它們;
- 在某些其他情況下,Gloo 的許多功能可能只在付費版本中提供;
- 如果你的應(yīng)用程序需要高級或經(jīng)常更改的 HTTP 路由表,那么 Skipper 可能是一個很合適的解決方案。
如果比較的是全球社區(qū)的選擇趨勢,那么 Istio(20k+?)和 Traefik(超過 25k?)的優(yōu)勢就顯而易見了。即使是社區(qū)官方控制器,它也明顯處于下風(fēng)(不到 6k?)。相對的,Kong Ingress 和 HAProxy Ingress 最不熱門,只有不到 1k?。
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的K8s 工程师必懂的 10 种 Ingress 控制器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里技术 2019 年度热文 Top10
- 下一篇: 一次看完2019技术好文,快收藏!