本文介紹如何通過MSE白屏化遷移工具將自建Nginx Ingress遷移至MSE Ingress。
前提條件
已創建容器服務集群,且部署了Nginx Ingress Controller。
已創建云原生網關。如果您還沒有云原生網關,請參見新建云原生網關。
注意事項
本文描述的遷移不是復制您的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網關管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 遷移上云。
在遷移上云頁面,單擊創建任務。
在創建遷移配置面板,進行相關配置。
云原生網關將自動監聽所選容器集群內且關聯到源IngressClass的所有Ingress資源的變化,并生效Ingress資源中域名和路由的相關配置。
重要如果目標云原生網關集群中已關聯該容器集群,且已配置的IngressClass與此處的配置不同,則不允許遷移。請確保此處配置的IngressClass與已關聯容器集群配置的IngressClass一致。
配置項
說明
云原生網關實例
選擇要遷移至的目標云原生網關。要求云原生網關的版本至少為1.2.22。
容器服務ACK/ACK Serverless集群
選擇要遷移的Nginx Ingress對應的容器集群,請確保云原生網關與容器集群處于同一VPC。
源IngressClass
配置待遷移的Ingress資源關聯的IngressClass資源。
說明僅支持配置單個IngressClass。
配置為空,即忽略IngressClass,表示監聽集群中所有的Ingress資源。
單擊下一步。
此時云原生網關將自動監聽所選容器集群內,關聯到源IngressClass的所有Ingress資源的變化,并生效Ingress資源中域名、路由的相關配置。
假設在原有容器集群內有一個名稱為httpbin的Ingress。
在云原生網關控制臺可以看到目標集群中的Ingress已自動同步到目標云原生網關中,并生成與之對應的域名、路由的相關配置。
步驟二:路由校驗
校驗監聽的Ingress的兼容性:
如果無不兼容的Ingress Annotation,則繼續下一步。
如果存在不兼容的Ingress Annotation,您可以提交工單咨詢解決方案。
重要注解
nginx.ingress.kubernetes.io/service-weight
的值為""可以忽略,該注解為舊版容器服務控制臺默認添加,本身沒有任何意義。遷移過程中,請勿刪除線上正在使用的不兼容注解。因為這些不兼容的注解仍然被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之后,在容器服務管理控制臺中手工將復用原集群SLB選擇的K8s Service的當前所有注解刪除,復制流量切換頁面自動生成的注解并添加到目標K8s Service注解中。該步驟主要是將原K8s Service改為復用SLB,修改完成后,單擊前置檢查,檢查通過后,會進入下一步。
如果您的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。
Step3:基于權重開始切流
設置轉發云原生網關實例的流量權重,根據業務實際情況設置1~100,建議初次設置為1~10之間。
該值為云原生網關各節點的權重值總和,SLB會根據虛擬服務器組中云原生網關和Nginx Ingress各節點的權重比值分配流量。其中Nginx Ingress節點的權重總和默認為100,所以當云原生網關權重也設為100,則承接1/2 流量。依此類推,當云原生網關權重設為50,則承接1/3流量。
遷移過程中,可以通過云原生網關提供的監控大盤觀察網關各項指標,時刻關注網關健康狀態以及業務指標是否符合預期。
如果符合預期,可以逐步調大權重,修改權重的時間間隔要大于3分鐘,因為后臺是異步生效權重配置。
如果不符合預期,權重設置為0即可,本次遷移終止。
您可以在容器服務控制臺中將復用原集群SLB選擇的K8s Service的注解
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight
的值調低,間接調大云原生網關的權重。特別的,當該注解的值為0時,流量則全部導入云原生網關。SLB作為四層負載均衡,流量控制粒度為連接級別,該權重值無法精確控制請求級別的分發比例。
切流后如果出現成功率下跌,可將該權重設為0進行流量快速回滾。
如果您希望長期處于遷移狀態中,希望隨時可以調整Nginx Ingress和MSE Ingress的流量權重,建議您長期處于當前步驟中。當您驗證并確認流量符合預期,之后不再需要回滾所有流量到Nginx Ingress,可以單擊完成流量驗證繼續下一步。
單擊完成流量驗證后,將無法修改權重。
Step4:全部流量切換至云原生網關
在容器服務控制臺中將步驟三:切流選擇選擇的K8s Service服務的注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight
的值設置為0,或者直接刪除該Service資源。Nginx Ingress Controller的節點將會自動從該SLB摘除,則SLB的全部流量切換至云原生網關。單擊完成遷移,此次遷移任務結束。
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
說明您的網關之前已經關聯了該容器服務集群,并開啟了Ingress監聽,但是此處遷移時設置的IngressClass與原Ingress監聽配置不一致,請確保IngressClass的配置一致。
如果您需要修改之前已配置的IngressClass,請按照實際情況選擇以下方法:
如果您是通過MseIngressConfig管理MSE Ingress,請參見通過MSE Ingress訪問容器服務進行修改。
如果您不是通過MseIngressConfig管理MSE Ingress,請至網關控制臺的服務來源中修改對應容器集群的Ingress監聽選項。
非法請求: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未刪除。請到容器服務控制臺修改該K8s Service服務的注解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight
的值為0,或者刪除該K8s Service。