本文介紹Nginx Ingress如何遷移至ASM網關。
前提條件
已建立ASM企業版或旗艦版執行個體,且執行個體版本為最新版本。具體操作,請參見建立ASM執行個體。
已添加ACK叢集到ASM執行個體。具體操作,請參見添加叢集到ASM執行個體。
方案示意圖
遷移步驟
步驟一:建立ASM網關
在ASM執行個體下採用IstioGateway YAML方式建立ASM網關時,需要複用已有的Nginx Ingress對應的CLB,建立對應ASM網關的IstioGateway YAML時,需要注意以下幾點:
通過Service Loadbalancer型別宣告建立的CLB複用,請參見FAQ。
編輯ASM網關對應的IstioGateway YAML,在serviceAnnotations下設定CLB相關配置。
複用Ingress已有的CLB執行個體,對應service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id Annotation。
設定不覆蓋CLB已有監聽,對應service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: 'false'。
複用CLB已有的虛擬伺服器組,如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port有多個連接埠及虛擬伺服器組的組合,可以通過英文半形逗號(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。
確認CLB的負載平衡調度演算法已調整為WRR(加權輪詢),請根據需要,調整ASM網關執行個體在CLB下的權重。若將權重設定為0,CLB不會轉寄流量,通常用於前期ASM網關下對應路由配置還未完或者遭遇異常時需要摘除流量的情境。
相關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: "60" //設定Service流量權重,設定為0,則不再接受流量。
步驟二:手動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進行測試流量驗證,通過測試結果判斷配置是否正確。
步驟四:調整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控制台下進行權重配置操作。