Создание маршрутов Istio#

Для корректной работы сети с использованием Istio необходимо создать и настроить соответствующие сетевые маршруты. Это включает указание:

  • конечных адресов (IP или DNS имя)

  • используемых портов

  • параметров SSL/TLS (если требуется).

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

Формат описания маршрутов в переменных#

Параметры создания маршрутов описываются в переменных (стендозависимых параметрах).

Если создание какого либо маршрута не требуется, например не используется система логирования Apache Kafka, то блок с переменными маршрута необходимо оставить пустым:

istio:
  egress_route:
    # Маршрут для доступа к kafka, для отправки журналов
    fluentbit:
      hostname: ""
      ip_address: ""
      internal_port:
      external_port:
      protocol: "HTTPS"
      ssl:
        enabled: false

Одинаковый «internal» и «external» порты#

В системах вроде Kafka, после первого соединения с сервером клиент начинает использовать адрес и порт, полученные из метаданных сервера.

Это может вызвать проблемы, если маршрут в Istio настроен на использование internal_port — виртуального порта, предназначенного только для внутренней работы внутри сервисной сети (Service Mesh). В то же время сервер Kafka возвращает клиентам реальный порт, на котором он работает (external_port), что может привести к нарушению соединения.

Если конфигурация сервера Kafka не учитывает эту особенность, fluentbit может потерять возможность корректного взаимодействия с Kafka.

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

istio:
  egress_route:
    # Образец маршрута к серверу Apache Kafka, используя одинаковый "внутренний" и "внешний" порты
    fluentbit :
      hostname: "sowa-kafka.ru"
      ip_address: ""
      internal_port: 9092
      external_port:
      protocol: "kafka"
      ssl:
        enabled: false

TLS-шифрование трафика#

При использовании Istio терминация трафика происходит на уровне Service Mesh, это означает, что указание TLS-сертификатов должно происходить в конфигурации маршрутов Istio.

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

После получения сертификатов, в переменных достаточно указать только имя нужного сертификата — создание и конфигурация DestinationRule будет произведено автоматически.

Входящие соединения#

Сертификаты для терминации входящего трафика описаны в переменных (файл values.yaml):

Образец блока переменных бекенда:

istio:
  tls:
    ingress_agent:
      # Серверный сертификат
      serverCertificate: "cert.crt"
      # Закрытый ключ
      privateKey: "cert.key"
      # Корневой сертификат
      caCertificates: "cert_ca.crt"
      # Список отозванных сертификатов
      caCrl: ""

Аналогичный блок переменных описан для каждого входящего интерфейса, предоставляемого компонентом.

Исходящие соединения#

Сертификаты для шифрования исходящего трафика описываются в блоке конфигурации маршрута, к соответствующему внешнему сервису.

Образец конфигурации маршрута к Apache Kafka (файл values.yaml компонента sowa):

istio:
  egress_route:
    fluentbit :
      hostname: "sowa-kafka.ru"
      ip_address: ""
      internal_port: 9092
      external_port:
      protocol: "kafka"
      ssl:
        enabled: true
        clientCertificate: "cert.crt"
        privateKey: "cert.key"
        caCertificates: "cert_ca.crt"