全部產品
Search
文件中心

Microservices Engine:從Nginx Ingress遷移到MSE Ingress

更新時間:Apr 19, 2025

本文介紹如何通過MSE白屏化遷移工具將自建Nginx Ingress遷移至MSE Ingress。

前提條件

  • 已建立Container Service叢集,且部署了Nginx Ingress Controller。

  • 已建立雲原生網關。如果您還沒有雲原生網關,請參見建立MSE雲原生網關

注意事項

  • 本文描述的遷移不是複製您的Ingress配置,而是讓您的Ingress配置被MSE Ingress複用,即時監聽已有的Ingress資源變化並解析。

  • 遷移過程中,如果您的Ingress配置發生變化,會同時反映在Nginx Ingress Controller和MSE Ingress。

  • 遷移完成之後,請不要隨意刪除線上正在使用的Ingress配置,遷移僅僅是讓現有的Ingress配置以及未來新添加的Ingress配置被MSE Ingress監聽並解析。

  • 遷移完成之後,現有的Ingress配置以及未來新添加的Ingress配置仍然需要關聯之前使用的IngressClass。例如之前Ingress的spec中的ingressClassName為nginx,那麼在遷移之後,現有的Ingress配置以及未來新添加的Ingress配置的spec中的ingressClassName仍然需要是nginx。

遷移方式和原理介紹

詳細資料

什麼是MSE Ingress

MSE Ingress是在MSE雲原生網關之上提供更為強大的Ingress流量管理方式。MSE Ingress將流量網關、微服務網關和安全網關三合一,相容K8s Ingress標準API,解決了三層網關架構獨立設計和獨立營運導致的資源消耗大、效能損耗大、穩定性難控、安全防護複雜等難題。

MSE Ingress優勢

相較於傳統網關,MSE Ingress在資源成本、效能、安全性和易用性上具有如下優勢:

  • 遵循標準:MSE Ingress嚴格遵循K8s Ingress標準API,支援networking.k8s.io/v1beta1networking.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-25745CVE-2021-25746CVE-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切流。

    image.png

  • 基於DNS解析

    原理:在DNS伺服器中對於所有Nginx Ingress中關聯的業務網域名稱添加MSE SLB的解析結果,部分DNS服務商提供權重方式控制Nginx SLB和MSE SLB的流量比。

    image.png

方式對比

遷移方式

時效性

切流層級

權重切流

操作複雜度

複用Nginx Ingress SLB

SLB層級

支援

簡單

基於DNS解析

網域名稱層級

依賴DNS服務商

與網域名稱數量成正比

遷移方案概述

雲原生網關提供了遷移上雲工具,您可以按照遷移工具的引導一步一步的完成路由配置的遷移及最終的流量切換。

步驟一:路由規則遷移

  1. 登入MSE網關管理主控台,並在頂部功能表列選擇地區。

  2. 在左側導覽列,選擇雲原生網關 > 遷移上雲

  3. 遷移上雲頁面,單擊建立任務

  4. 建立遷移配置面板,進行相關配置。

    雲原生網關將自動監聽所選容器叢集內且關聯到源IngressClass的所有Ingress資源的變化,並生效Ingress資源中網域名稱和路由的相關配置。

    重要

    如果目標雲原生網關叢集中已關聯該容器叢集,且已配置的IngressClass與此處的配置不同,則不允許遷移。請確保此處配置的IngressClass與已關聯容器叢集配置的IngressClass一致。

    image

    配置項

    說明

    雲原生網關執行個體

    選擇要遷移至的目標雲原生網關。要求雲原生網關的版本至少為1.2.22。

    Container ServiceACK/ACK Serverless叢集

    選擇要遷移的Nginx Ingress對應的容器叢集,請確保雲原生網關與容器叢集處於同一VPC。

    源IngressClass

    配置待遷移的Ingress資源關聯的IngressClass資源。

    說明
    • 僅支援配置單個IngressClass。

    • 配置為空白,即忽略IngressClass,表示監聽叢集中所有的Ingress資源。

  5. 單擊下一步

    此時雲原生網關將自動監聽所選容器叢集內,關聯到源IngressClass的所有Ingress資源的變化,並生效Ingress資源中網域名稱、路由的相關配置。

    1. 假設在原有容器叢集內有一個名稱為httpbin的Ingress。

      ingress路由.png

    2. 在雲原生網關控制台可以看到目的地組群中的Ingress已自動同步到目標雲原生網關中,並產生與之對應的網域名稱、路由的相關配置。

步驟二:路由校正

校正監聽的Ingress的相容性:

  • 如果無不相容的Ingress Annotation,則繼續下一步。

    路由校正.png

  • 如果存在不相容的Ingress Annotation,您可以提交工單諮詢解決方案。

    重要
    • 註解nginx.ingress.kubernetes.io/service-weight的值為""可以忽略,該註解為舊版Container Service控制台預設添加,本身沒有任何意義。

    • 遷移過程中,請勿刪除線上正在使用的不相容註解。因為這些不相容的註解仍然被Nginx Ingress Controller解析並作用於您的業務流量。您可以在Ingress資源上額外添加MSE擴充的註解,在MSE Ingress實現相同的功能。待流量全部遷移至MSE Ingress之後,您可以按需刪除不相容的註解。

步驟三:切流選擇

切流前測試

正式切流前,建議先進行本地測試:修改本地hosts檔案,為業務網域名稱添加雲原生網關SLB解析,通過curl或者postman等工具驗證所有流量是否符合預期。

選擇切流方式

複用原叢集SLB

原理:將雲原生網關節點執行個體添加到原SLB的後端伺服器組中,在遷移過程中根據設定的權重分配業務流量到雲原生網關。當遷移完成之後,訪問該SLB的流量將全部轉寄至雲原生網關。

相關配置項說明如下:

配置項

說明

容器叢集命名空間

選擇Nginx Ingress SLB關聯的K8s Service所在的命名空間。

容器叢集SLB服務

選擇Nginx Ingress SLB關聯的K8s Service的名稱。

SLB ID

單擊查詢到的SLB,確認該SLB是目標待遷移的SLB。

連接埠及後端伺服器

選擇原叢集SLB執行個體的監聽連接埠和網關協議(HTTP/HTTPS),會自動展示目標虛擬伺服器組。

說明

請注意連接埠以及對應協議的選擇,否則流量可能有損。

DNS解析至雲原生網關SLB

請您前往DNS供應商的網域名稱解析服務,為遷移路由涉及的所有網域名稱添加雲原生網關SLB地址的映射。建議使用DNS的權重解析方式逐步切流。

步驟四:流量切換

複用原叢集SLB

Step1:點擊變更SLB

點擊變更SLB後,系統自動將SLB脫離容器託管並修改監聽調度演算法為加權輪詢。

重要

該步驟會將SLB脫離容器託管,脫離之後無法感知Nginx Ingress Controller的Pod IP變化,請儘快按照下一步的要求修改註解,重新將K8s Service關聯至SLB。

Step2:覆蓋修改Service註解

請確保完成Step1之後,在Container Service管理主控台中手工將複用原叢集SLB選擇的K8s Service的當前所有註解刪除,複製流量切換頁面自動產生的註解並添加到目標K8s Service註解中。該步驟主要是將原K8s Service改為複用SLB,修改完成後,單擊前置檢查,檢查通過後,會進入下一步。

編輯yaml.png

如果您的Nginx Ingress網關存在同一容器叢集的業務Pod訪問Nginx Ingress網關的情況,您需要額外為Service添加註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: mse-ingress-migration。在添加之前請確認Service對應的SLB未開啟IP存取控制,因為該註解會強制業務Pod通過SLB訪問Nginx Ingress網關,不再被Kube Proxy最佳化為繞過SLB直接存取Nginx Ingress Pod。

mig註解.png

Step3:基於權重開始切流

設定轉寄雲原生網關執行個體的流量權重,根據業務實際情況設定1~100,建議初次設定為1~10之間。

  • 該值為雲原生網關各節點的權重值總和,SLB會根據虛擬伺服器組中雲原生網關和Nginx Ingress各節點的權重比值分配流量。其中Nginx Ingress節點的權重總和預設為100,所以當雲原生網關權重也設為100,則承接1/2 流量。依此類推,當雲原生網關權重設為50,則承接1/3流量。

  • 遷移過程中,可以通過雲原生網關提供的監控大盤觀察網關各項指標,時刻關注網關健康狀態以及業務指標是否符合預期。

    • 如果符合預期,可以逐步調大權重,修改權重的時間間隔要大於3分鐘,因為後台是非同步生效權重配置。

    • 如果不符合預期,權重設定為0即可,本次遷移終止。

  • 您可以在Container Service控制台中將複用原叢集SLB選擇的K8s Service的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值調低,間接調大雲原生網關的權重。特別的,當該註解的值為0時,流量則全部匯入雲原生網關。

  • SLB作為四層負載平衡,流量控制粒度為串連層級,該權重值無法精確控制請求層級的分發比例。

  • 切流後如果出現成功率下跌,可將該權重設為0進行流量快速復原

說明

如果您希望長期處於遷移狀態中,希望隨時可以調整Nginx Ingress和MSE Ingress的流量權重,建議您長期處於當前步驟中。當您驗證並確認流量符合預期,之後不再需要復原所有流量到Nginx Ingress,可以單擊完成流量驗證繼續下一步。

重要

單擊完成流量驗證後,將無法修改權重。

Step4:全部流量切換至雲原生網關

在Container Service控制台中將步驟三:切流選擇選擇的K8s Service服務的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值設定為0,或者直接刪除該Service資源。Nginx Ingress Controller的節點將會自動從該SLB摘除,則SLB的全部流量切換至雲原生網關。單擊完成遷移,此次遷移任務結束。

遷移走了.png

DNS解析至雲原生網關SLB

請前往DNS供應商的網域名稱解析服務,為遷移路由涉及的所有網域名稱添加雲原生網關SLB地址的映射。建議使用DNS的權重解析方式逐步切流。

快速復原

如果在流量遷移過程中發現不符合預期,您可以根據以下方式快速復原,使流量恢複至Nginx Ingress Controller。

  • 複用原叢集SLB:權重設定為0即可,本次遷移終止。

  • DNS解析至雲原生網關SLB:在DNS供應商上對所有的業務網域名稱刪掉雲原生網關SLB地址即可。

步驟五:完成遷移

複用原叢集SLB

對於SLB切流方式,如果您還有其他SLB未切流完畢,請確保這些SLB完成切流。如果您已經完成了所有SLB的切流,後續您可以按需刪除K8s Service以及Nginx Ingress Controller。

DNS解析至雲原生網關SLB

對於DNS切流方式,如果您所有業務網域名稱的IP地址已經全部解析為MSE網關的SLB地址清單,後續您可以按需刪除K8s Service以及Nginx Ingress Controller。

問題排查

非法請求:mse.backend.gw.MIGRATE_INGRESS_CLASS_CONFLICT

說明您的網關之前已經關聯了該Container Service叢集,並開啟了Ingress監聽,但是此處遷移時設定的IngressClass與原Ingress監聽配置不一致,請確保IngressClass的配置一致。

如果您需要修改之前已配置的IngressClass,請按照實際情況選擇以下方法:

非法請求:mse.backend.gw.MIGRATE_SERVICE_ANNOTATION_NOT_MATCH [annotation is not expected]

說明您的K8s Service的註解未修改成指定註解。

非法請求:mse.backend.gw.MIGRATE_SERVICE_NOT_MATCH [weight hasn't be 0 or service hasn't been deleted]

說明K8s Service服務的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值未設定為0或者K8s Service未刪除。請到Container Service控制台修改該K8s Service服務的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值為0,或者刪除該K8s Service。