我想知道如何在同一端口上匹配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似乎都失败了,但没有任何反应。
答案 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)
这是我的观察结果
http.match.port
。我认为port
在这里使用不正确。如果这应该指示正在侦听到端口31400的传入请求,则它实际上应该在网关YAML规范istio-gateway
中。istio-gateway
的网关的规范。基本上,您可以在其中指定正在监听port.number: 31400
。您可以在VirtualService上指示要路由到的服务/主机和端口或“分离请求”。请检查是否有帮助。