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