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