在 Kubernetes 的實踐、部署中,為了解決 Pod 遷移、Node Pod 埠、域名動態分配等問題,需要開發人員選擇合適的 Ingress 解決方案。面對市場上眾多Ingress產品,開發者該如何分辨它們的優缺點?又該如何結合自身的技術棧選擇合適的技術方案呢?在本文中,騰訊雲中介軟體核心研發工程師厲輝將為你介紹如何進行 Kubernates Ingress 控制器的技術選型。
叢集:是指容器執行所需雲資源的集合,包含了若干臺雲伺服器、負載均衡器等雲資源。 例項(Pod):由相關的一個或多個容器構成一個例項,這些容器共享相同的儲存和網路空間。 工作負載(Node):Kubernetes 資源物件,用於管理 Pod 副本的建立、排程以及整個生命週期的自動控制。 服務(Service):由多個相同配置的例項(Pod)和訪問這些例項(Pod)的規則組成的微服務。 Ingress:Ingress 是用於將外部 HTTP(S)流量路由到服務(Service)的規則集合。
NodePort 的缺點是一個埠只能掛載一個 Service,而且為了更高的可用性,需要額外搭建一個負載均衡。
LoadBalancer 的缺點則是每個服務都必須要有一個自己的 IP,不論是內網 IP 或者外網 IP。更多情況下,為了保證 LoadBalancer 的能力,一般需要依賴於雲服務商。
第一個問題:Nginx Ingress用了一些 OpenResty 的特性,但最終配置載入還是依賴於原有的 Nginx config reload。當路由配置非常大時,Nginx reload 會耗時很久,時間長達幾秒甚至十幾秒,這樣就會嚴重影響業務,甚至造成業務中斷。
第二個問題:Nginx Ingress 的外掛開發非常困難。如果你認為 Nginx Ingress 本身外掛不夠用,需要使用一些定製化外掛,這個額外的開發任務對程式設計師來說是十分痛苦的。因為Nginx Ingress自身的外掛能力和可擴充套件性非常差。 Ingress 選型原則 既然發現了 Nginx Ingress 有很多問題,那是不是考慮選擇其他開源的、更好用的 Ingress?市場上比 Kubernetes Ingress 好用的Ingress起碼有十幾家,那麼如何從這麼多 Ingress 中選擇適合自己的呢?Ingress 自身是基於 HTTP 閘道器的,市面上 HTTP 閘道器主要有這麼幾種:Nginx、Golang 原生的閘道器,以及新崛起的 Envoy 。但是每個開發人員所擅長的技術棧不同,所以適合的 Ingress 也會不一樣。那麼問題來了,我們如何選擇一個更加好用的 Ingress 呢?或者縮小點範圍,熟悉 Nginx 或 OpenResty 的開發人員,應該選擇哪一個 Ingress 呢?下面來介紹一下我對 Ingress 控制器選型的一些經驗。
必須開源的,不開源的無法使用。 Kubernetes 中Pod 變化非常頻繁,服務發現非常重要。 現在 HTTPS 已經很普及了,TLS 或者 SSL 的能力也非常重要,比如證書管理的功能。 支援 WebSocket 等常見協議,在某些情況下,可能還需要支援 HTTP2 、QUIC 等協議。
2.基礎軟體
3.功能需求
協議:是否支援 HTTP2、HTTP3; 負載均衡演算法:最基本的WRR、一致性雜湊負載均衡演算法是否能夠滿足需求,還是需要更加複雜的類似EWMA負載均衡演算法。 鑑許可權流:僅需要簡單的鑑權,或更進階的鑑權方式。又或者需要整合,能夠快速的開發出像騰訊雲 IM 的鑑權功能。Kubernetes Ingress除了前面我們提到的存在Nginx reload 耗時長、外掛擴充套件能力差的問題,另外它還存在後端節點調整權重的能力不夠靈活的問題。
第一部分:需要將 Kubernetes 叢集中的配置、或 Kubernetes 叢集中的狀態同步到 APISIX 叢集。 第二部分:需要將 APISIX中 的一些概念,比如像服務、upstream 等概念定義為 Kubernetes 中的 CRD。
APISIX Ingress:APISIX Ingress 的優點前面也提到了,它具有非常強大的路由能力、靈活的外掛擴充能力,在效能上表現也非常優秀。同時,它的缺點也非常明顯,儘管APISIX開源後有非常多的功能,但是缺少落地案例,沒有相關的文件指引大家如何使用這些功能。
Kubernetes Ingress:即 Kubernetes 推薦預設使用的 Nginx Ingress。它的主要優點為簡單、易接入。缺點是Nginx reload耗時長的問題根本無法解決。另外,雖然可用外掛很多,但外掛擴充套件能力非常弱。
Nginx Ingress:主要優點是在於它完全支援 TCP 和 UDP 協議,但是缺失了鑑權方式、流量排程等其他功能。
Kong:其本身就是一個 API 閘道器,它也算是開創了先河,將 API 閘道器引入到 Kubernetes 中當 Ingress。另外相對邊緣閘道器,Kong 在鑑權、限流、灰度部署等方面做得非常好。Kong Ingress 還有一個很大的優點:提供了一些 API、服務的定義,可以抽象成 Kubernetes 的 CRD,通過K8S Ingress 配置便可完成同步狀態至 Kong 叢集。缺點就是部署特別困難,另外在高可用方面,與 APISIX 相比也是相形見絀。
Traefik :基於 Golang 的 Ingress,它本身是一個微服務閘道器,在 Ingress 的場景應用比較多。他的主要平臺基於 Golang,自身支援的協議也非常多,總體來說是沒有什麼缺點。如果大家熟悉 Golang 的話,也推薦一用。
HAproxy:是一個久負盛名的負載均衡器。它主要優點是具有非常強大的負載均衡能力,其他方面並不佔優勢。
Istio Ingress 和 Ambassador Ingress 都是基於非常流行的 Envoy。說實話,我認為這兩個 Ingress 沒有什麼缺點,可能唯一的缺點是他們基於 Envoy 平臺,大家對這個平臺都不是很熟悉,上手門檻會比較高。