Istio доступно из браузера, но не из скручивания - PullRequest
1 голос
/ 29 апреля 2020

Итак, я успешно развернул istio, по крайней мере, мне так кажется, что все работает нормально. Я развернул свой API в Istio и могу связаться с ним через свой браузер. Я даже могу протестировать мой API с помощью почтальона, но когда я пытаюсь добраться до моего API через curl, он говорит The remote name could not be resolved: 'api.localhost'. Это был первый красный флаг, но я проигнорировал его. Сейчас я пытаюсь получить доступ к своему API из моего веб-приложения, но Chrome отвечает net:ERR_FAILED.

Похоже, что мои сервисы доступны только для хоста, который я, и ничего больше. Я не могу найти решение для этого на inte rnet, поэтому я надеюсь, что кто-то имеет опыт и знает, как исправить.

Спасибо!


РЕДАКТИРОВАТЬ: Дополнительная информация

У меня вся локальная инфраструктура, Docker для рабочего стола с Kubernetes . Используемая версия Istio: 1.5.0 .

Шлюз :

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: api-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http-api
        protocol: HTTP
      hosts:
        - "api.localhost"

Виртуальный сервис :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: pb-api
spec:
  gateways:
    - api-gateway
  hosts:
    - "*"
  http:
    - match:
        - uri:
            prefix: /
      rewrite:
        uri: /
      route:
        - destination:
            host: pb-api
            port:
                number: 3001

Когда я пытаюсь сделать curl http://api.localhost/user/me, я ожидаю 401, но вместо этого я получаю The remote name could not be resolved: 'api.localhost', как указано выше. Эта ошибка точно такая же, как при выключении Docker для рабочего стола и повторной попытке. Через почтальон и браузер он работает нормально, но curl и мое реагирующее веб-приложение не могут до него добраться.

1 Ответ

1 голос
/ 30 апреля 2020

Как я уже упоминал в комментариях, curl должен выглядеть следующим образом

curl -v -H "host: api.localhost" istio-ingressgateway-external-ip /

Вы можете проверить istio-ingressgateway-external ip с

kubectl get svc istio-ingressgateway -n istio-system

Как упомянул @SjaakvBrabant

Внешний IP является localhost, поэтому я попробовал эту команду curl -v -H " host: api.localhost "localhost / user / me, который дал мне 401


Пример Ubuntu minikube

Кроме того, если вы хотите свернуть сам api.localhost, то вы бы Я должен настроить ваши хосты локально, я не уверен, как это будет работать в вашей ситуации, так как ваш внешний IP является localhost.

Но если вы хотите, вы можете использовать metallb , который является loadbalancer, поэтому ваш istio-ingressgateway получит IP-адрес, который можно настроить в etc / hosts.

Yamls

piVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: demo
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 1
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo Hello nginx1 > /usr/share/nginx/html/index.html"]

---

apiVersion: v1
kind: Service
metadata:
  name: demo
  namespace: demo
  labels:
    app: demo
spec:
  ports:
  - name: http-demo
    port: 80
    protocol: TCP
  selector:
    app: demo


---

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: demo-gw
  namespace: demo
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      name: http
      number: 80
      protocol: HTTP
    hosts:
    - "example.com"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: demo-vs
  namespace: demo
spec:
  gateways:
  - demo-gw
  hosts:
  - "example.com"
  http:
  - match:
    - uri:
        prefix: /
    rewrite:
      uri: /
    route:
    - destination:
        host: demo.demo.svc.cluster.local
        port:
          number: 80

etc / hosts

127.0.0.1       localhost
10.101.143.xxx  example.com

Тестирование

curl -v -H "host: example.com" http://10.101.143.xxx/

< HTTP/1.1 200 OK


curl -v example.com

< HTTP/1.1 200 OK

Надеюсь, вы найдете это у seful.

...