Простой HTTP-запрос между двумя модулями с использованием Istio - PullRequest
2 голосов
/ 07 мая 2020

Мой интерфейсный модуль пытается связаться с моим серверным модулем, чтобы получить всех пользователей в БД. Вызов прост и работает, когда я использую curl внутри ОБЕИХ контейнеров внешнего интерфейса и istio-proxy в модуле внешнего интерфейса:

kubectl exec -it frontend-pod -c frontend-container -- bash
curl backend-svc:8000/users/
# returns correct response

kubectl exec -it frontend-pod -c istio-proxy -- bash
curl backend-svc:8000/users/
# returns correct response

Однако у моего приложения реагирования внешнего интерфейса возникают проблемы с достижением этой конечной точки в Chrome. Вот журналы консоли:

GET http://backend-svc:8000/users/ net::ERR_NAME_NOT_RESOLVED

Похоже, имя домена не может быть разрешено. Есть идеи, что я здесь делаю не так?

Я использую nginx для обслуживания своего приложения реагирования на интерфейс (не уверен, что это может быть проблемой).

EDIT: Некоторые отзывы говорит, что мне нужно настроить файлы шлюза и / или виртуальных служб. Вот как они выглядят сейчас:

# Source: myapp/gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: myapp-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'
---
# Source: myapp/virtual-service.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: myapp
spec:
  hosts:
    - '*'
  gateways:
    - myapp-gateway
  http:
    - route:
        - destination:
            host: frontend-svc
            port:
              number: 80

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Пара вещей выглядит неправильно в ваших примерах кода:

  1. Маршруты Istio VirtualService не соответствуют запросу. Правильный формат будет выглядеть так:

apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /frontend
        route:
        - destination:
            host: frontend-svc
            port:
              number: 80
В той же VirtualService вам требуется маршрут для бэкэнда. Вы должны изменить свой код внешнего интерфейса, чтобы вызывать URL-адрес бэкэнда шлюза. Этот URL-адрес должен включать внешний IP-адрес или доменное имя вашего шлюза, а также внешний порт HTTP.

Хорошим ресурсом, чтобы собрать эти вещи воедино, является Страница начала работы с Istio

0 голосов
/ 07 мая 2020

Просто чтобы убедиться: ваш звонок срабатывает на стороне клиента? Если да, то причина именно в этом, поскольку http://backend-svc:8000/users/ - это записи DNS, которые выдаются основными компонентами и доступны только внутри кластера.

При этом вам следует создать шлюз Пользовательский ресурс. Полное описание здесь

Шлюз позволяет применять такие функции Istio, как мониторинг и правила маршрутизации, к трафику c, входящему в кластер.

Надеюсь, я помог.

...