Перейти к содержимому

Настройка Gateway API с использованием Istio Gateway или NGINX Gateway Fabric

Kubernetes Gateway API — это набор ресурсов Kubernetes для настройки маршрутизации входящего трафика к приложениям. Для работы Gateway API необходим контроллер, который реализует спецификацию Gateway API и управляет сетевой инфраструктурой, например Istio Gateway или NGINX Gateway Fabric.

Чтобы установить Gateway API, развернуть тестовое приложение и настроить маршрутизацию HTTP-трафика:

  1. Подготовьте окружение для работы с кластером Managed Kubernetes.
  1. Создайте сервисный аккаунт с именем sa-mk8s и ролью registry.puller.

  2. Для сервисного аккаунта sa-mk8s создайте API-ключ и сохраните его.

  3. Создайте кластер Managed Kubernetes с публичным эндпоинтом и группу узлов для него. При создании группы используйте сервисный аккаунт sa-mk8s.

  4. Создайте NAT-шлюз для подсети, в которой развернут кластер Managed Kubernetes.

  5. Для прохождения руководства вам понадобится устройство, поддерживающее работу с командной строкой. Используйте личный компьютер или создайте промежуточную ВМ в той же сети, где расположен кластер Managed Kubernetes.

  1. Подключитесь к терминалу на вашем компьютере или к промежуточной ВМ.

  2. Установите и настройте утилиту MWS CLI:

  3. Аутентифицируйтесь в Artifact Registry:

    bash
    helm registry login -u apikey -p <API-ключ> registry.mwsapis.ru
  4. Установите утилиту командной строки kubectl.

  1. Установите 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
  2. Убедитесь, что установка прошла успешно:

    bash
    kubectl api-resources --api-group=gateway.networking.k8s.io

    Ожидаемый результат:

    bash
    NAME SHORTNAMES APIVERSION NAMESPACED KIND
    backendtlspolicies btlspolicy gateway.networking.k8s.io/v1 true BackendTLSPolicy
    gatewayclasses gc gateway.networking.k8s.io/v1 false GatewayClass
    gateways gtw gateway.networking.k8s.io/v1 true Gateway
    grpcroutes gateway.networking.k8s.io/v1 true GRPCRoute
    httproutes gateway.networking.k8s.io/v1 true HTTPRoute
    listenersets lset gateway.networking.k8s.io/v1 true ListenerSet
    referencegrants refgrant gateway.networking.k8s.io/v1 true ReferenceGrant
    tlsroutes gateway.networking.k8s.io/v1 true TLSRoute

Чтобы развернуть тестовое приложение httpbin в новом пространстве имен gateway-test, выполните команду:

bash
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: gateway-test
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: httpbin
namespace: gateway-test
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
namespace: gateway-test
labels:
app: httpbin
service: httpbin
spec:
ports:
- name: http
port: 8000
targetPort: 8080
selector:
app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
namespace: gateway-test
spec:
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: 8080
EOF

Ожидаемый результат:

bash
namespace/gateway-test created
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created

Выберите подходящий контроллер:

  • Istio Gateway — если вы используете Istio и ресурсы VirtualService.

  • NGINX Gateway Fabric — если раньше вы использовали Ingress NGINX.

Оба контроллера также могут работать в кластере одновременно.

  • Istio Gateway
  • NGINX Gateway Fabric
  1. Создайте пространство имен для istiod, управляющего компонента Istio:

    bash
    kubectl create namespace istio-system

    Ожидаемый результат:

    bash
    namespace/istio-system created
  2. Переключите контекст на созданное пространство:

    bash
    kubectl config set-context --current --namespace istio-system
  3. Установите 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!
    ...
  4. Установите управляющий компонент 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!
    ...
  5. Убедитесь, что контроллер запущен:

    bash
    kubectl -n istio-system get pods

    Ожидаемый результат:

    bash
    NAME READY STATUS RESTARTS AGE
    istiod-7bfb7b8454-247hc 1/1 Running 0 15m

Ресурс Gateway определяет правила приема входящего трафика, а ресурс HTTPRoute — правила маршрутизации входящего трафика к приложениям, запущенным в кластере.

  • Istio Gateway
  • NGINX Gateway Fabric
  1. Создайте ресурс Gateway в пространстве имен gateway-test, в котором развернуто тестовое приложение:

    bash
    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
    name: httpbin-gateway-istio
    namespace: gateway-test
    spec:
    gatewayClassName: istio
    listeners:
    - name: http
    hostname: "httpbin.example.com"
    port: 80
    protocol: HTTP
    allowedRoutes:
    namespaces:
    from: All
    EOF

    Подробнее конфигурация ресурса Gateway описана в официальной документации.

    Ожидаемый результат:

    bash
    gateway.gateway.networking.k8s.io/httpbin-gateway-istio created
  2. Создайте ресурс HTTPRoute в пространстве имен gateway-test, в котором развернуто тестовое приложение:

    bash
    kubectl apply -f - <<EOF
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
    name: httpbin
    namespace: gateway-test
    spec:
    parentRefs:
    - name: httpbin-gateway-istio
    hostnames: ["httpbin.example.com"]
    rules:
    - matches:
    - path:
    type: PathPrefix
    value: /status
    backendRefs:
    - name: httpbin
    port: 8000
    EOF

    Подробнее конфигурация ресурса HTTPRoute описана в официальной документации.

    Ожидаемый результат:

    bash
    httproute.gateway.networking.k8s.io/httpbin created
  1. После создания ресурса 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).
  2. Создайте правило файрвола со следующими параметрами:

    • Направление трафика — Ingress.
    • Действие в рамках правила — Allow.
    • Источник трафика — 0.0.0.0/0. Можно указать конкретные IP-адреса.
    • Назначение трафика — CIDR подсети, в которой расположен кластер Managed Kubernetes.
    • Протокол — TCP.
    • Порт — порт на узлах кластера (NodePort). В этом примере — 31912.
    • Опция Активировать правило сразу после сохранения — включена.

7. Проверьте HTTP-доступ к тестовому приложению

Заголовок раздела «7. Проверьте HTTP-доступ к тестовому приложению»

Чтобы проверить доступность приложения, выполните команду:

bash
curl -s -I -HHost:httpbin.example.com http://<внешний IP-адрес балансировщика>:80/status/200

Ожидаемый результат для Istio Gateway:

bash
HTTP/1.1 200 OK
-----
server: istio-envoy
-----

Ожидаемый результат для NGINX Gateway Fabric:

bash
HTTP/1.1 200 OK
Server: nginx

Ресурсы, созданные в руководстве, тарифицируются. Если вы больше не планируете использовать их:

  1. Удалите промежуточную ВМ, если вы ее создавали.