Открытие сервиса через ресурсы Istio Gateway и VirtualService
В этом руководстве показано, как использовать ресурсы Istio Gateway и VirtualService для настройки gateway, развернутого с помощью gateway injection. Эти ресурсы настраивают gateway для открытия сервиса внутри mesh для трафика извне. Затем вы открываете gateway для трафика, поступающего извне кластера, изменяя тип Service gateway на LoadBalancer.
Предварительные требования
- Gateway Istio установлен с использованием gateway injection.
- Ваш Kubernetes кластер поддерживает внешние балансировщики нагрузки (то есть Services типа
LoadBalancer).
Процедура
-
Создайте новое пространство имён с именем
httpbin, выполнив команду: -
Включите sidecar injection для пространства имён. Если в вашей конфигурации используется стратегия обновления
InPlace, выполните команду:NOTEЕсли вы используете стратегию обновления
RevisionBased, выполните следующие команды:-
Чтобы узнать ваш
<revision-name>, выполните:Пример вывода:
-
Пометьте пространство имён с помощью имени ревизии для включения sidecar injection:
-
-
Разверните пример сервиса
httpbin, выполнив команду: -
Создайте файл с именем
httpbin-gw.yaml, содержащий определение ресурса IstioGateway. Этот ресурс настраивает прокси gateway для открытия порта 80 (HTTP) для хостаhttpbin.example.com.- Установите
selectorтак, чтобы он соответствовал уникальной метке или меткам, определённым в шаблоне pod для Deployment прокси gateway. По умолчанию конфигурация IstioGatewayприменяется к подходящим pod gateway во всех пространствах имён. - В поле
hostsперечислите адреса, которые клиенты могут использовать для доступа к mesh-сервису на соответствующем порту.
- Установите
-
Примените YAML-файл командой:
-
Создайте ещё один YAML-файл с именем
httpbin-vs.yamlдля ресурсаVirtualService. ЭтотVirtualServiceопределит правила маршрутизации трафика от прокси gateway к сервисуhttpbin.- Определите
hosts, к которым будут применяться правила маршрутизацииVirtualService. Указанныеhostsдолжны быть открыты ресурсом IstioGateway, к которому прикреплён этотVirtualService. - Прикрепите
VirtualServiceк ресурсу IstioGatewayиз предыдущего шага, добавив имяGatewayв список gateways. - Направьте совпадающий трафик к ранее развернутому сервису
httpbin, определивdestinationс указаниемhostиportсервисаhttpbin.
- Определите
-
Примените YAML-файл командой:
Проверка
-
Создайте пространство имён для клиента
curl, выполнив команду: -
Разверните клиента
curlс помощью команды: -
Сохраните имя pod клиента
curlв переменнуюCURL_POD, выполнив команду: -
С клиента
curlотправьте запрос к эндпоинту/headersприложенияhttpbinчерез сервис ingress gateway. Установите заголовокHostвhttpbin.example.com, чтобы он соответствовал хосту, указанному в IstioGatewayиVirtualService. Выполните команду: -
В ответе должен быть статус HTTP
200 OK, подтверждающий успешность запроса.Пример вывода
-
Отправьте ещё один запрос к эндпоинту, для которого в
VirtualServicehttpbinнет соответствующего совпадения по префиксу URI, выполнив команду:В ответе должен быть статус
404 Not Found. Это ожидаемый результат, так как для эндпоинта/getне определено совпадение по префиксу URI вVirtualServicehttpbin.Пример вывода
-
Откройте прокси gateway для трафика извне кластера, изменив тип его
ServiceнаLoadBalancer: -
Убедитесь, что сервис
httpbinдоступен извне кластера через внешний hostname или IP-адрес сервиса gateway. Убедитесь, что переменнаяINGRESS_HOSTкорректно установлена для вашей среды кластера.a. Установите переменную
INGRESS_HOSTкомандой:В некоторых средах балансировщик нагрузки может быть доступен по имени хоста, а не по IP-адресу. В этом случае значение
EXTERNAL-IPingress gateway не будет IP-адресом, а именем хоста, и приведённая выше команда не сможет установить переменную окруженияINGRESS_HOST. Используйте следующую команду для корректировки значенияINGRESS_HOST:b. Отправьте запрос
curlк сервисуhttpbin, используя хост gateway, выполнив команду:INFOЕсли
$INGRESS_HOST— это IPv6-адрес, заключите его в квадратные скобки при формировании URL. Например: -
Проверьте, что в ответе присутствует статус
HTTP/1.1 200 OK, что подтверждает успешность запроса.