gRPC協議治理
更新時間 2025-02-21 10:02:50
最近更新時間: 2025-02-21 10:02:50
分享文章
前提條件
- 已開通云容器引擎,至少有一個云容器引擎集群實例。產品入口:云容器引擎。
- 開通天翼云服務網格實例。
操作步驟
gRPC是遠程過程調用框架(RPC),有多語言的實現,底層采用HTTP2作為傳輸協議;由于HTTP2采用長連接機制,在負載均衡的場景下可能導致負載的不平衡,本文介紹負載不均衡的場景以及如何通過服務網格實現負載均衡。
部署gRPC server和client應用。
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpc-server-v1
labels:
app: grpc-server
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: grpc-server
version: v1
template:
metadata:
labels:
app: grpc-server
version: v1
spec:
containers:
- args:
- --address=0.0.0.0:8080
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/grpc-server
imagePullPolicy: Always
name: grpc-server
ports:
- containerPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpc-server-v2
labels:
app: grpc-server
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: grpc-server
version: v2
template:
metadata:
labels:
app: grpc-server
version: v2
spec:
containers:
- args:
- --address=0.0.0.0:8080
image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/grpc-server
imagePullPolicy: Always
name: grpc-server
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: grpc-server
labels:
app: grpc-server
spec:
ports:
- name: grpc-backend
port: 8080
protocol: TCP
selector:
app: grpc-server
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grpc-client
labels:
app: grpc-client
spec:
replicas: 1
selector:
matchLabels:
app: grpc-client
template:
metadata:
labels:
app: grpc-client
"sidecar.istio.io/inject": "true"
spec:
containers:
- image: registry-vpc-crs-huadong1.cnsp-internal.daliqc.cn/library/grpc-client
imagePullPolicy: Always
command: ["/bin/sleep", "3650d"]
name: grpc-client
---
部署之后的pod列表(一個client,兩個版本的server):

通過client訪問server,可以看到總是訪問服務端的同一個實例。
kubectl exec -it grpc-client-b7499b9c-45d2s -n grpc --
/bin/greeter-client --insecure=true --address=grpc-server:8080 --repeat=10

為grpc client注入sidecar(打上標簽"sidecar.istio.io/inject": "true"),重新部署grpc-client之后可以看到pod列表如下:

再次通過grpc-client訪問grpc-server可以看到請求交替訪問兩個版本的grpc-server:

部署流量治理策略使70%的流量訪問v2版本的grpc-server,30%的流量訪問v1版本的grpc-server。
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: dr-grpc-server
spec:
host: grpc-server
trafficPolicy:
loadBalancer:
simple: ROUND_ROBIN
subsets:
- name: v1
labels:
version: "v1"
- name: v2
labels:
version: "v2"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-grpc-server
spec:
hosts:
- "grpc-server"
http:
- match:
- port: 8080
route:
- destination:
host: grpc-server
subset: v1
weight: 30
- destination:
host: grpc-server
subset: v2
weight: 70
再次訪問可以看到請求在grpc-server的兩個版本之間不再是交替訪問,而是大概按照7:3的比例訪問:
