本文介紹自建Istio IngressGateway如何遷移至ASM網關。
方案示意圖

步驟一:將Istio網關所建立的CLB改為可複用
如果Istio網關對應的CLB是由Service自動建立的,則該CLB預設不可複用。為了實現在遷移過程中通過該SLB將流量按比例分配至Istio網關和ASM網關,則需要將其改為可複用。
前往CLB控制台,找到相關的CLB執行個體。點擊執行個體ID進入執行個體配置介面。
關閉執行個體的配置修改保護
刪除對應CLB上的這兩個特殊標籤:
kubernetes.do.not.delete、ack.aliyun.com。為Istio網關的Service添加如下Annotation:
# 當這個註解為false時,當前Service的連接埠變更將不會影響對應的CLB監聽。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${對應CLB id}
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: ${虛擬伺服器組ID}:${連接埠},${虛擬伺服器組ID}:${連接埠}...
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"樣本:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1onpskfeceg********
# 虛擬伺服器組資訊可以通過CLB控制台獲得,進入執行個體後點擊“虛擬伺服器組”標籤頁
# 您需要將SLB所有的虛擬伺服器組全部列在下面的annotation中,格式為${虛擬服務組ID}:${連接埠}
# 多個值以,分割。
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: rsp-bp1r4xk******:15021,rsp-bp1kaqd******:80,rsp-bp1jyz0******:443
# 在遷移開始之前,Istio網關的權重為100,全部流量經過Istio網關
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"步驟二:在ASM執行個體中建立入口網關
關於建立入口網關的具體操作,請參見建立入口網關。
建立入口網關時,請注意以下幾點:
參考ASM網關CRD說明,使用Yaml建立ASM網關
命名ASM網關時,請確認ASM網關名稱不與已有網關重名。您可以在命名時加上-asm尾碼,與已有網關進行明確區分,例如命名為ingressgateway-asm。
您需要確保ASM網關的port列表以及targetPort與Istio網關相同
參考步驟一:將Istio網關所建立的CLB改為可複用中的(4),通過CRD(參考CRD欄位說明)建立ASM網關。為了複用Istio網關的CLB並實現CLB切流,ASM網關的serviceAnnotation配置如下:
# 當這個註解為true時,ACK會使用ASM網關的Service的連接埠來更新CLB的Listener。 # 為了確保服務不中斷,請確保ASM網關暴露的連接埠和Istio網關一致。 # 如果建立後出現流量異常,請將ASM網關上的這個註解改為false,並將Istio網關上的該註解改為true來恢複監聽配置。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: lb-bp1onpskfeceg******** # 虛擬伺服器組資訊可以通過CLB控制台獲得,進入執行個體後點擊“虛擬伺服器組”標籤頁 # 您需要將SLB所有的虛擬伺服器組全部列在下面的annotation中,格式為${虛擬服務組ID}:${連接埠} # 多個值以,分割。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: rsp-bp1r4xk******:15021,rsp-bp1kaqd******:80,rsp-bp1jyz0******:443 # 在遷移開始之前,Istio網關的權重為100,全部流量經過Istio網關。ASM網關權重為0。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"
驗證CLB複用,開啟CLB控制台,選擇虛擬伺服器組,點擊虛擬伺服器組名稱查看虛擬伺服器組後端,若Istio網關Pod地址和ASM網關Pod地址都出現在列表中,即表示本步驟成功完成。
步驟三:將網關相關配置遷移至ASM
為了使得ASM網關行為與Istio網關一致,您需要將Istio中與該網關相關的配置應用至ASM。
由於ASM網關不能與Istio網關重名,遷移Gateway CR時,Gateway CR的spec.selcetor.istio欄位需修改為實際的ASM網關名稱。YAML樣本如下:
spec: selector: istio: ingressgateway-asmVirtualService CR、DestinationRule CR等無需修改,隨即轉移。
步驟四:將流量灰階遷移至ASM網關
通過分別修改Istio網關和ASM入口網關的serviceAnnotations,可以切換新舊兩個網關的權重。您可以通過緩慢放大ASM網關流量比例同時緩慢縮小Istio網關流量比例將流量逐步切換至ASM網關,最終直至將全部流量切換至ASM網關,即完成遷移。
您可以通過修改Istio網關Service annotation以及ASM網關Service annotation以控制CLB轉寄流量的比例:
修改原Istio ingressGateway的權重:在對應Service中添加Annotation,例如
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "90"。修改ASM網關的執行個體的權重:在對應istiogateway下添加serviceAnnotaions,例如
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "10"。