全部產品
Search
文件中心

Alibaba Cloud Service Mesh:Nginx Ingress如何遷移至ASM網關

更新時間:Apr 17, 2025

本文介紹Nginx Ingress如何遷移至ASM網關。

前提條件

方案示意圖

ASM

遷移步驟

步驟一:將NginxIngress的CLB設定為可複用

1)執行下面的命令擷取nginx ingress的CLB執行個體id:

$ kubectl -n kube-system get svc nginx-ingress-lb -o yaml|grep service.k8s.alibaba/loadbalancer-id
service.k8s.alibaba/loadbalancer-id: lb-bp1gts52ced2vgaw1ni78

2)開啟阿里雲負載平衡控制台,對該Server Load Balancer執行個體進行如下操作:

  • 關閉配置修改保護。

  • 刪除Server Load Balancer執行個體的以下標籤:kubernetes.do.not.deleteack.aliyun.com

  • 將名稱以k8s/開頭的虛擬伺服器組的名稱修改為:shared-連接埠號碼。例如,k8s/80/nginx-ingress-lb/kube-system/c553a74e6ad13423aa839c8e5******** 修改為shared-80。

3)修改nginx ingress的service,加入如下annotation:

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${Server Load Balancer執行個體id}

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 有多個連接埠及虛擬伺服器組的組合,可以通過英文半形逗號(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"需要注意的是,這裡要求提供的是虛擬伺服器組的id,而不是之前命名的名稱如shared-80。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100"

步驟二:建立ASM網關

您需要通過Yaml建立ASM網關,但是您仍然可以在ASM網關建立頁面以可視化配置網關,並在配置完畢後點擊頁面底部的預覽按鈕以直接獲得一個基礎的yaml檔案。在您獲得該yaml後,您需要對這個yaml中的serviceAnnotations進行編輯,添加如下service annotation,以複用NginxIngress的CLB執行個體。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${Server Load Balancer執行個體id}

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "false"

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: 有多個連接埠及虛擬伺服器組的組合,可以通過英文半形逗號(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"需要注意的是,這裡要求提供的是虛擬伺服器組的id,而不是之前命名的名稱如shared-80。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"

相關ServiceAnnotations舉例如下:

 serviceAnnotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "lb-xxxxx"  //lb-xxxxx替換為您通過負載平衡管理主控台建立的CLB執行個體ID。
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'  //需要顯示地設定為false,因為Istiogateway預設是覆蓋監聽的方式。
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:80"   //${YOUR_VGROUP_ID}替換為虛擬伺服器。
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "0"   //設定Service流量權重,初始設定為0,ASM網關不接受流量。

步驟三:手動Translate Ingress為VS、DR等Istio側的配置

請參照如下Ingress配置,將Ingress翻譯為Istio對應的VirtualService配置。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloworld
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: helloworld
              servicePort: 80
            path: /helloworld(/|$)(.*)
      host: example.com

預期結果:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: example-vs
spec:
  gateways:
  - istio-system/ingressgateway  ## your gateway name
  hosts:
  - example.com
  http:
  - name: route-helloworld
    match:
    - uri:
        prefix: /helloworld/
    - uri:
        prefix: /helloworld
    rewrite:
      uri: /
    route:
    - destination:
        host: helloworld
        port:
          number: 80

VirtualService和Destinationrule可以和對應的服務Deployment放在同一個Namespace。如果不在同一個Namespace,對應的destination.host欄位需要填寫為FQDN格式。

步驟四:驗證流量

Ingress配置轉換為對應的VirtualService後,您還需要進行驗證測試,確認配置是否正確以及是否生效。因此需要進行驗證測試。參考方案示意圖,您可以手動建立一個CLB,然後發送測試流量請求至該CLB進行測試流量驗證,或是直接在叢集內請求ASM入口網關服務,通過測試結果判斷配置是否正確。

步驟五:調整Ingress對應的CLB下各個後端執行個體的權重,將流量逐漸遷移到ASM網關

推薦對應ASM網關執行個體的權重設定為一個較小的值(如1%),觀察線上請求是否符合預期,一定時間後逐漸增加,直到全部切換到ASM網關。

權重調整方式如下:

  • ASM網關的執行個體對應權重可以通過IstioGateway下的ServiceAnnotaions進行調整,對應service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "60"

  • Nginx執行個體對應的權重,可以通過編輯相關Service下的Annotation:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight進行操作。若Service未配置權重相關Annotation,Nginx Ingress執行個體的分發權重可以直接通過CLB控制台下進行權重配置操作。