代理 gRPC 流量
Google Remote Procedure Call(gRPC)是一个开源的高性能 RPC 框架,基于 HTTP/2 协议构建,并使用 Protocol Buffers(protobuf)作为接口描述语言(IDL)。
本文介绍如何通过 Ingress Controller 配置网关代理 gRPC 流量。
前提条件
- 完成设置 Ingress Controller 和网关。
- 安装 gRPCurl,用于验证 gRPC 流量代理。
启动示例上游服务
创建 Kubernetes manifest 文件,定义 gRPC server 的 Deployment 和 Service:
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
创建路由
- Gateway API
- APISIX CRD
创建 Kubernetes manifest 文件,将 GRPCRoute 配置到 gRPC 服务:
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
创建 Kubernetes manifest 文件,将路由配置到 gRPC 服务,并将上游协议 配置为 grpc:
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
namespace: aic
name: grpc-service
spec:
ingressClassName: apisix
scheme: grpc
---
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
namespace: aic
name: grpc-route
spec:
ingressClassName: apisix
http:
- name: helloworld-greeter
match:
paths:
- /helloworld.Greeter/SayHello
methods:
- GET
- POST
backends:
- serviceName: grpc-service
servicePort: 50051
将配置应用到集群:
kubectl apply -f grpc-route.yaml
更新 HTTP/2 网关配置
默认情况下,网关会在 9443 端口支持经过 TLS 加密的 HTTP/2。如需使用未加密的 HTTP/2,可以在网关配置中新增端口。
本节将更新网关配置和部署,使其在 9081 端口支持未加密的 HTTP/2。
- APISIX 网关
- API7 网关
如需更新网关的 HTTP/2 配置,先导出所有 values(包括默认值):
helm get values -n aic apisix --all > values.yaml
在 values 文件中按如下方式更新配置:
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
如需更新网关的 HTTP/2 配置,先导出所有 values(包括默认值):
helm get values -n aic api7-ee-3-gateway --all > values.yaml
在 values 文件中按如下方式更新配置:
gateway:
http:
enabled: true
ip: 0.0.0.0
servicePort: 80
containerPort: 9080
additionalContainerPorts:
- port: 9081
enable_http2: true
升级 Helm release:
helm upgrade --install -n aic api7-ee-3-gateway api7/gateway -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"
}