为同一端口上的不同路径匹配Istio虚拟服务路由

时间:2019-08-14 20:09:54

标签: kubernetes istio

我想知道如何在同一端口上匹配gRPC路由。这是我希望通过VirtualService完成的示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: istio-ingress
spec:
  hosts:
  - "*"
  gateways:
  - istio-gateway
  http:
  - match:
    - uri:
      prefix: "/custom.api/stream"
    - port: 31400
    route:
    - destination:
        host: stream-handler.default.svc.cluster.local
        port:
          number: 8444
    timeout: 60s
    retries:
      attempts: 3
      perTryTimeout: 2s
  - match:
    - port: 31400
    route:
    - destination:
        host: api.default.svc.cluster.local
        port:
          number: 8443
    timeout: 60s
    retries:
      attempts: 3
      perTryTimeout: 2s

所以基本上:对于所有进入31400的请求,第一个匹配项都在“ /custom.api/stream”中查找要流式传输的请求,该流具有我的流服务器的目的地。

第二条要抓住一切,才能进入我的主要API。

我的目标是使所有连接都通过31400,然后将请求分解为专用的内部服务。将来,我可能会进一步拆分服务(不仅用于流媒体)。即。端点的整个组可能由单独的群集处理。

当我部署此规则时,虽然整个VS似乎都失败了,但没有任何反应。

2 个答案:

答案 0 :(得分:1)

端口在Ingressgateway中对外公开,​​应使用Gateway在内部进行配置。 VirtualService仅用于第7层路由(一旦附加到Gateway上)。

在您的 match 配置中,您指定要寻址主机应该在端口31400中接收请求,而不是该服务正在那里侦听。来自the documentation

  

端口:指定要寻址的主机上的端口。许多服务仅使用支持的协议公开单个端口或标签端口,在这种情况下,不需要显式选择端口。

在您的情况下,您可能需要创建一个新的Gateway来处理裸露端口的配置,然后使用VirtualService连接路由部分:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: grpc-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 31400
      name: grpc
      protocol: GRPC
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grpc-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - grcp-gateway
  http:
  - match:
    - uri:
      exact: "/custom.api/stream"
    route:
    - destination:
        host: stream-handler.default.svc.cluster.local
        port:
          number: 8444
    timeout: 60s
    retries:
      attempts: 3
      perTryTimeout: 2s
  - match:
    - uri:
      prefix: "/"
    route:
    - destination:
        host: api.default.svc.cluster.local
        port:
          number: 8443
    timeout: 60s
    retries:
      attempts: 3
      perTryTimeout: 2s

match cannot be empty起,您需要添加前缀以获取除先前的URI exact 匹配项之外的所有内容。

答案 1 :(得分:0)

这是我的观察结果

  1. VirtualService-> http.match.port。我认为port在这里使用不正确。如果这应该指示正在侦听到端口31400的传入请求,则它实际上应该在网关YAML规范istio-gateway中。
  2. 请共享名为istio-gateway的网关的规范。基本上,您可以在其中指定正在监听port.number: 31400。您可以在VirtualService上指示要路由到的服务/主机和端口或“分离请求”。

请检查是否有帮助。