您可以通过ASM入口网关安全地访问网格内的gRPC服务,实现对gRPC服务的精确访问控制,提升服务治理能力,保障服务间通信的安全性。本文介绍如何通过入口网关访问网格内gRPC服务,并在gRPC的两个版本之间进行流量切换。
前提条件
步骤一:部署示例应用
部署名为istio-grpc-server-v1和istio-grpc-server-v2的示例应用。
创建app.yaml。
部署应用。
kubectl apply -f app.yaml
步骤二:设置路由规则
创建网关规则、虚拟服务和目标规则,将流量全部指向istio-grpc-server-v1。
创建rules.yaml。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: grpc-gateway spec: selector: istio: ingressgateway servers: - port: number: 8080 name: grpc protocol: GRPC hosts: - "*" --- apiVersion: networking.istio.io/v1beta1 kind: DestinationRule metadata: name: dr-istio-grpc-server spec: host: grpc-helloworld-py 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: grpc-vs spec: hosts: - "*" gateways: - grpc-gateway http: - match: - port: 8080 route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 100 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 0
部署规则。
kubectl apply -f rules.yaml
步骤三:部署新入口网关或复用已有入口网关
新建入口网关
创建入口网关,在配置端口映射时添加8080端口。
为已有入口网关添加8080端口
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在入口网关页面,单击目标网关名称,在网关概览页面的基本选项区域,单击端口配置右侧的
图标,在端口映射对话框,单击添加端口,设置协议为TCP,服务端口为8080,然后单击确认。
步骤四:运行gRPC客户端
安装grpcurl命令行工具,运行以下命令:
grpcurl -d '{"name": "Jack"}' -plaintext {入口网关IP地址}:8080 helloworld.Greeter/SayHello
返回以下结果,可以看到所有的请求都指向了v1。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
步骤五:按比例将流量路由到v2
更新虚拟服务,将40%的流量指向v2,其余60%的流量仍然指向v1。
编辑虚拟服务。
kubectl edit VirtualService grpc-vs
按照以下内容修改
route
部分并保存。.... route: - destination: host: grpc-helloworld-py port: number: 50051 subset: v1 weight: 60 - destination: host: grpc-helloworld-py port: number: 50051 subset: v2 weight: 40
继续使用grpcurl执行以下命令,访问网格内的gRPC服务。
grpcurl -d '{"name": "Jack"}' -plaintext {入口网关IP地址}:8080 helloworld.Greeter/SayHello
返回以下结果,可以看到40%的流量指向了v2。
说明您的测试结果不一定总是100次中有40次指向v2,但从总体比例来看,将接近40%。
"message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v2-7f56b49b7f-9vvr7!" "message": "Hello, Jack! I'm from grpc-helloworld-py-v1-79b5dc9654-cg4dq!"
该文章对您有帮助吗?