GRPC 路由
3 minute read
GRPCRoute 资源允许用户通过匹配 HTTP/2 流量并将其转发到后端 gRPC 服务器来配置 gRPC 路由。 要了解有关 gRPC 路由的更多信息,请参阅Gateway API 文档。
先决条件
按照快速入门中的步骤安装 Envoy Gateway 和示例清单。 在继续之前,您应该能够使用 HTTP 查询示例程序后端。
安装
安装 gRPC 路由示例资源:
kubectl apply -f https://raw.githubusercontent.com/envoyproxy/gateway/latest/examples/kubernetes/grpc-routing.yaml
该清单安装 GatewayClass、Gateway、Deployment、Service 和 GRPCRoute 资源。 GatewayClass 是集群范围的资源,表示可以被实例化的一类 Gateway。
**注意:**Envoy Gateway 默认被配置为使用 controllerName: gateway.envoyproxy.io/gatewayclass-controller
管理 GatewayClass。
验证
检查 GatewayClass 的状态:
kubectl get gc --selector=example=grpc-routing
状态应反映为 Accepted=True
,表示 Envoy Gateway 正在管理 GatewayClass。
Gateway 代表基础设施的配置。创建 Gateway 时,Envoy 代理基础设施由 Envoy Gateway 预配或配置。
gatewayClassName
定义此 Gateway 使用的 GatewayClass 的名称。检查 Gateway 状态:
kubectl get gateways --selector=example=grpc-routing
状态应反映为 Ready=True
,表示 Envoy 代理基础设施已被配置。
该状态还提供 Gateway 的地址。该地址稍后用于测试与代理后端服务的连接。
检查 GRPCRoute 的状态:
kubectl get grpcroutes --selector=example=grpc-routing -o yaml
GRPCRoute 的状态应显示 Accepted=True
和引用示例 Gateway 的 parentRef
。
example-route
匹配 grpc-example.com
的任何流量并将其转发到 yages
服务。
测试配置
在测试到 yages
后端的 GRPC 路由之前,请获取 Gateway 的地址。
export GATEWAY_HOST=$(kubectl get gateway/example-gateway -o jsonpath='{.status.addresses[0].value}')
使用 grpcurl 命令测试到 yages
后端的 GRPC 路由。
grpcurl -plaintext -authority=grpc-example.com ${GATEWAY_HOST}:80 yages.Echo/Ping
您应该看到以下响应:
{
"text": "pong"
}
Envoy Gateway 还支持此配置的 gRPC-Web 请求。下面的 curl
命令可用于通过 HTTP/2 发送 grpc-Web 请求。
您应该收到与上一个命令相同的响应。
正文 AAAAAAA=
中的数据是 Ping RPC 接受的空消息(数据长度为 0)的 Base64 编码表示。
curl --http2-prior-knowledge -s ${GATEWAY_HOST}:80/yages.Echo/Ping -H 'Host: grpc-example.com' -H 'Content-Type: application/grpc-web-text' -H 'Accept: application/grpc-web-text' -XPOST -d'AAAAAAA=' | base64 -d
GRPCRoute 匹配
matches
字段可用于根据 GRPC 的服务和/或方法名称将路由限制到一组特定的请求。
它支持两种匹配类型:Exact
(精准)和 RegularExpression
(正则)。
精准
Exact
(精准)匹配是默认匹配类型。
以下示例显示如何根据 grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo
的服务和方法名称来匹配请求,
以及如何在我们的部署中匹配方法名称为 Ping
且与 yages.Echo/Ping
匹配的所有服务。
cat <<EOF | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
name: yages
labels:
example: grpc-routing
spec:
parentRefs:
- name: example-gateway
hostnames:
- "grpc-example.com"
rules:
- matches:
- method:
method: ServerReflectionInfo
service: grpc.reflection.v1alpha.ServerReflection
- method:
method: Ping
backendRefs:
- group: ""
kind: Service
name: yages
port: 9000
weight: 1
EOF
保存以下资源并将其应用到您的集群:
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
name: yages
labels:
example: grpc-routing
spec:
parentRefs:
- name: example-gateway
hostnames:
- "grpc-example.com"
rules:
- matches:
- method:
method: ServerReflectionInfo
service: grpc.reflection.v1alpha.ServerReflection
- method:
method: Ping
backendRefs:
- group: ""
kind: Service
name: yages
port: 9000
weight: 1
验证 GRPCRoute 状态:
kubectl get grpcroutes --selector=example=grpc-routing -o yaml
使用 grpcurl 命令测试到 yages
后端的 GRPC 路由。
grpcurl -plaintext -authority=grpc-example.com ${GATEWAY_HOST}:80 yages.Echo/Ping
正则
以下示例演示如何根据服务和方法名称将请求与匹配类型 RegularExpression
进行匹配。
它与模式 /.*.Echo/Pin.+
匹配所有服务和方法,该模式与我们部署中的 yages.Echo/Ping
匹配。
cat <<EOF | kubectl apply -f -
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
name: yages
labels:
example: grpc-routing
spec:
parentRefs:
- name: example-gateway
hostnames:
- "grpc-example.com"
rules:
- matches:
- method:
method: ServerReflectionInfo
service: grpc.reflection.v1alpha.ServerReflection
- method:
method: "Pin.+"
service: ".*.Echo"
type: RegularExpression
backendRefs:
- group: ""
kind: Service
name: yages
port: 9000
weight: 1
EOF
保存以下资源并将其应用到您的集群:
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
name: yages
labels:
example: grpc-routing
spec:
parentRefs:
- name: example-gateway
hostnames:
- "grpc-example.com"
rules:
- matches:
- method:
method: ServerReflectionInfo
service: grpc.reflection.v1alpha.ServerReflection
- method:
method: "Pin.+"
service: ".*.Echo"
type: RegularExpression
backendRefs:
- group: ""
kind: Service
name: yages
port: 9000
weight: 1
检查 GRPCRoute 状态:
kubectl get grpcroutes --selector=example=grpc-routing -o yaml
使用 grpcurl 命令测试到 yages
后端的 GRPC 路由。
grpcurl -plaintext -authority=grpc-example.com ${GATEWAY_HOST}:80 yages.Echo/Ping
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.