Как настроить происхождение TLS в ISTIO?

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 не сможет увидеть запрос и работать с ним.

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


person vikp    schedule 09.05.2019    source источник
comment
Можете ли вы попробовать использовать для этого выделенный выходной шлюз?   -  person Dmitriy Zhukov    schedule 16.05.2019
comment
Привет, Дмитрий, не могли бы вы уточнить, я новичок в ISTIO? У меня есть один входной шлюз для входящих запросов, которые направляются во внутреннюю службу ячеистой сети, но это все.   -  person vikp    schedule 16.05.2019


Ответы (3)


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

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

person vikp    schedule 16.05.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.

person Robert Panzer    schedule 16.05.2019

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

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

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

person Frank B    schedule 16.05.2019