跳至内容

gRPC 路由

实验性通道

下面描述的 GRPCRoute 资源目前仅包含在网关 API 的“实验性”通道中。有关发布通道的更多信息,请参阅我们的 版本控制指南

GRPCRoute 资源 允许您匹配 gRPC 流量并将其定向到 Kubernetes 后端。本指南展示了 GRPCRoute 如何在主机、标头、服务和方法字段上匹配流量,并将其转发到不同的 Kubernetes 服务。

下图描述了跨三个不同服务的必需流量流

  • foo.example.com 的流量,针对 com.Example.Login 方法,将被转发到 foo-svc
  • bar.example.com 的流量,带有一个 env: canary 标头,将被转发到 bar-svc-canary,针对所有服务和方法
  • bar.example.com 的流量,不带标头,将被转发到 bar-svc,针对所有服务和方法

gRPC Routing

虚线显示了部署以配置此路由行为的 Gateway 资源。有两个 GRPCRoute 资源,在同一个 prod 网关上创建路由规则。这说明了如何将多个路由绑定到网关,这允许路由在 Gateway 上合并,只要它们不冲突。GRPCRoute 遵循相同的路由合并语义。有关这方面的更多信息,请参阅 文档

为了从 网关 接收流量,GRPCRoute 资源必须使用 ParentRefs 进行配置,这些 ParentRefs 引用应将它附加到的父网关。

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
  - name: grpc
    protocol: HTTPS
    port: 50051
    tls:
      certificateRefs:
      - kind: Secret
        group: ""
        name: example-com-cert
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
  name: example-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "example.com"
  rules:
  - backendRefs:
    - name: example-svc
      port: 50051

一个 GRPCRoute 可以匹配 单个主机名集。这些主机名在 GRPCRoute 内进行任何其他匹配之前进行匹配。由于 foo.example.combar.example.com 是具有不同路由要求的独立主机,因此每个主机都部署为自己的 GRPCRoute - foo-routebar-route

以下 foo-route 将匹配 foo.example.com 的任何流量,并应用其路由规则将流量转发到正确的后端。由于只指定了一个匹配项,因此只有针对 foo.example.comcom.example.User.Login 方法的请求将被转发。任何其他方法的 RPC 都不会被此路由匹配。

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
  name: foo-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - method:
        service: com.example
        method: Login
    backendRefs:
    - name: foo-svc
      port: 50051

类似地,bar-route GRPCRoute 匹配 bar.example.com 的 RPC。此主机名的所有流量都将根据路由规则进行评估。最具体的匹配将优先,这意味着任何带有 env: canary 标头的流量将被转发到 bar-svc-canary,如果标头缺失或不具有 canary 值,则将被转发到 bar-svc

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
  name: bar-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "bar.example.com"
  rules:
  - matches:
    - headers:
      - type: Exact
        name: env
        value: canary
    backendRefs:
    - name: bar-svc-canary
      port: 50051
  - backendRefs:
    - name: bar-svc
      port: 50051

gRPC 反射 要求使用交互式客户端(如 grpcurl)来使用,而无需在本地文件系统上存在目标服务的协议缓冲区。为此,请首先确保您有一个 gRPC 反射服务器在您的应用程序 pod 上监听,然后将反射方法添加到您的 GRPCRoute 中。这在开发和登台环境中可能很有用,但仅在考虑了安全隐患之后才能在生产环境中启用。

apiVersion: gateway.networking.k8s.io/v1alpha2
kind: GRPCRoute
metadata:
  name: foo-route
spec:
  parentRefs:
  - name: example-gateway
  hostnames:
  - "foo.example.com"
  rules:
  - matches:
    - method:
        service: com.example.User
        method: Login
    backendRefs:
    - name: foo-svc
      port: 50051
  - matches:
    - method:
        service: grpc.reflection.v1.ServerReflection
    backendRefs:
    - name: foo-svc
      port: 50051