gRPC协议治理 前提条件 1. 已开通云容器引擎,至少有一个云容器引擎集群实例。产品入口:云容器引擎。 2. 开通天翼云服务网格实例。 操作步骤 gRPC是远程过程调用框架(RPC),有多语言的实现,底层采用HTTP2作为传输协议;由于HTTP2采用长连接机制,在负载均衡的场景下可能导致负载的不平衡,本文介绍负载不均衡的场景以及如何通过服务网格实现负载均衡。 部署gRPC server和client应用。 apiVersion: apps/v1 kind: Deployment metadata: name: grpcserverv1 labels: app: grpcserver version: v1 spec: replicas: 1 selector: matchLabels: app: grpcserver version: v1 template: metadata: labels: app: grpcserver version: v1 spec: containers: args: address0.0.0.0:8080 image: registryvpccrshuadong1.cnspinternal.ctyun.cn/library/grpcserver imagePullPolicy: Always name: grpcserver ports: containerPort: 8080 apiVersion: apps/v1 kind: Deployment metadata: name: grpcserverv2 labels: app: grpcserver version: v2 spec: replicas: 1 selector: matchLabels: app: grpcserver version: v2 template: metadata: labels: app: grpcserver version: v2 spec: containers: args: address0.0.0.0:8080 image: registryvpccrshuadong1.cnspinternal.ctyun.cn/library/grpcserver imagePullPolicy: Always name: grpcserver ports: containerPort: 8080 apiVersion: v1 kind: Service metadata: name: grpcserver labels: app: grpcserver spec: ports: name: grpcbackend port: 8080 protocol: TCP selector: app: grpcserver type: ClusterIP apiVersion: apps/v1 kind: Deployment metadata: name: grpcclient labels: app: grpcclient spec: replicas: 1 selector: matchLabels: app: grpcclient template: metadata: labels: app: grpcclient "sidecar.istio.io/inject": "true" spec: containers: image: registryvpccrshuadong1.cnspinternal.ctyun.cn/library/grpcclient imagePullPolicy: Always command: ["/bin/sleep", "3650d"] name: grpcclient 部署之后的pod列表(一个client,两个版本的server): 通过client访问server,可以看到总是访问服务端的同一个实例。 kubectl exec it grpcclientb7499b9c45d2s n grpc /bin/greeterclient insecuretrue addressgrpcserver:8080 repeat10 为grpc client注入sidecar(打上标签"sidecar.istio.io/inject": "true"),重新部署grpcclient之后可以看到pod列表如下: 再次通过grpcclient访问grpcserver可以看到请求交替访问两个版本的grpcserver: 部署流量治理策略使70%的流量访问v2版本的grpcserver,30%的流量访问v1版本的grpcserver。 apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: drgrpcserver spec: host: grpcserver trafficPolicy: loadBalancer: simple: ROUNDROBIN subsets: name: v1 labels: version: "v1" name: v2 labels: version: "v2" apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: vsgrpcserver spec: hosts: "grpcserver" http: match: port: 8080 route: destination: host: grpcserver subset: v1 weight: 30 destination: host: grpcserver subset: v2 weight: 70 再次访问可以看到请求在grpcserver的两个版本之间不再是交替访问,而是大概按照7:3的比例访问: