Открытие сервиса через Kubernetes Gateway API
Вы можете использовать Kubernetes Gateway API для создания ресурсов Gateway и HTTPRoute для развертывания шлюза. Эти ресурсы настраивают шлюз так, чтобы сделать сервис внутри mesh доступным для трафика извне. Затем вы можете изменить Service шлюза на LoadBalancer, чтобы открыть его для трафика вне кластера.
Предварительные требования
- Установлен Alauda Service Mesh v2 Operator.
- Развернута контрольная плоскость Istio.
- Подтвердите совместимость с ядром Linux.
- Ваш Kubernetes кластер поддерживает внешние балансировщики нагрузки (то есть Services типа
LoadBalancer).
Процедура
-
Создайте новое пространство имён с именем
httpbinс помощью следующей команды: -
Разверните пример сервиса
httpbinс помощью этой команды: -
Создайте файл с именем
httpbin-k8s-gw.yaml, который определяет ресурс KubernetesGateway. Это настроит прокси шлюза для открытия порта 80 (HTTP) для хостаhttpbin.example.com.Автоматическое развертываниеПо умолчанию каждый
Gatewayавтоматически создаётServiceиDeployment. Они будут называться<Gateway name>-<GatewayClass name>(за исключениемGatewayClassс именемistio-waypoint, который не добавляет суффикс). Эти конфигурации будут автоматически обновляться при измененииGateway(например, при добавлении нового порта).Пример файла ресурса gateway
- Указывает тип
Serviceдля шлюза; по умолчаниюLoadBalancer. - Указывает имя ревизии Istio; по умолчанию
default. - Указывает имя шлюза.
- Указывает пространство имён шлюза.
- Указывает виртуальное имя хоста, которое клиенты используют для доступа к mesh-сервису на этом порту.
- Указывает тип
-
Примените YAML-файл с помощью команды:
-
Создайте YAML-файл с именем
httpbin-hr.yaml, который определяет ресурсHTTPRoute. Этот ресурс задаёт правила маршрутизации трафика от прокси шлюза к сервисуhttpbin.Пример файла HTTPRoute
- Связывает ресурс
HTTPRouteс ранее созданным KubernetesGateway, добавляя имя шлюза в список. - Направляет совпадающий трафик к сервису
httpbin, определяя записьbackendRefsс именем и портом сервисаhttpbin.
- Связывает ресурс
-
Примените YAML-файл, выполнив команду:
-
Убедитесь, что сервис Gateway API готов и имеет назначенный адрес, выполнив команду:
-
Необязательно: Разверните шлюз на Infra Nodes:
Нажмите, чтобы развернуть
Предварительные требованияAlauda Container Platform версии 4.2.0 или выше, либо обновите CRD Gateway API до последней версии.
a. Создайте ConfigMap с именем
asm-kube-gateway-optionsв том же пространстве имён, где планируете развернуть Gateway:- Указывает имя ConfigMap.
- Указывает пространство имён ConfigMap, совпадающее с пространством имён шлюза.
- Задаёт nodeSelector и tolerations для планирования подов шлюза на Infra Nodes.
b. Ссылайтесь на ConfigMap в вашем ресурсе Gateway, добавив поле
infrastructure.parametersRef:- Указывает имя шлюза.
- Указывает пространство имён шлюза.
Проверка
-
Создайте пространство имён для клиента
curl, выполнив команду: -
Разверните клиента
curlс помощью следующей команды: -
Установите переменную
CURL_PODс именем подаcurlкомандой: -
С клиента
curlотправьте запрос к эндпоинту/headersприложенияhttpbinчерез ingress gatewayService. Установите заголовокHostвhttpbin.example.com, чтобы он соответствовал хосту, указанному в ресурсах KubernetesGatewayиHTTPROUTE. Выполните следующую командуcurl:В ответе должен быть статус HTTP
200 OK, что указывает на успешный запрос.Пример вывода
-
Отправьте запрос
curlк эндпоинту без совпадающего префикса URI вhttpbinHTTPROUTE, выполнив команду:В ответе будет статус
404 Not Found. Это ожидаемо, так как эндпоинт/getне имеет совпадающего префикса URI, определённого в ресурсеhttpbinHTTPROUTE.Пример вывода
-
Откройте прокси шлюза для внешнего трафика, установив тип его
Serviceв значение по умолчаниюLoadBalancer. Выполните команду: -
Проверьте, что сервис
httpbinдоступен извне кластера, используя внешний хост или IP-адрес сервиса шлюза. Убедитесь, что переменнаяINGRESS_HOSTустановлена корректно для вашей среды кластера.a. Установите переменную
INGRESS_HOST, выполнив команду:b. Установите переменную
INGRESS_PORT, выполнив команду:c. Используя хост шлюза, отправьте запрос
curlк сервисуhttpbinследующей командой:INFOЕсли
$INGRESS_HOST— это IPv6-адрес, заключите его в квадратные скобки при формировании URL. Например: -
Убедитесь, что в ответе отображается статус
HTTP/1.1 200 OK, что подтверждает успешный запрос.