跳到主要内容

代理 gRPC 流量

Google Remote Procedure Call(gRPC)是一个开源的高性能 RPC 框架,基于 HTTP/2 协议构建,并使用 Protocol Buffers(protobuf)作为接口描述语言(IDL)。

本文介绍如何通过 Ingress Controller 配置网关代理 gRPC 流量。

前提条件

  1. 完成设置 Ingress Controller 和网关
  2. 安装 gRPCurl,用于验证 gRPC 流量代理。

启动示例上游服务

创建 Kubernetes manifest 文件,定义 gRPC server 的 Deployment 和 Service:

grpc-server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: aic
name: grpc-service
spec:
replicas: 1
selector:
matchLabels:
app: grpc-service
template:
metadata:
labels:
app: grpc-service
spec:
containers:
- name: grpc-service
image: api7/grpc-server-example:1.0.0
ports:
- containerPort: 50051
---
apiVersion: v1
kind: Service
metadata:
namespace: aic
name: grpc-service
spec:
type: ClusterIP
selector:
app: grpc-service
ports:
- name: grpc
port: 50051
targetPort: 50051

将配置应用到集群:

kubectl apply -f grpc-server.yaml

如需验证 gRPC server 是否正常运行,先将 gRPC server 的 Service 端口转发到本地:

kubectl port-forward svc/grpc-service 50051:50051 &

向该服务发送请求,列出所有可用的 gRPC 服务和方法:

grpcurl -plaintext 127.0.0.1:50051 list

如果一切正常,你应看到以下响应:

grpc.reflection.v1alpha.ServerReflection
helloworld.Greeter
helloworld.TestImport

列出 helloworld.Greeter 服务的所有可用方法:

grpcurl -plaintext 127.0.0.1:50051 list helloworld.Greeter

如果一切正常,你应看到以下响应:

helloworld.Greeter.GetErrResp
helloworld.Greeter.Plus
helloworld.Greeter.SayHello
helloworld.Greeter.SayHelloAfterDelay
helloworld.Greeter.SayHelloBidirectionalStream
helloworld.Greeter.SayHelloClientStream
helloworld.Greeter.SayHelloServerStream

创建路由

创建 Kubernetes manifest 文件,将 GRPCRoute 配置到 gRPC 服务:

grpc-route.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GRPCRoute
metadata:
namespace: aic
name: grpc-route
spec:
parentRefs:
- name: apisix
rules:
- matches:
- method:
service: helloworld.Greeter
method: SayHello
backendRefs:
- name: grpc-service
port: 50051

将配置应用到集群:

kubectl apply -f grpc-route.yaml

更新 HTTP/2 网关配置

默认情况下,网关会在 9443 端口支持经过 TLS 加密的 HTTP/2。如需使用未加密的 HTTP/2,可以在网关配置中新增端口。

本节将更新网关配置和部署,使其在 9081 端口支持未加密的 HTTP/2。

如需更新网关的 HTTP/2 配置,先导出所有 values(包括默认值):

helm get values -n aic apisix --all > values.yaml

在 values 文件中按如下方式更新配置:

values.yaml
service:
http:
containerPort: 9080
enabled: true
servicePort: 80
additionalContainerPorts:
- port: 9081
enable_http2: true

升级 Helm release:

helm upgrade -n aic apisix apisix/apisix -f values.yaml

验证

这里下载 helloworld.proto 文件。

本示例使用 helloworld.proto 文件,确保 gRPCurl CLI 工具的请求和响应格式与 gRPC 服务定义一致。

将网关的 HTTP/2 Service 端口暴露到本地:

# 替换为你的网关 Service 名称
kubectl port-forward svc/<gateway-service-name> 9081:9081 &

向路由发送请求:

grpcurl -plaintext \
-proto helloworld.proto \
-d '{"name":"World"}' \
"127.0.0.1:9081" \
"helloworld.Greeter.SayHello"

你应看到以下输出:

{
"message": "Hello World"
}