隨著 Nginx Ingress 退役,使用者需將其遷移至新的網關方案。阿里雲雲原生API Gateway是一款整合流量網關、微服務網關和安全網關的統一網關產品,為Nginx Ingress使用者提供平滑遷移路徑及功能更新能力。本文介紹如何通過白屏化遷移工具將自建Nginx Ingress遷移至雲原生API Gateway。
前提條件
已建立Container Service叢集,且部署了Nginx Ingress Controller。
已建立雲原生API Gateway。如果您還沒有雲原生API Gateway,請參見建立網關執行個體。
注意事項
本文描述的遷移不是複製您的Ingress配置,而是讓您的Ingress配置被雲原生API Gateway Ingress複用,即時監聽已有的Ingress資源變化並解析。
遷移過程中,如果您的Ingress配置發生變化,會同時反映在Nginx Ingress Controller和雲原生API Gateway Ingress。
遷移完成之後,請不要隨意刪除線上正在使用的Ingress配置,遷移僅僅是讓現有的Ingress配置以及未來新添加的Ingress配置被雲原生API Gateway Ingress監聽並解析。
遷移完成之後,現有的Ingress配置以及未來新添加的Ingress配置仍然需要關聯之前使用的IngressClass。例如之前Ingress的spec中的ingressClassName為nginx,那麼在遷移之後,現有的Ingress配置以及未來新添加的Ingress配置的spec中的ingressClassName仍然需要是nginx。
遷移步驟說明
雲原生API Gateway提供遷移上雲工具,您可以按照遷移工具的引導完成路由配置的遷移及最終的流量切換。
步驟一:路由規則遷移
在左側導覽列,選擇遷移上雲。
在遷移上雲頁面,單擊建立任務。
在建立遷移配置面板,進行相關配置。
雲原生API Gateway將自動監聽所選容器叢集內且關聯到源IngressClass的所有Ingress資源的變化,並生效Ingress資源中網域名稱和路由的相關配置。
重要如果目標雲原生API Gateway叢集中已關聯該容器叢集,且已配置的IngressClass與此處的配置不同,則不允許遷移。請確保此處配置的IngressClass與已關聯容器叢集配置的IngressClass一致。

配置項
說明
所屬執行個體
指定遷移到雲原生API Gateway的執行個體。
來源叢集
選擇要遷移的Nginx Ingress對應的容器叢集,請確保雲原生API Gateway與容器叢集處於同一VPC。
API名稱
Nginx Ingress路由將匯入的雲原生API Gateway的HTTP API名稱。
資源群組
選擇遷移到雲原生API Gateway的資源群組。
命名空間
配置待遷移的Ingress資源的命名空間。
IngressClass
配置待遷移的Ingress資源關聯的IngressClass資源。
說明僅支援配置單個IngressClass。
配置為空白,即忽略IngressClass,表示監聽叢集中所有的Ingress資源。
單擊下一步。
此時雲原生API Gateway將自動監聽所選容器叢集內,關聯到源IngressClass的所有Ingress資源的變化,並將Ingress資源中網域名稱、路由的相關配置生效到建立的API中。
假設在原有容器叢集內有一個名稱為nginx-route的Ingress。

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

步驟二:路由校正
校正監聽的Ingress的相容性:
如果無不相容的Ingress Annotation,則繼續下一步。

如果存在不相容的Ingress Annotation,您可以提交工單諮詢解決方案。
重要註解
nginx.ingress.kubernetes.io/service-weight的值為""可以忽略,該註解為舊版Container Service控制台預設添加,本身沒有任何意義。遷移過程中,請勿刪除線上正在使用的不相容註解。因為這些不相容的註解仍然被Nginx Ingress Controller解析並作用於您的業務流量。
步驟三:切流選擇
切流前測試
正式切流前,建議先進行本地測試:修改本地hosts檔案,為業務網域名稱添加雲原生API GatewaySLB解析,通過curl或者Postman等工具驗證所有流量是否符合預期。
選擇切流方式
複用原叢集SLB
原理:將雲原生API Gateway節點執行個體添加到原SLB的後端伺服器組中,在遷移過程中根據設定的權重分配業務流量到雲原生API Gateway。當遷移完成之後,訪問該SLB的流量將全部轉寄至雲原生API Gateway。

相關配置項說明如下:
配置項 | 說明 |
容器叢集命名空間 | 選擇Nginx Ingress SLB關聯的K8s Service所在的命名空間。 |
容器叢集SLB服務 | 選擇Nginx Ingress SLB關聯的K8s Service的名稱。 |
SLB ID | 單擊查詢到的SLB,確認該SLB是目標待遷移的SLB。 |
連接埠及後端伺服器 | 選擇原叢集SLB執行個體的監聽連接埠和網關協議(HTTP/HTTPS),會自動展示目標虛擬伺服器組。 說明 請注意連接埠以及對應協議的選擇,否則流量可能有損。 |
DNS解析至雲原生API GatewaySLB
請您前往DNS供應商的網域名稱解析服務,為遷移路由涉及的所有網域名稱添加雲原生API GatewaySLB地址的映射。建議使用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,修改完成後,單擊前置檢查,檢查通過後,會進入下一步。

Step3:基於權重開始切流
設定轉寄雲原生API Gateway執行個體的流量權重,根據業務實際情況設定1~100,建議初次設定為1~10之間。
該值為雲原生API Gateway各節點的權重值總和,SLB會根據虛擬伺服器組中雲原生API Gateway和Nginx Ingress各節點的權重比值分配流量。其中Nginx Ingress節點的權重總和預設為100,所以當雲原生API Gateway權重也設為100,則承接1/2 流量。依此類推,當雲原生API Gateway權重設為50,則承接1/3流量。
遷移過程中,可以通過雲原生API Gateway提供的監控大盤觀察網關各項指標,時刻關注網關健康狀態以及業務指標是否符合預期。
如果符合預期,可以逐步調大權重,修改權重的時間間隔要大於3分鐘,因為後台是非同步生效權重配置。
如果不符合預期,權重設定為0即可,本次遷移終止。
您可以在Container Service控制台中將複用原叢集SLB選擇的K8s Service的註解
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值調低,間接調大雲原生API Gateway的權重。特別地,當該註解的值為0時,流量則全部匯入雲原生API Gateway。SLB作為四層負載平衡,流量控制粒度為串連層級,該權重值無法精確控制請求層級的分發比例。
切流後如果出現成功率下跌,可將該權重設為0進行流量快速復原。
如果您希望長期處於遷移狀態中,希望隨時可以調整Nginx Ingress和雲原生API Gateway Ingress的流量權重,建議您長期處於當前步驟中。當您驗證並確認流量符合預期,之後不再需要復原所有流量到Nginx Ingress,可以單擊完成流量驗證繼續下一步。
單擊完成流量驗證後,將無法修改權重。
Step4:全部流量切換至雲原生API Gateway
在Container Service控制台中將步驟三:切流選擇選擇的K8s Service服務的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值設定為0,或者直接刪除該Service資源。Nginx Ingress Controller的節點將會自動從該SLB摘除,則SLB的全部流量切換至雲原生API Gateway。單擊完成遷移,此次遷移任務結束。

DNS解析至雲原生API GatewaySLB
請前往DNS供應商的網域名稱解析服務,為遷移路由涉及的所有網域名稱添加雲原生API GatewaySLB地址的映射。建議使用DNS的權重解析方式逐步切流。
快速復原
如果在流量遷移過程中發現不符合預期,您可以根據以下方式快速復原,使流量恢複至Nginx Ingress Controller。
複用原叢集SLB:權重設定為0即可,本次遷移終止。
DNS解析至雲原生API GatewaySLB:在DNS供應商上對所有的業務網域名稱刪掉雲原生API GatewaySLB地址即可。
步驟五:完成遷移
複用原叢集SLB
對於SLB切流方式,如果您還有其他SLB未切流完畢,請確保這些SLB完成切流。如果您已經完成了所有SLB的切流,後續您可以按需刪除K8s Service以及Nginx Ingress Controller。
DNS解析至雲原生API GatewaySLB
對於DNS切流方式,如果您所有業務網域名稱的IP地址已經全部解析為雲原生API Gateway的SLB地址清單,後續您可以按需刪除K8s Service以及Nginx Ingress Controller。