Один istio-ingressgateway и несколько TLS-шлюзов

Краткое описание проблемы:

  • Если я попытаюсь подключить несколько шлюзов TLS (используя один и тот же сертификат) к одному входному шлюзу, будет работать только один TLS. (Последний примененный)
  • Подключение нескольких шлюзов без TLS к одному входному шлюзу работает нормально.

Сообщения об ошибках:

Домен 1 (нормально):

✗ curl -I https://integration.domain.com
HTTP/2 200 
server: envoy
[...]

Домен 2 (плохо):

✗ curl -vI https://staging.domain.com    
* Rebuilt URL to: https://staging.domain.com/
*   Trying 35.205.120.133...
* TCP_NODELAY set
* Connected to staging.domain.com (35.x.x.x) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* Unknown SSL protocol error in connection to staging.domain.com:443 
* Curl_http_done: called premature == 1
* stopped the pause stream!
* Closing connection 0
curl: (35) Unknown SSL protocol error in connection to staging.domain.com:443 

Факты:

У меня есть сертификат TLS с подстановочными знаками (скажем, '* .domain.com'). Я добавил секрет:

kubectl create -n istio-system secret tls istio-ingressgateway-certs --key tls.key --cert tls.crt

У меня istio-ingressgateway по умолчанию подключен к статическому IP:

apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
  namespace: istio-system
  annotations:
  labels:
    chart: gateways-1.0.0
    release: istio
    heritage: Tiller
    app: istio-ingressgateway
    istio: ingressgateway
spec:
  loadBalancerIP: "35.x.x.x"
  type: LoadBalancer
  selector:
    app: istio-ingressgateway
    istio: ingressgateway
[...]

Затем у меня есть два шлюза в разных пространствах имен для двух доменов, включенных в подстановочный знак TLS (staging.domain.com, integration.domain.com):

постановка:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: domain-web-gateway
  namespace: staging
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "staging.domain.com"
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "staging.domain.com"

интеграция:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: domain-web-gateway
  namespace: integration
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "integration.domain.com"
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "integration.domain.com"

person Andor    schedule 09.10.2018    source источник


Ответы (1)


Проблема в том, что вы используете одно и то же имя (https) для порта 443 на двух шлюзах, управляемых одной и той же рабочей нагрузкой (селектором). У них должны быть уникальные имена. Это ограничение задокументировано здесь.

Вы можете исправить это, просто изменив имя вашего второго шлюза, например:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: domain-web-gateway
  namespace: integration
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 443
      name: https-integration
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "integration.domain.com"
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "integration.domain.com"
person Frank B    schedule 09.10.2018
comment
Ой! Не знал «предварительного» раздела Istio. Похоже, что в наши дни документы развиваются довольно быстро, и иногда им не хватает некоторой согласованности (или они противоречат друг другу или устарели). Я протестирую это сейчас. Спасибо! - person Andor; 10.10.2018
comment
Да, документы постоянно развиваются. Предварительный.istio.io всегда содержит последний документ, который будет перемещен на istio.io в следующем выпуске. Документ, на который я ссылался, также недавно был добавлен в istio.io (istio.io/help/ops/traffic-management/deploy-guidelines/), но я сослался на предварительную версию, потому что я думаю, что там она более четко объяснена. - person Frank B; 10.10.2018
comment
У меня подозрение, что нельзя использовать "-" в именах портов. Когда я назвал порты как staging-https и integration-https, я получил эту неприятную ошибку: 2018-10-10T13: 40: 01.856397Z error buildGatewayRoutes: не удалось найти сервер для routeName https.443.staging-https, есть карта [http .80: [порт: ‹номер: 80 протокол: HTTP-имя: http› hosts: integration.domain.com порт: ‹номер: 80 протокол: HTTP-имя: http› hosts: staging.domain.com]] - person Andor; 10.10.2018
comment
Но теперь я использовал httpsint и httpssec, и все хорошо :) - person Andor; 10.10.2018
comment
@FrankB На самом деле, мне любопытно, что происходит при одновременном включении нескольких шлюзов TLS. Если я включу два шлюза TLS с одним и тем же портом, но нацеленные на другое имя хоста, при подключении будет ли он пытаться проверить SSL в первом варианте и попытаться сопоставить имя хоста? Как насчет того, когда первое совпадение не соответствует условию совпадения, и начнется ли оно совпадать с контекстом TLS второго шлюза и именем хоста? Означает ли это многократное рукопожатие TLS или что-то в этом роде? - person winterTTr; 27.02.2019
comment
Если у сервера есть сертификат TLS, соответствующий входящему запросу, он использует шлюз, настроенный с этим сертификатом. Вам нужно быть осторожным с сертификатами с подстановочными знаками, которые могут вызвать проблемы с браузером, но в остальном это просто. previous.istio.io/docs/tasks/traffic-management/ previous.istio.io/help/ops/traffic-management/ - person Frank B; 01.03.2019
comment
@FrankB Я столкнулся с аналогичной проблемой при доступе к разным сервисам в одном браузере. Потому что я использую подстановочный сертификат. Можете ли вы указать мне подробности, почему это происходит, и способы решения, если таковые имеются? Заранее спасибо. - person singh; 14.10.2019
comment
@singh Я думаю, что у вас возникла проблема: istio.io/docs/ops/troubleshooting/network-issues/ - person Frank B; 16.10.2019