全鏈路灰度功能體驗
更新時間 2025-04-11 16:50:19
最近更新時間: 2025-04-11 16:50:19
分享文章
本章節介紹如何實現全鏈路灰度發布能力
概述
全鏈路灰度是基于流量標簽功能,在微服務整個調用鏈中進行統一的流量打標和治理,從而實現全鏈路灰度能力。本文介紹如何實現全鏈路灰度發布能力。
微服務調用關系
微服務架構中有三個服務,app1、app2、app3,調用關系如下圖,入口由Ingress網關做流量分發,要實現全鏈路灰度,預期是可以實現微服務之間只在在base版本內和test版本內調用,實現虛擬泳道。

前提條件
- 開通云容器引擎。
- 開通服務網格實例。
操作步驟
安裝ingress gateway
登錄控制臺,選擇對應的服務網格,進入網格頁面后,通過左邊欄的“網關”一欄選擇“入口網關”。
進入網關頁面后,選擇集群和命名空間后可以創建網關。

填入詳細的參數后,點確認即可。如圖:

部署應用
在云容器引擎集群內創建demo命名空間,部署base版本和test版本應用。
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1-base
namespace: demo
labels:
app: app1
csm-traffic-tag: base
spec:
replicas: 1
selector:
matchLabels:
app: app1
name: app1
csm-traffic-tag: base
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app1
name: app1
source: CCSE
csm-traffic-tag: base
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: base
- name: app
value: app1
- name: upstream_url
value: "//app2:8000/"
ports:
- containerPort: 8000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app2-base
namespace: demo
labels:
app: app2
csm-traffic-tag: base
spec:
replicas: 1
selector:
matchLabels:
app: app2
name: app2
csm-traffic-tag: base
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app2
name: app2
source: CCSE
csm-traffic-tag: base
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: base
- name: app
value: app2
- name: upstream_url
value: "//app3:8000/"
ports:
- containerPort: 8000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app3-base
namespace: demo
labels:
app: app3
csm-traffic-tag: base
spec:
replicas: 1
selector:
matchLabels:
app: app3
name: app3
csm-traffic-tag: base
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app3
name: app3
source: CCSE
csm-traffic-tag: base
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: base
- name: app
value: app3
ports:
- containerPort: 8000
test版本:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1-test
namespace: demo
labels:
app: app1
csm-traffic-tag: test
spec:
replicas: 1
selector:
matchLabels:
app: app1
name: app1
csm-traffic-tag: test
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app1
name: app1
source: CCSE
csm-traffic-tag: test
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: test
- name: app
value: app1
- name: upstream_url
value: "//app2:8000/"
ports:
- containerPort: 8000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app2-test
namespace: demo
labels:
app: app2
csm-traffic-tag: test
spec:
replicas: 1
selector:
matchLabels:
app: app2
name: app2
csm-traffic-tag: test
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app2
name: app2
source: CCSE
csm-traffic-tag: test
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: test
- name: app
value: app2
- name: upstream_url
value: "//app3:8000/"
ports:
- containerPort: 8000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app3-test
namespace: demo
labels:
app: app3
csm-traffic-tag: test
spec:
replicas: 1
selector:
matchLabels:
app: app3
name: app3
csm-traffic-tag: test
template:
metadata:
labels:
sidecar.istio.io/inject: "true"
app: app3
name: app3
source: CCSE
csm-traffic-tag: test
spec:
containers:
- name: default
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/trace-demo:v1.0.0
imagePullPolicy: IfNotPresent
env:
- name: version
value: test
- name: app
value: app3
ports:
- containerPort: 8000
關聯的Service資源:
apiVersion: v1
kind: Service
metadata:
name: app1
namespace: demo
labels:
app: app1
service: app1
withServiceMesh: "true"
spec:
ports:
- port: 8000
name: http
selector:
app: app1
---
apiVersion: v1
kind: Service
metadata:
name: app2
namespace: demo
labels:
app: app2
service: app2
withServiceMesh: "true"
spec:
ports:
- port: 8000
name: http
selector:
app: app2
---
apiVersion: v1
kind: Service
metadata:
name: app3
namespace: demo
labels:
app: app3
service: app3
withServiceMesh: "true"
spec:
ports:
- port: 8000
name: http
selector:
app: app3
創建泳道組
我們的demo應用使用trace-ctx-id作為鏈路追蹤的key,app1作為微服務的入口應用。
添加base和test泳道


確定網關的訪問入口地址,設置為GATEWAY_HOST環境變量,執行如下語句訪問:
for i in {1..100}; do curl //${GATEWAY_HOST}/; echo; sleep 1; done;

可以看到訪問在兩個版本之間跳變,微服務之間的調用也是在版本間穿插進行,此時的全鏈路沒有統一的路由策略。
請求帶上x-csm-traffic-tag: base,同時指定請求級別的trace-ctx-id:
for i in {1..200}; do curl -H "x-csm-traffic-tag: base" -H "trace-ctx-id: trace-$i" [//${GATEWAY_HOST}](); echo; sleep 1; done;
可以看到請求只在base版本之間調用:

修改頭部x-csm-traffic-tag: test,可以看到請求只在test版本之間調用:
