Установка Istio на AWS с использованием ELB TCP с таймаутом 504 - PullRequest
0 голосов
/ 01 марта 2020

Я довольно новичок в Istio - до сих пор у меня есть кластер k8s (с использованием kops) на AWS, позади ELB.

Все трафики c маршрутизируются через TCP.

AWS listener config

Служба входного шлюза настроена как NodePort со следующей конфигурацией

istio-system istio-ingressgateway NodePort 100.65.241.150 <none> 15020:31038/TCP,80:30205/TCP,31400:30204/TCP,15029:31714/TCP,15030:30016/TCP,15031:32508/TCP,15032:30110/TCP,15443:32730/TCP

Я использовал ' demo 'опция helm для развертывания Istio 1.4.0. Создали шлюз, VS и DR со следующей конфигурацией - шлюз находится в пространстве имен istio-system, VS и DR в пространстве имен по умолчанию

kind: Gateway
metadata:
  name: ingress-gateway
spec:
  selector:
    istio: ingressgateway 
  servers:
  - port:
      number: 31400
      name: tcp
      protocol: TCP
    hosts:
    - "*"   
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: webapp
  namespace: default
spec:
  hosts:     
    - "*" 
  gateways:
    - ingress-gateway
  http:
    - route:
        - destination:
            host: webapp
            subset: original
          weight: 100
        - destination:
            host: webapp
            subset: v2
          weight: 0
---
kind: DestinationRule
apiVersion: networking.istio.io/v1alpha3
metadata:
  name: webapp
  namespace: default
spec:
  host: webapp
  subsets:
    - labels:
        version: original
      name: original
    - labels:
        version: v2
      name: v2

Сервисные модули прослушивают порт 80 - и я проверил через переадресацию портов - и функционируют, как и ожидалось. Хотя, когда я запускаю https://hostname извне, я получаю

<head><title>504 Gateway Time-out</title></head>
<body bgcolor="white">
<center><h1>504 Gateway Time-out</h1></center>

, я включаю отладочную регистрацию в посланнике - но не вижу ничего значимого в журналах, связанных с тайм-аутом.

Любое предложение о том, где я могу пойти не так? Нужно ли добавлять какие-либо сервисные аннотации, относящиеся к ELB, в istio ingress gateway? Любые другие предложения?

1 Ответ

0 голосов
/ 03 марта 2020

Я нашел несколько вещей, которые нужно исправить

1. Соединение с loadbalancer

Как я уже упоминал в комментариях, вам нужно исправить свой входной шлюз, чтобы автоматически получать адреса EXTERNAL-IP, как в документации istio , так как сейчас ваш вход является NodePort, пока поскольку я обеспокоен тем, что он не будет работать, вы можете настроить его для использования с nodeport, но я предполагаю, что вам нужен loadbalancer.

Первым шагом будет изменение типа istio-ingressgateway sv c с NodePort на loadbalancer и проверьте, получите ли вы EXTERNAL-IP.

Если установлено значение EXTERNAL-IP, в вашей среде есть внешний балансировщик нагрузки, который вы можете использовать для входного шлюза. Если значение EXTERNAL-IP равно (или постоянно), ваша среда не предоставляет внешний балансировщик нагрузки для входного шлюза. В этом случае вы можете получить доступ к шлюзу, используя порт узла службы.

Он должен выглядеть следующим образом

kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   172.21.109.129   130.211.10.121  80:31380/TCP,443:31390/TCP,31400:31400/TCP   17h

И тогда все проходит через адрес external-ip, который 130.211.10.121

2. Исправьте ваши yamls

Обратите внимание, что для tcp traffi c мы должны сопоставить входящий порт, в данном случае порт 31400

Проверьте этот пример с документация istio

Специально эта часть со шлюзом, виртуальным сервисом и правилом назначения.

Вы должны добавить это к своей виртуальной службе.

tcp:
  - match:
    - port: 31400

3. Помните о пространствах имен.

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

Пример здесь

Специально для части виртуального обслуживания

gateways:
  - some-config-namespace/my-gateway

Я надеюсь, что это поможет вам с вашими проблемами. Дайте мне знать, если у вас есть еще вопросы.

...