我设法在根路径中运行一项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
答案 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"