如何基于Istio(Kubernetes)中的路径路由多个gRPC服务

时间:2020-06-18 20:38:11

标签: kubernetes grpc istio

我设法在根路径中运行一项grpc服务。但是我试图通过在虚拟服务中添加自定义路径路由来添加更多的grpc服务,但这是行不通的。任何帮助将不胜感激。

这是网关:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

我将此虚拟服务路由到仅一个grpc服务,并且工作正常

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtual-svc
spec:
  hosts:
    - "*"
  gateways:
    - my-gateway
  http:
  - name: "my-grpc-1"
    match:
    - uri:
        prefix: "/"
    route:
    - destination:
        port:
          number: 9090
        host: my-grpc-1-svc

但是我想尝试以下类似的方法,但是它不起作用

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtual-svc
spec:
  hosts:
    - "*"
  gateways:
    - my-gateway
  http:
  - name: "my-grpc-1"
    match:
    - uri:
        prefix: "/my-grpc-1"
    route:
    - destination:
        port:
          number: 9090
        host: my-grpc-1-svc
  - name: "my-grpc-2"
    match:
    - uri:
        prefix: "/my-grpc-2"
    route:
    - destination:
        port:
          number: 9090
        host: my-grpc-2-svc

2 个答案:

答案 0 :(得分:0)

那可能不起作用,因为您的应用程序监听/并使用第一个虚拟服务,而ipio有效,istio将请求发送到/,而第二个虚拟服务却没有发生。

答案是将rewrite添加到您的第二个虚拟服务中。

HTTPRewrite可用于在将请求转发到目标之前重写HTTP请求的特定部分。重写原语只能与HTTPRouteDestination一起使用。以下示例演示了在进行实际的API调用之前,如何将api调用(/ ratings)的URL前缀重写为Ratings服务。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings.prod.svc.cluster.local
  http:
  - match:
    - uri:
        prefix: /ratings
    rewrite:
      uri: /v1/bookRatings
    route:
    - destination:
        host: ratings.prod.svc.cluster.local
        subset: v1

所以看起来像这样

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtual-svc
spec:
  hosts:
    - "*"
  gateways:
    - my-gateway
  http:
  - name: "my-grpc-1"
    match:
    - uri:
        prefix: "/my-grpc-1"
    rewrite:
      uri: "/"
    route:
    - destination:
        port:
          number: 9090
        host: my-grpc-1-svc
  - name: "my-grpc-2"
    match:
    - uri:
        prefix: "/my-grpc-2"
    rewrite:
      uri: "/"
    route:
    - destination:
        port:
          number: 9090
        host: my-grpc-2-svc

与此相关的文档为here


我认为您可以尝试使用此github issue comment

中提到的gRPC服务的FQN来做到这一点。

另一个想法是像上面提到的here一样使用nginx。

答案 1 :(得分:0)

以下是使用 grpc 和 istio 时的一些提示(使用 istio 1.9.2 测试)。

1.在服务中设置协议:

kind: Service
metadata:
  name: my-grpc-service
spec:
  ports:
  - number: 9009
    appProtocol: grpc

2.在网关中设置协议:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-gateway
spec:
  servers:
    - port:
        number: 80
        name: grpc
        protocol: GRPC
      hosts:
        - "*"

3.grpc 生成的 uri 路径前缀将与 .proto 文件中的 package 值相同:

syntax = "proto3";    
package somepath;

将其用作 match.uri.prefix

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtual-svc
spec:
  http:
  - name: "my-grpc-1"
    match:
    - uri:
        prefix: "/somepath"