本文介紹Nginx Ingress遷移MSE Ingress的方式以及原理。
什么是MSE Ingress
MSE Ingress是在MSE云原生網關之上提供更為強大的Ingress流量管理方式。MSE Ingress將流量網關、微服務網關和安全網關三合一,兼容K8s Ingress標準API,解決了三層網關架構獨立設計和獨立運維導致的資源消耗大、性能損耗大、穩定性難控、安全防護復雜等難題。
MSE Ingress優勢
相較于傳統網關,MSE Ingress在資源成本、性能、安全性和易用性上具有如下優勢:
遵循標準:MSE Ingress嚴格遵循K8s Ingress標準API,支持
networking.k8s.io/v1beta1
和networking.k8s.io/v1
。兼容性強:兼容Nginx Ingress注解90%以上的使用場景,Nginx Ingress配置無需修改即可在MSE Ingress生效。關于MSE Ingress支持的注解匯總信息,請參見MSE Ingress支持的Annotation。
擴展豐富:相較于Nginx Ingress原生注解,MSE提供功能更豐富的擴展注解,例如認證鑒權、Header控制、限流和安全防護等。更多關于MSE Ingress增強的擴展注解,請參見MSE Ingress高級用法。
架構安全:采用數據面和控制面分離部署,實現資源隔離,架構設計更安全。
性能強勁:支持HTTPS硬件加速、QPS性能提升。
遷移Nginx Ingress至MSE Ingress的必要性
Nginx Ingress目前存在的主要問題:
重大安全漏洞:Nginx Ingress在安全領域出現了高危安全漏洞CVE-2021-25745、CVE-2021-25746和CVE-2021-25748。
與Ingress APIVersion和K8s集群版本耦合嚴重,影響升級K8s集群的進程。ACK托管版/ACK Serverless 1.24版本和 ACS Kubernetes 1.26版本中徹底棄用了v1beta1版本的Ingress資源,同時Nginx Ingress Controller在1.0.0及以上版本才支持v1的Ingress資源,導致升級ACK托管版/ACK Serverless/ACS Kubernetes 1.24版本必須提前升級Nginx Ingress Controller。
升級Nginx Ingress Controller的流程復雜且容易出現流量損失。
需要額外部署一套新版本的Nginx Ingress Controller。
需要手動修改模板參數以完成應用版本的升級。
只支持基于DNS方式進行老網關遷移流量到新網關,時效性差,出現問題時無法快速回滾。
將Nginx Ingress網關遷移至MSE Ingress后,可將Ingress網關與Ingress APIVersion、K8s集群版本解耦,解決后續K8s集群升級依賴Nginx Ingress Controller版本的困擾。此外,MSE Ingress提供了遷移場景的產品化工具,可以采用復用SLB的方式做細粒度切流,提高遷移過程中的時效性和穩定性。
遷移方式
MSE Ingress提供了如下兩種遷移方式:
復用Nginx Ingress SLB
原理:在MSE Ingress中復用ACK托管版/ACK Serverless/ACS集群中Nginx Ingress Controller的Service創建的SLB,MSE Ingress的節點自動添加到原SLB的已有監聽的虛擬服務器組中,最終通過設置流量權重完成流量遷移。
在保留原有流量鏈路可用的前提下完成MSE Ingress復用已有SLB,以及自動同步原有的Nginx Ingress規則。最后在驗證無誤后,逐步切流到MSE Ingress,整個過程可保留原有流量入口SLB不變,不需要變更DNS切流。
基于DNS解析
原理:在DNS服務器中對于所有Nginx Ingress中關聯的業務域名添加MSE SLB的解析結果,部分DNS服務商提供權重方式控制Nginx SLB和MSE SLB的流量比。
方式對比
遷移方式 | 時效性 | 切流級別 | 權重切流 | 操作復雜度 |
復用Nginx Ingress SLB | 快 | SLB級別 | 支持 | 簡單 |
基于DNS解析 | 慢 | 域名級別 | 依賴DNS服務商 | 與域名數量成正比 |