Как настроить создание TLS в ISTIO? - PullRequest
4 голосов
/ 09 мая 2019

Istio не маршрутизирует к внешней службе HTTP через источник TLS.

У меня есть модуль, содержащий два контейнера: - Приложение - ISTIO Proxy

Приложение выполняет вызов внешнего стороннего API, которыйнаходится на https://someurl.somedomain.com/v1/some-service

Приложение отправляет HTTP-запросы к этой службе, вызывая http://someurl.somedomain.com/v1/some-service - обратите внимание, что это HTTP, а не HTTP.

Затем я настроил в ISTIO следующее:

  • Виртуальный сервис для маршрутизации HTTP-трафика на порт 443:
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: someservice-vs
spec:
  hosts:
  - someurl.somedomain.com
  http:
  - match:
    - port: 80    
    route:
    - destination:
        host: someurl.somedomain.com
        port:
          number: 443      
    timeout: 40s
    retries:
      attempts: 10
      perTryTimeout: 4s      
      retryOn: gateway-error,connect-failure,refused-stream,retriable-4xx,5xx 
  • Сервисный вход, который разрешает выход трафика.Как вы можете видеть, мы указываем, что сервис является внешним по отношению к сетке, и мы открыли 443 и 80, оба из которых используют HTTP, но 443. настроен для создания TLS.
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: someservice-se
spec:
  hosts:
  - someurl.somedomain.com
  location: MESH_EXTERNAL
  ports:
  - number: 443
    name: http-port-for-tls-origination
    protocol: HTTP
  - number: 80
    name: http-port
    protocol: HTTP
  resolution: DNS

Наконец, у меня естьправило назначения, которое применяет простой TLS к исходящему трафику:


---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: someservice-destinationrule
spec:
  host: someurl.somedomain.com
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    portLevelSettings:
    - port:
        number: 443
      tls:
        mode: SIMPLE # initiates HTTPS when accessing someurl.somedomain.com 

По какой-то причине это не работает, и я получаю 404 при вызове службы из моего контейнера приложений, что указывает на то, что трафик не шифруетсячерез TLS.

Причина, по которой я использую создание TLS, заключается в том, что мне нужно применять повторные попытки в моей виртуальной службе, и я могу делать это только с помощью HTTP-маршрутов, так как в противном случае ISTIO не сможет увидеть запрос и работать с ним.

Почесал голову в течение двух дней и, пожалуйста, нужна помощь: -)

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Дошло до этого.Документация ISTIO была правильной - создание TLS и повторные попытки работают, как и ожидалось.

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

0 голосов
/ 16 мая 2019

Настройка происхождения TLS задокументирована здесь .

Указанная выше конфигурация верна. Оказывается, что настоящая проблема была вызвана недостаточным временем ожидания в виртуальной службе, а не источником TLS.

https://discuss.istio.io/t/can-i-route-http-traffic-as-https-to-an-external-service/489/8

0 голосов
/ 16 мая 2019

Я думаю, что это должно работать так:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: someservice-vs
spec:
  hosts:
    - someurl.somedomain.com
  http:
    - match:
        - port: 80
      route:
        - destination:
            host: someurl.somedomain.com
      timeout: 40s
      retries:
        attempts: 10
        perTryTimeout: 4s
        retryOn: gateway-error,connect-failure,refused-stream,retriable-4xx,5xx
---
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: someservice-se
spec:
  hosts:
    - someurl.somedomain.com
  location: MESH_EXTERNAL
  ports:
    - number: 80
      protocol: HTTP
      name: http
  endpoints:
    - address: someurl.somedomain.com
      ports:
        http: 443
  resolution: DNS
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: someservice-destinationrule
spec:
  host: someurl.somedomain.com
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN
    tls:
      mode: SIMPLE # initiates HTTPS when accessing someurl.somedomain.com

Заставьте ServiceEntry прослушивать порт 80, но с адресом конечной точки, указывающим на порт 443. Затем DestinationRule применяет TLS для всего, нацеленного на порт 80, который являетсяв конечном итоге пересылается через конечные точки кластера на порт 443.

...