Настройка Gateway API с использованием Istio Gateway или NGINX Gateway Fabric
Kubernetes Gateway API — это набор ресурсов Kubernetes для настройки маршрутизации входящего трафика к приложениям. Для работы Gateway API необходим контроллер, который реализует спецификацию Gateway API и управляет сетевой инфраструктурой, например Istio Gateway или NGINX Gateway Fabric.
Чтобы установить Gateway API, развернуть тестовое приложение и настроить маршрутизацию HTTP-трафика:
- Подготовьте окружение для работы с кластером Managed Kubernetes.
Перед началом работы
Заголовок раздела «Перед началом работы»Создайте сервисный аккаунт с именем
sa-mk8sи рольюregistry.puller.Для сервисного аккаунта
sa-mk8sсоздайте API-ключ и сохраните его.Создайте кластер Managed Kubernetes с публичным эндпоинтом и группу узлов для него. При создании группы используйте сервисный аккаунт
sa-mk8s.Создайте NAT-шлюз для подсети, в которой развернут кластер Managed Kubernetes.
Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.
1. Подготовьте окружение
Заголовок раздела «1. Подготовьте окружение»Подключитесь к терминалу на вашем компьютере или к промежуточной ВМ.
Установите и настройте утилиту MWS CLI:
Аутентифицируйтесь в Artifact Registry:
bash helm registry login -u apikey -p <API-ключ> registry.mwsapis.ruУстановите утилиту командной строки
kubectl.
2. Установите Kubernetes Gateway API
Заголовок раздела «2. Установите Kubernetes Gateway API»Установите Gateway API:
bash kubectl get crd gateways.gateway.networking.k8s.io &> /dev/null || \kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yamlУбедитесь, что установка прошла успешно:
bash kubectl api-resources --api-group=gateway.networking.k8s.ioОжидаемый результат:
bash NAME SHORTNAMES APIVERSION NAMESPACED KINDbackendtlspolicies btlspolicy gateway.networking.k8s.io/v1 true BackendTLSPolicygatewayclasses gc gateway.networking.k8s.io/v1 false GatewayClassgateways gtw gateway.networking.k8s.io/v1 true Gatewaygrpcroutes gateway.networking.k8s.io/v1 true GRPCRoutehttproutes gateway.networking.k8s.io/v1 true HTTPRoutelistenersets lset gateway.networking.k8s.io/v1 true ListenerSetreferencegrants refgrant gateway.networking.k8s.io/v1 true ReferenceGranttlsroutes gateway.networking.k8s.io/v1 true TLSRoute
3. Разверните тестовое приложение
Заголовок раздела «3. Разверните тестовое приложение»Чтобы развернуть тестовое приложение httpbin в новом пространстве имен gateway-test, выполните команду:
kubectl apply -f - <<EOFapiVersion: v1kind: Namespacemetadata: name: gateway-test---apiVersion: v1kind: ServiceAccountmetadata: name: httpbin namespace: gateway-test
---apiVersion: v1kind: Servicemetadata: name: httpbin namespace: gateway-test labels: app: httpbin service: httpbinspec: ports: - name: http port: 8000 targetPort: 8080 selector: app: httpbin---apiVersion: apps/v1kind: Deploymentmetadata: name: httpbin namespace: gateway-testspec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: registry.mwsapis.ru/mws-mk8s-images/customer/go-httpbin:v2.15.0 imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 8080EOFОжидаемый результат:
namespace/gateway-test createdserviceaccount/httpbin createdservice/httpbin createddeployment.apps/httpbin created4. Установите контроллер
Заголовок раздела «4. Установите контроллер»Выберите подходящий контроллер:
Istio Gateway — если вы используете Istio и ресурсы
VirtualService.NGINX Gateway Fabric — если раньше вы использовали Ingress NGINX.
Оба контроллера также могут работать в кластере одновременно.
- Istio Gateway
- NGINX Gateway Fabric
Создайте пространство имен для istiod, управляющего компонента Istio:
bash kubectl create namespace istio-systemОжидаемый результат:
bash namespace/istio-system createdПереключите контекст на созданное пространство:
bash kubectl config set-context --current --namespace istio-systemУстановите CRD, необходимые для работы контроллера:
bash helm upgrade --install istio-base oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/istio/base \--version 1.29.1\-n istio-systemОжидаемый результат:
bash ...NOTES:Istio base successfully installed!...Установите управляющий компонент istiod:
bash helm upgrade --install istiod oci://registry.mwsapis.ru/mws-mk8s-images/customer/charts/istiod \--version 1.29.1 \-n istio-systemОжидаемый результат:
bash ...NOTES:"istiod" successfully installed!...Убедитесь, что контроллер запущен:
bash kubectl -n istio-system get podsОжидаемый результат:
bash NAME READY STATUS RESTARTS AGEistiod-7bfb7b8454-247hc 1/1 Running 0 15m
5. Создайте ресурсы Gateway и HTTPRoute
Заголовок раздела «5. Создайте ресурсы Gateway и HTTPRoute»Ресурс Gateway определяет правила приема входящего трафика, а ресурс HTTPRoute — правила маршрутизации входящего трафика к приложениям, запущенным в кластере.
- Istio Gateway
- NGINX Gateway Fabric
Создайте ресурс
Gatewayв пространстве именgateway-test, в котором развернуто тестовое приложение:bash kubectl apply -f - <<EOFapiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata:name: httpbin-gateway-istionamespace: gateway-testspec:gatewayClassName: istiolisteners:- name: httphostname: "httpbin.example.com"port: 80protocol: HTTPallowedRoutes:namespaces:from: AllEOFПодробнее конфигурация ресурса
Gatewayописана в официальной документации.Ожидаемый результат:
bash gateway.gateway.networking.k8s.io/httpbin-gateway-istio createdСоздайте ресурс
HTTPRouteв пространстве именgateway-test, в котором развернуто тестовое приложение:bash kubectl apply -f - <<EOFapiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata:name: httpbinnamespace: gateway-testspec:parentRefs:- name: httpbin-gateway-istiohostnames: ["httpbin.example.com"]rules:- matches:- path:type: PathPrefixvalue: /statusbackendRefs:- name: httpbinport: 8000EOFПодробнее конфигурация ресурса
HTTPRouteописана в официальной документации.Ожидаемый результат:
bash httproute.gateway.networking.k8s.io/httpbin created
6. Создайте правило файрвола
Заголовок раздела «6. Создайте правило файрвола»После создания ресурса
Gatewayконтроллер автоматически создает сервис типаLoadBalancer(балансировщик нагрузки). Получите информацию о балансировщике:Если используется Istio Gateway, выполните команду:
bash kubectl get svc -A | egrep "(httpbin-gateway-istio)"Если используется NGINX Gateway Fabric, выполните команду:
bash kubectl get svc -A | egrep "(httpbin-gateway-nginx)"
Ожидаемый результат:
bash gateway-test <имя сервиса> LoadBalancer 10.222.85.167 171.22.73.210 15021:31300/TCP,80:31912/TCP 92mЗдесь:
171.22.73.210— внешний IP-адрес балансировщика;80:31912— порт, на котором балансировщик принимает трафик, и соответствующий ему порт на рабочих узлах кластера (NodePort).
Создайте правило файрвола со следующими параметрами:
- Направление трафика —
Ingress. - Действие в рамках правила —
Allow. - Источник трафика —
0.0.0.0/0. Можно указать конкретные IP-адреса. - Назначение трафика — CIDR подсети, в которой расположен кластер Managed Kubernetes.
- Протокол — TCP.
- Порт — порт на узлах кластера (
NodePort). В этом примере —31912. - Опция Активировать правило сразу после сохранения — включена.
7. Проверьте HTTP-доступ к тестовому приложению
Заголовок раздела «7. Проверьте HTTP-доступ к тестовому приложению»Чтобы проверить доступность приложения, выполните команду:
curl -s -I -HHost:httpbin.example.com http://<внешний IP-адрес балансировщика>:80/status/200Ожидаемый результат для Istio Gateway:
HTTP/1.1 200 OK-----server: istio-envoy-----Ожидаемый результат для NGINX Gateway Fabric:
HTTP/1.1 200 OKServer: nginxУдалите платные ресурсы
Заголовок раздела «Удалите платные ресурсы»Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:
- Удалите промежуточную ВМ, если вы ее создавали.