Istio Gateway / VirtualService не работает (локальный ip работает) - PullRequest
0 голосов
/ 23 сентября 2019

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

Вот моя конфигурация, она соответствует документации:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: dragon-gateway
spec:
  selector:
    # use Istio default gateway implementation
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: dragon
spec:
  hosts:
  - "vtest.westus.cloudapp.azure.com"
  gateways:
  - dragon-gateway
  http:
  - match:
    - uri:
        prefix: /
    - uri:
        prefix: /status
    - uri:
        prefix: /delay
    - uri:
        prefix: /api/values
    route:
    - destination:
        host: dragon
        port:
          number: 80

Описание kubectl выглядит отлично:

Name:         dragon-gateway
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"networking.istio.io/v1alpha3","kind":"Gateway","metadata":{"annotations":{},"name":"dragon-gateway","namespace":"default"},...
API Version:  networking.istio.io/v1alpha3
Kind:         Gateway
Metadata:
  Creation Timestamp:  2019-09-22T22:54:31Z
  Generation:          1
  Resource Version:    723889
  Self Link:           /apis/networking.istio.io/v1alpha3/namespaces/default/gateways/dragon-gateway
  UID:                 f0738082-dd8b-11e9-b099-e259debf6109
Spec:
  Selector:
    Istio:  ingressgateway
  Servers:
    Hosts:
      *
    Port:
      Name:      http
      Number:    80
      Protocol:  HTTP


Name:         dragon
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"dragon","namespace":"default"},"...
API Version:  networking.istio.io/v1alpha3
Kind:         VirtualService
Metadata:
  Creation Timestamp:  2019-09-22T22:54:31Z
  Generation:          1
  Resource Version:    723891
  Self Link:           /apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/dragon
  UID:                 f0988c3c-dd8b-11e9-b099-e259debf6109
Spec:
  Gateways:
    dragon-gateway
  Hosts:
    vtest.westus.cloudapp.azure.com
  Http:
    Match:
      Uri:
        Prefix:  /
      Uri:
        Prefix:  /status
      Uri:
        Prefix:  /delay
      Uri:
        Prefix:  /api/values
    Route:
      Destination:
        Host:  dragon
        Port:
          Number:  80

Служба имеет следующую конфигурацию:

apiVersion: v1
kind: Service
metadata:
  namespace: flight
  name: dragon
  labels:
    app: dragon
    release: r1
    version: 1.0.0
spec:
type: ClusterIP
  ports:
      - name: http
        port: 80
        targetPort: 80
      - name: https
        port: 443
        targetPort: 80

 selector:
    app: dragon
    release: r1

Файл Docker довольно прост:

FROM microsoft/dotnet:latest AS runtime


# ports 
EXPOSE 80
EXPOSE 443

WORKDIR /
COPY /publish /app

RUN dir /app

WORKDIR /app

FROM runtime AS final
ENTRYPOINT ["dotnet", "dragon.dll"]

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

Заранее спасибо за любую подсказку.

Редактировать:

Добавление дополнительной информации о скручиваемости

curl 40.118.228.111/api/values -v
*   Trying 40.118.228.111...
* TCP_NODELAY set
* Connected to 40.118.228.111 (40.118.228.111) port 80 (#0)
> GET /api/values HTTP/1.1
> Host: 40.118.228.111
> User-Agent: curl/7.55.1
> Accept: */*
>
< HTTP/1.1 404 Not Found
< date: Sun, 22 Sep 2019 23:27:54 GMT
< server: istio-envoy
< content-length: 0
<
* Connection #0 to host 40.118.228.111 left intact

Добавление статуса прокси:

NAME                                                   CDS        LDS        EDS               RDS        PILOT                           VERSION
dragon-dc789456b-g9fxb.flight                          SYNCED     SYNCED     SYNCED (50%)      SYNCED     istio-pilot-689d75bc8-j7j8m     1.1.3
istio-ingressgateway-5c4f9f859d-nj9sq.istio-system     SYNCED     SYNCED     SYNCED (100%)     SYNCED     istio-pilot-689d75bc8-j7j8m     1.1.3

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Привет, я не эксперт по istio, но после расследования это похоже на работу с хостом и шлюзом istio, виртуальные сетевые сервисы, вы должны использовать Host prefix, чтобы передать host HTTP Header, , как это :

curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/

Это необходимо, потому что ваш входной шлюз настроен на обработку «httpbin.example.com», но в вашей тестовой среде у вас нет привязки DNS для этого хоста, и вы просто отправляете свой запрос на входIP.

С другой точки зрения этот параметр должен соответствовать Vitualservice:

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

Указание '*' для всех имен хостов.Также вы можете ограничить использование Virtualservices или указать несколько правил для серверов, таких как хосты / хосты, используя этот подход.

Более подробные примеры вы можете найти здесь - Istio Server :

Надеюсь, что этопомощь.

0 голосов
/ 23 сентября 2019

Похоже, что вы поместили dragon VirtualService и dragon-gateway в пространство имен по умолчанию?

Поскольку имена служб основаны на dns, и обычно пути поиска resolv.conf модуля включают только локальное пространство имен,имя службы dragon будет правильно разрешено только в том же пространстве имен.Вместо этого используйте fqdn для службы dragon:

...
    route:
    - destination:
        host: dragon.flight.svc.cluster.local
        port:
          number: 80

Вы настроили istio для маршрутизации на основе имени хоста, но ваша команда curl использует IP-адрес.Либо настройте DNS с записью A, подобной этой - vtest.westus.cloudapp.azure.com -> 40.118.228.111, либо заставьте curl отправлять правильный заголовок узла:

curl http://vtest.westus.cloudapp.azure.com/api/values --resolve vtest.westus.cloudapp.azure.com:80:40.118.228.111
...