Как маршрутизировать несколько сервисов gRP C на основе пути в Istio (Kubernetes) - PullRequest
0 голосов
/ 18 июня 2020

Мне удалось запустить одну службу grp c по пути root. Но я попытался добавить больше службы grp c, добавив настраиваемый маршрут пути в виртуальную службу, которая не работает. Любая помощь будет принята с благодарностью.

Это шлюз:

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:
        - "*"

У меня есть эта виртуальная маршрутизация службы только для одной службы grp c и работает нормально

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

1 Ответ

0 голосов
/ 19 июня 2020

Это, вероятно, не работает, потому что ваше приложение прослушивает / и с вашей первой виртуальной службой, которая работает, istio отправляет запросы на /, чего не происходит с вашей второй виртуальной службой.

Ответом здесь будет добавление rewrite к вашей второй виртуальной службе.

HTTPRewrite можно использовать для перезаписи определенных c частей HTTP-запроса перед его пересылкой к месту назначения. Примитив перезаписи можно использовать только с HTTPRouteDestination. В следующем примере показано, как переписать префикс URL-адреса для вызова API (/ rating) в службу оценок перед выполнением фактического вызова API.

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

Соответствующая документация об этом здесь .

Я думаю, вы могли бы попытаться сделать это с помощью FQN служб gRP C, как указано в этом github комментарий к проблеме

Другая идея - использовать nginx, как упоминалось здесь .

...