本文介紹如何通過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網關管理主控台,並在頂部功能表列選擇地區。
在左側導覽列,選擇雲原生網關 > 迁移上云。
在迁移上云頁面,單擊创建任务。
在创建迁移配置面板,進行相關配置。
雲原生網關將自動監聽所選容器叢集內且關聯到源IngressClass的所有Ingress資源的變化,並生效Ingress資源中網域名稱和路由的相關配置。
重要如果目標雲原生網關叢集中已關聯該容器叢集,且已配置的IngressClass與此處的配置不同,則不允許遷移。請確保此處配置的IngressClass與已關聯容器叢集配置的IngressClass一致。
配置項
說明
云原生网关实例
選擇要遷移至的目標雲原生網關。要求雲原生網關的版本至少為1.2.22。
Container ServiceACK/ACK Serverless叢集
選擇要遷移的Nginx Ingress對應的容器叢集,請確保雲原生網關與容器叢集處於同一VPC。
源IngressClass
配置待遷移的Ingress資源關聯的IngressClass資源。
說明僅支援配置單個IngressClass。
配置為空白,即忽略IngressClass,表示監聽叢集中所有的Ingress資源。
描述
長度限制為64個字元
單擊下一步。
此時雲原生網關將自動監聽所選容器叢集內,關聯到源IngressClass的所有Ingress資源的變化,並生效Ingress資源中網域名稱、路由的相關配置。
假設在原有容器叢集內有一個名稱為httpbin的Ingress。
在雲原生網關控制台可以看到目的地組群中的Ingress已自動同步到目標雲原生網關中,並產生與之對應的網域名稱、路由的相關配置。路由配置詳情頁內容如下:
配置引導模組:
添加服務來源
支援以 K8s、Nacos、Zookeeper、SAE、EDAS 和 FC 作為服務來源。您可以添加一個當前 VPC 中已有的資源,然後從中選擇註冊的服務。
按鈕:添加服務來源
關聯後端服務
會將請求分發給後端服務。後端服務可以從服務來源動態發現,也可以通過靜態地址或網域名稱指定。
按鈕:關聯後端服務
綁定網域名稱
提供了多網域名稱管理能力。通過綁定網域名稱,您可以關聯不同網域名稱下的協議、認證與路由配置。
按鈕:綁定網域名稱
建立路由
路由包含可以指定規則匹配的網域名稱、路徑、方法、請求參數和要求標頭。當使用者訪問路由時,請求將會被路由到路由對應的後端服務。
按鈕:建立路由
列表欄位:路由名稱、狀態、WAF安全防護、來源、路由條件、關聯網域名稱、目標服務類型、目標服務、操作。
步驟二:路由校正
校正監聽的Ingress的相容性:
如果無不相容的Ingress Annotation,則繼續下一步。
如果存在不相容的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,修改完成後,單擊前置檢查,檢查通過後,會進入下一步。
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: '100'
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 'rsp-bp1uybv6iy50i:80,rsp-bp10s0ndrfvdt:443'
creationTimestamp: '2023-11-29T07:14:40Z'
finalizers:
- service.k8s.alibaba/resources
labels:
app: nginx-ingress-lb
service.beta.kubernetes.io/hash: 39a51bd97b88f6eaf232da33434ce2fe44ae094b7b4d2b9bb9126eb7
service.k8s.alibaba/loadbalancer-id: lb-bp1lc0huzf0o1ks333yo1
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
'f:metadata':
'f:annotations':
.: {}
'f:kubectl.kubernetes.io/last-applied-configuration': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type': {}
'f:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id': {}
'f:labels':
.: {}
'f:app': {}如果您的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即可,本次遷移終止。
您可以在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的全部流量切換至雲原生網關。單擊完成迁移,此次遷移任務結束。
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,請按照實際情況選擇以下方法:
如果您是通過MseIngressConfig管理MSE Ingress,請參見通過MSE Ingress訪問Container Service和容器計算服務進行修改。
如果您不是通過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未刪除。請到Container Service控制台修改該K8s Service服務的註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight的值為0,或者刪除該K8s Service。

