通過ASM實現(xiàn)TCP應(yīng)用流量遷移
當您需要優(yōu)化網(wǎng)絡(luò)拓撲、擴容應(yīng)用服務(wù)器或調(diào)整業(yè)務(wù)流量時,可以通過ASM的流量管理中心實現(xiàn)TCP應(yīng)用流量的平滑遷移,確保關(guān)鍵業(yè)務(wù)的連續(xù)性和服務(wù)的高可用性。以Istio官方Task TCP-Traffic-Shifting為例,本文介紹如何在一個TCP服務(wù)的兩個版本之間進行流量灰度切換。該Task中的Echo服務(wù)有兩個版本,v1版本響應(yīng)時會在接收到的消息前添加前綴“one”,v2版本會添加“two”,您可以觀察流量轉(zhuǎn)移的效果,并對分流策略進行微調(diào),以滿足具體的業(yè)務(wù)需求和性能目標。
前提條件
已開通以下服務(wù):
已創(chuàng)建ACK集群。具體操作,請參見創(chuàng)建Kubernetes專有版集群和創(chuàng)建Kubernetes托管版集群。
已將ACK集群添加到ASM實例。具體操作,請參見創(chuàng)建ASM實例和添加集群到ASM實例。
步驟一:部署示例應(yīng)用
部署TCP- Echo應(yīng)用的2個版本。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在無狀態(tài)頁面上方,選擇目標命名空間,然后單擊右上角的使用YAML創(chuàng)建資源。
設(shè)置示例模板為自定義,將下面的YAML粘貼到模板文本框,然后單擊創(chuàng)建。
apiVersion: apps/v1 kind: Deployment metadata: name: tcp-echo-v1 spec: replicas: 1 selector: matchLabels: app: tcp-echo version: v1 template: metadata: labels: app: tcp-echo version: v1 spec: containers: - name: tcp-echo image: docker.io/istio/tcp-echo-server:1.1 imagePullPolicy: IfNotPresent args: [ "9000", "one" ] ports: - containerPort: 9000 --- apiVersion: apps/v1 kind: Deployment metadata: name: tcp-echo-v2 spec: replicas: 1 selector: matchLabels: app: tcp-echo version: v2 template: metadata: labels: app: tcp-echo version: v2 spec: containers: - name: tcp-echo image: docker.io/istio/tcp-echo-server:1.1 imagePullPolicy: IfNotPresent args: [ "9000", "two" ] ports: - containerPort: 9000
在無狀態(tài)頁面,可以看到新創(chuàng)建的兩個版本的TCP-Echo應(yīng)用。
創(chuàng)建一個服務(wù),并將其對外暴露。
登錄容器服務(wù)管理控制臺,在左側(cè)導(dǎo)航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在服務(wù)頁面上方,選擇目標命名空間,然后單擊右上角的創(chuàng)建。
在創(chuàng)建服務(wù)對話框,配置服務(wù)的相關(guān)信息,然后單擊確定。
配置項
說明
服務(wù)名稱
配置為tcp-echo。
服務(wù)類型
選擇服務(wù)類型,即服務(wù)訪問的方式。支持虛擬集群IP、節(jié)點端口和負載均衡。
說明當服務(wù)類型選擇虛擬集群IP時,才能設(shè)置實例間發(fā)現(xiàn)服務(wù)(Headless Service)。您可以使用無頭Service與其他服務(wù)發(fā)現(xiàn)機制進行接口,不與Kubernetes的實現(xiàn)捆綁在一起。
服務(wù)關(guān)聯(lián)
配置名稱為app,值為tcp-echo-v1。
說明將從關(guān)聯(lián)的Deployment中提取
app
這個標簽作為Service的Selector,這決定了Kubernetes service將流量轉(zhuǎn)發(fā)到哪個Deployment。由于tcp-echo-v1和tcp-echo-v2兩個Deployment擁有相同的標簽,即app:tcp-echo
,因此可以關(guān)聯(lián)任一Deployment。外部流量策略
支持Local和Cluster。
說明當您的服務(wù)類型為節(jié)點端口或負載均衡時,才能設(shè)置外部流量策略。
端口映射
本文配置名稱為tcp,服務(wù)端口和容器端口為9000,協(xié)議為TCP。
注解
為該服務(wù)添加一個注解(
annotation
),配置負載均衡的參數(shù)。例如,設(shè)置service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:20
表示將該服務(wù)的帶寬峰值設(shè)置為20 Mbit/s,控制服務(wù)的流量。關(guān)于參數(shù)的說明,請參見通過Annotation配置傳統(tǒng)型負載均衡CLB。標簽
為服務(wù)添加一個標簽,標識該服務(wù)。
創(chuàng)建成功后,在服務(wù)頁面,可以看到新創(chuàng)建的tcp-echo服務(wù)。
步驟二:設(shè)置路由規(guī)則
通過設(shè)置服務(wù)網(wǎng)格的Istio網(wǎng)關(guān)、虛擬服務(wù)和目標規(guī)則,將流量全部指向tcp-echo服務(wù)的v1版本。
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
創(chuàng)建服務(wù)網(wǎng)關(guān)。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,命名空間選擇default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: tcp-echo-gateway spec: selector: istio: ingressgateway servers: - port: number: 31400 name: tcp protocol: TCP hosts: - "*"
創(chuàng)建虛擬服務(wù)。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,命名空間選擇default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 route: - destination: host: tcp-echo port: number: 9000 subset: v1
創(chuàng)建目標規(guī)則。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 ,然后在右側(cè)頁面,單擊使用YAML創(chuàng)建。
在創(chuàng)建頁面,命名空間選擇default,選擇任意場景模版,配置以下YAML,然后單擊創(chuàng)建。
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: tcp-echo-destination spec: host: tcp-echo subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
步驟三:部署入口網(wǎng)關(guān)
在入口網(wǎng)關(guān)中,添加端口31400,并指向Istio網(wǎng)關(guān)的31400端口。
登錄ASM控制臺,在左側(cè)導(dǎo)航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導(dǎo)航欄,選擇 。
在入口網(wǎng)關(guān)頁面,單擊創(chuàng)建,進行相關(guān)配置,然后單擊創(chuàng)建。
部分配置項說明如下。關(guān)于配置項的更多說明,請參見創(chuàng)建入口網(wǎng)關(guān)。
配置項
說明
部署集群
選擇要部署入口網(wǎng)關(guān)的集群。
負載均衡CLB類型
本文選擇公網(wǎng)訪問。
選擇負載均衡
使用已有負載均衡:從已有負載均衡列表中選擇。
新建負載均衡CLB:單擊新建負載均衡CLB,從下拉列表中選擇所需的負載均衡規(guī)格。
說明建議您為每個Kubernetes服務(wù)分配一個CLB。如果多個Kubernetes服務(wù)復(fù)用同一個CLB,存在以下風(fēng)險和限制:
使用已有的CLB會強制覆蓋已有監(jiān)聽,可能會導(dǎo)致您的應(yīng)用不可訪問。
Kubernetes通過Service創(chuàng)建的CLB不能復(fù)用,只能復(fù)用您手動在控制臺(或調(diào)用OpenAPI)創(chuàng)建的CLB。
復(fù)用同一個CLB的多個Service不能有相同的前端監(jiān)聽端口,否則會造成端口沖突。
復(fù)用CLB時,監(jiān)聽的名字以及虛擬服務(wù)器組的名字被Kubernetes作為唯一標識符。請勿修改監(jiān)聽和虛擬服務(wù)器組的名字。
不支持跨集群復(fù)用CLB。
端口映射
單擊添加端口,配置名稱為tcp,服務(wù)端口為31400。
步驟四:檢查部署結(jié)果
通過Kubectl確認tcp-echo服務(wù)的流量指向是否符合預(yù)期。
通過Kubectl客戶端連接至Kubernetes集群。具體操作,請參見步驟二:選擇集群憑證類型。
執(zhí)行以下命令,獲得服務(wù)的地址與端口。
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
使用
telnet
指令向tcp-echo服務(wù)發(fā)起連接請求。$ telnet $INGRESS_HOST $INGRESS_PORT Trying xxx.xxx.xxx.xxx... Connected to xxx.xxx.xxx.xxx. Escape character is '^]'
輸入任意字符串,按Enter發(fā)送。
返回的字符串前面帶了“one”,說明tcp-echo服務(wù)已經(jīng)成功部署,且流量全部指向了tcp-echo-v1版本。
步驟五:按比例將流量路由到tcp-echo-v2
此處將20%的流量指向tcp-echo-v2版本,其余80%仍然打到tcp-echo-v1。
修改ASM實例的虛擬服務(wù)配置。
在網(wǎng)格詳情頁面左側(cè)導(dǎo)航欄,選擇 。
在虛擬服務(wù)頁面,單擊tcp-echo所在操作列中的YAML。
在編輯實例頁面的文本框中輸入以下YAML文件內(nèi)容,單擊確定。
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: tcp-echo spec: hosts: - "*" gateways: - tcp-echo-gateway tcp: - match: - port: 31400 route: - destination: host: tcp-echo port: number: 9000 subset: v1 weight: 80 - destination: host: tcp-echo port: number: 9000 subset: v2 weight: 20
執(zhí)行以下命令,向tcp-echo服務(wù)發(fā)起10次請求。
$ for i in {1..10}; do \ docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \ done one Mon Nov 12 23:38:45 UTC 2018 two Mon Nov 12 23:38:47 UTC 2018 one Mon Nov 12 23:38:50 UTC 2018 one Mon Nov 12 23:38:52 UTC 2018 one Mon Nov 12 23:38:55 UTC 2018 two Mon Nov 12 23:38:57 UTC 2018 one Mon Nov 12 23:39:00 UTC 2018 one Mon Nov 12 23:39:02 UTC 2018 one Mon Nov 12 23:39:05 UTC 2018 one Mon Nov 12 23:39:07 UTC 2018
根據(jù)以上請求的分發(fā)情況,可以看到20%的流量指向了tcp-echo-v2。
說明您的測試結(jié)果可能不一定總是10次中有2次打到tcp-echo-v2,但從較長時間范圍的總體比例來看,將接近20%。