為了避免混淆,我們先對一些關(guān)鍵定義做一些厘清:
- 傳統(tǒng)網(wǎng)關(guān):未作容器化改造,未啟用 K8s,通過流量網(wǎng)關(guān)與業(yè)務(wù)網(wǎng)關(guān)兩層網(wǎng)關(guān)來構(gòu)建,流量網(wǎng)關(guān)提供全局性的、與后端業(yè)務(wù)無關(guān)的策略配置,例如 Tengine 就是典型的流量網(wǎng)關(guān);業(yè)務(wù)網(wǎng)關(guān)提供獨立業(yè)務(wù)域級別的、與后端業(yè)務(wù)緊耦合策略配置,隨著應(yīng)用架構(gòu)模式從單體演進到現(xiàn)在的分布式微服務(wù),業(yè)務(wù)網(wǎng)關(guān)也有了新的叫法 – 微服務(wù)網(wǎng)關(guān)。
- K8s 網(wǎng)關(guān):即云原生網(wǎng)關(guān),也被稱為下一代網(wǎng)關(guān),Ingress 成為 K8s 生態(tài)的網(wǎng)關(guān)標(biāo)準(zhǔn),促使流量網(wǎng)關(guān)和業(yè)務(wù)網(wǎng)關(guān),合二為一?;?Ingress 規(guī)范的實現(xiàn)主要分為基于 Nginx 和基于 Envoy 兩大陣營,基于 Nginx 的 Nginx Ingress Controller 是目前大多數(shù) K8s 集群的選擇,基于 Envoy 的實現(xiàn)作為后起之秀,大有趕超之勢。
- MSE 云原生網(wǎng)關(guān):是基于 Envoy,做了深度優(yōu)化的云上服務(wù)。
本文將從性能和成本、可靠性、安全性 3 方面,對兩大開源實現(xiàn)進行比對,希望對正在做 K8s 網(wǎng)關(guān)選型的企業(yè)有所借鑒。
性能和成本
MSE 云原生網(wǎng)關(guān)的吞吐性能幾乎是 Nginx Ingress Controller 的一倍,尤其是傳輸小文本時性能優(yōu)勢會更明顯,如下圖所示,網(wǎng)關(guān) CPU 使用率達到 30% 時的吞吐對比:
網(wǎng)關(guān)規(guī)格:16 核 32 G * 4 節(jié)點
ECS 型號:ecs.c7.8xlarge
當(dāng) CPU 負(fù)載升高時,吞吐差距會更加明顯,下圖是 CPU 使用率達到 70% 時的情況:
高負(fù)載下 Nginx Ingress Controller 吞吐下降原因是出現(xiàn)了 pod 重啟,詳情見下一節(jié)“可靠性”中的分析。
隨著網(wǎng)絡(luò)安全愈加受重視,現(xiàn)在互聯(lián)網(wǎng)上已經(jīng)普遍使用 HTTPS 進行傳輸加密,在網(wǎng)關(guān)側(cè),用于實現(xiàn) HTTPS 的 TLS 非對稱加密算法是占用 CPU 資源的大頭。針對此場景,MSE 云原生網(wǎng)關(guān)使用了 CPU SIMD 技術(shù)實現(xiàn)了 TLS 加解密算法的硬件加速:
從上圖壓測數(shù)據(jù)可以看出使用 TLS 硬件加速后,相比普通 HTTPS 請求 TLS 握手時延降低一倍,極限 QPS 提升 80%以上。
基于以上數(shù)據(jù),使用 MSE 云原生網(wǎng)關(guān),只需一半的資源,就能達到 Nginx Ingress Controller 的吞吐,在做過硬件加速優(yōu)化的 HTTPS 場景下,吞吐還能進一步提升。
可靠性
前文提到高負(fù)載下,Nginx Ingress Controller 會出現(xiàn) pod 重啟導(dǎo)致吞吐下降,導(dǎo)致 pod 重啟的原因主要有 2 點:
- 存活健康檢查(livenessProbe)在高負(fù)載時容易超時失敗,社區(qū)在 0.34 版本通過減少冗余檢測進行了一定的優(yōu)化,但問題仍然存在。
- 在開啟了 prometheus 采集監(jiān)控指標(biāo)的情況下,高負(fù)載時會出現(xiàn) OOM,導(dǎo)致容器被 kill,詳細(xì)原因見相關(guān) issue:https://github.com/kubernetes/ingress-nginx/pull/8397
這兩個問題,本質(zhì)上皆是由于 Nginx Ingress Controller 的部署架構(gòu)不合理導(dǎo)致。其控制面(Go 實現(xiàn)的 Controller)和數(shù)據(jù)面(Nginx)進程混跑在一個容器內(nèi),高負(fù)載下,數(shù)據(jù)面進程和控制面進程出現(xiàn)了 CPU 搶占。其中控制面進程負(fù)責(zé)了健康檢查和監(jiān)控指標(biāo)采集,因為沒有足夠的 CPU 導(dǎo)致請求積壓引起 OOM 以及健康檢查超時。
這種情況是極危險的,會在高負(fù)載下引發(fā)網(wǎng)關(guān)的雪崩效應(yīng),對業(yè)務(wù)造成嚴(yán)重影響。MSE 云原生網(wǎng)關(guān)使用了數(shù)據(jù)面和控制面隔離的架構(gòu),在架構(gòu)上具備可靠性優(yōu)勢:
從上圖可以看到,MSE 云原生網(wǎng)關(guān)并不部署在用戶的 K8s 集群中,而是純托管的模式,這種模式在可靠性上還有更多優(yōu)勢:
- 不會與業(yè)務(wù)容器混跑在一個 ECS 節(jié)點上
- 網(wǎng)關(guān)的多個實例不會混跑在一個 ECS 節(jié)點上
- 提供網(wǎng)關(guān)可用性的 SLA 保障
如果使用 Nginx Ingress Controller 要實現(xiàn)高可靠部署,一般需要獨占 ECS 節(jié)點,同時還需要部署多個 ECS 節(jié)點,來避免單點故障,這種情況下資源成本會直線上升。此外,Nginx Ingress Controller 因為部署在用戶集群中,也無法提供網(wǎng)關(guān)可用性的 SLA 保障。
安全性
Nginx Ingress Controller 的不同版本都還存在著一些 CVE 漏洞隱患,具體影響版本見下表:
從 Nginx Ingress Controller 遷移到 MSE 云原生網(wǎng)關(guān)后,將一次性修復(fù)所有 CVE 漏洞隱患;并且,MSE 云原生網(wǎng)關(guān)提供了平滑升級方案,一旦出現(xiàn)新的安全漏洞,可以快速對網(wǎng)關(guān)版本進行升級,同時確保升級過程對業(yè)務(wù)影響最小化。
此外,MSE 云原生網(wǎng)關(guān)內(nèi)置了阿里云 Web 應(yīng)用防火墻(WAF),相比傳統(tǒng) WAF 用戶請求鏈路更短、RT 更低,且相比Nginx Ingress Controller 可以做到細(xì)粒度路由級防護,使用成本是目前阿里云 Web 應(yīng)用防火墻架構(gòu)的 2/3。
MSE 云原生網(wǎng)關(guān)
阿里云容器服務(wù)應(yīng)用市場已經(jīng)上架 MSE 云原生網(wǎng)關(guān),可用于替代默認(rèn)安裝的網(wǎng)關(guān)組件 Nginx Ingress Controller。
MSE 云原生網(wǎng)關(guān)在阿里集團內(nèi)部作為網(wǎng)關(guān)中間件已經(jīng)大規(guī)模使用,其強勁的性能和可靠的穩(wěn)定性已被多年雙十一流量所驗證。
在 K8s 容器服務(wù)場景下,對比默認(rèn)安裝的 Nginx Ingress Controller,主要有以下優(yōu)勢:
- 更強勁的性能,更合理的架構(gòu),可以將網(wǎng)關(guān)資源成本降低至少 50%
- 更好的可靠性和 SLA 保障,純托管免運維,背靠阿里云技術(shù)團隊提供支持
- 更優(yōu)的安全性保障,一次性解決現(xiàn)存 CVE 安全漏洞隱患,且內(nèi)置 WAF 防護功能
同時在路由策略、灰度治理、可觀測等方面提供了更豐富的功能,并且支持使用多種語言開發(fā)自定義的擴展插件,詳細(xì)對比請參考:https://help.aliyun.com/document_detail/424833.html
平滑遷移方案
部署 MSE 云原生網(wǎng)關(guān)并不直接影響原有網(wǎng)關(guān)流量,通過 DNS 權(quán)重配置可以實現(xiàn)業(yè)務(wù)流量的平滑遷移,對后端業(yè)務(wù)完全無感知,核心的流量遷移過程如下圖所示:
完整步驟如下:
- 步驟一:在容器服務(wù)的應(yīng)用市場中找到 mse-ingress-controller,并安裝到目標(biāo) ACK 集群
- 步驟二:在 K8s 中配置 MseIngressConfig (配置指引),自動創(chuàng)建指定規(guī)格的 MSE 云原生網(wǎng)關(guān)
- 步驟三:從 Ingress 的 address 字段中獲取 MSE 云原生網(wǎng)關(guān)的 IP,本地綁定 host,將業(yè)務(wù)域名解析到該 IP,完成業(yè)務(wù)測試
- 步驟四:修改業(yè)務(wù)域名的 DNS 權(quán)重配置,添加云原生網(wǎng)關(guān) IP,并逐步調(diào)高權(quán)重,進行流量灰度
- 步驟五:完成灰度后,將業(yè)務(wù)域名原先的 IP 從 DNS 配置中移除,實現(xiàn)全部流量切到云原生網(wǎng)關(guān)
作者:張?zhí)硪?澄潭)
原文鏈接:http://click.aliyun.com/m/1000345146/
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。