Ошибки 404 при конфигурации нескольких шлюзов с одним и тем же TLS-сертификатом
Содержание
Описание проблемы
Симптомы
При обращении к сервисам через Istio Ingress Gateway с использованием протокола HTTP/2 возникают ошибки 404. Это известная проблема в сообществе Istio.
Корневая причина
Конфигурация нескольких шлюзов с одним и тем же TLS-сертификатом приводит к тому, что браузеры HTTP/2 генерируют ошибки 404 при обращении к вторичным хостам после установления первоначального соединения. Это происходит из-за повторного использования HTTP/2 соединения в браузерах.
Пример сценария:
- Домены
a.example.comиb.example.comиспользуют один и тот же TLS-сертификат - Настроены в отдельных ресурсах Gateway
- Браузер обращается сначала к
a.example.com, затем кb.example.comпо одному и тому же соединению
Устранение неполадок
Скрипт для проверки
Выполните этот скрипт на мастер-узле кластера, в котором развернут Istio Ingress Gateway:
Ожидаемый вывод:
Решение корневой причины 1: Объединение ресурсов Gateway
Особенности
- Рекомендуемое сообществом решение
- Сохраняет преимущества производительности HTTP/2
- Требует изменения существующих конфигураций Gateway
Предварительные условия
- Установлен
jqверсии 1.7 и выше на узлах кластера - Доступ к кластеру с правами kubectl
Шаги
- Определить конфликтующие Gateways с помощью скрипта проверки
- Объединить конфигурации Host:
- Обновить VirtualServices для ссылки на объединённый Gateway
- Удалить избыточные Gateways
- Проверить конфигурацию:
Решение корневой причины 2: Код ответа 421
Особенности
- Требуется поддержка клиентом кода статуса 421
- Совместимо с Chrome/Firefox/Safari 15.1 и выше
Предварительные условия
- Версия Istio ≥ 1.12
- Права администратора кластера
Шаги
- Применить EnvoyFilter:
- Проверить реализацию:
Профилактические меры
- Управление сертификатами:
- Использовать wildcard-сертификаты (*.example.com)
- Избегать повторного использования сертификатов в разных окружениях
- Проектирование Gateway:
- Реализовать один шлюз на шаблон домена
- Использовать изоляцию сертификатов по namespace
- Регулярные аудиты:
Связанный контент
Механизм повторного использования HTTP/2 соединений:
- Одно TLS-соединение обрабатывает несколько запросов
- Сервер использует SNI для маршрутизации запросов
- Несовпадение заголовков SNI вызывает сбои маршрутизации
Ссылка на документацию Istio:
Istio Common Problems - 404 Errors