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

标签 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

最佳答案

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

HTTPRewrite can be used to rewrite specific parts of a HTTP request before forwarding the request to the destination. Rewrite primitive can be used only with HTTPRouteDestination. The following example demonstrates how to rewrite the URL prefix for api call (/ratings) to ratings service before making the actual API call.

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。

关于kubernetes - 如何基于Istio(Kubernetes)中的路径路由多个gRPC服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62459006/

相关文章:

kubernetes - 如何使用Traefik从我的Web Apollo 客户端公开应用程序访问Apollo服务器内部Kubernetes服务

join - 无法加入 Kubernetes 集群

jenkins - 如何为 Jenkins 管道声明定义工作区体积

istio - 使用 Traffic Director 创建的负载均衡器缺少 Stackdriver 指标

kubernetes - 在istio中推送目的地规则时会发生什么

kubernetes - Kubectl Attach 与 kubectl exec?

inheritance - GRPC 服务继承

kubernetes - 无法为 gRPC 打开 Istio 入口网关

.net - 通过依赖注入(inject)使用 Blazor Webassembly 进行 gRPC-Web channel 身份验证

kubernetes - 有没有办法配置 Istio 将流量路由到处于终止状态的 POD?