Облачная платформаEvolution

Публикация приложения с помощью Kgateway


Kgateway — легковесный Gateway API на основе Envoy, который реализует Kubernetes Gateway API. В отличие от Istio, Kgateway предоставляет более простое и быстрое решение для управления входящим трафиком.

В инструкции рассмотрим пример настройки Kgateway в кластере Managed Kubernetes для предоставления доступа к контейнерному приложению извне.

Перед началом работы

  1. Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.

    Минимальные параметры для группы узлов:

    • Гарантированная доля vCPU, %10.

    • CPU, шт.2.

    • RAM, ГБ4.

    • Объем хранилища, ГБ40.

    • Количество узлов1.

  2. Подключитесь к кластеру Managed Kubernetes.

1. Установите Kgateway

  1. В созданном кластере перейдите в раздел Плагины и в правом верхнем углу нажмите Добавить плагин.

  2. В списке плагинов выберите Kgateway и нажмите Установить.

  3. Выберите версию плагина.

  4. Нажмите Установить.

    Дождитесь, когда состояние плагина изменится на «Установлен».

  5. Убедитесь, что все поды Kgateway в статусе «Running»:

    kubectl get pods -n kgateway-system

    Результат:

    NAME READY STATUS RESTARTS AGE
    kgateway-58d9f2f***-***** 1/1 Running 0 25m

2. Разверните приложение

  1. Создайте cloudru-httpbin.yaml и сохраните манифесты:

    apiVersion: v1
    kind: Namespace
    metadata:
    name: httpbin
    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: httpbin
    namespace: httpbin
    spec:
    ports:
    - port: 8000
    targetPort: 8080
    selector:
    app: httpbin
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: httpbin
    namespace: httpbin
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: httpbin
    template:
    metadata:
    labels:
    app: httpbin
    spec:
    containers:
    - name: httpbin
    image: emk8s.cr.cloud.ru/mccutchen/go-httpbin:v2.6.0
    ports:
    - containerPort: 8080
  2. Примените манифесты:

    kubectl apply -f cloudru-httpbin.yaml

    Примерный результат:

    namespace/httpbin created
    service/httpbin created
    deployment.apps/httpbin created
  3. Убедитесь, что поды запущены.

    kubectl get pods -n httpbin

    Примерный результат:

    NAME READY STATUS RESTARTS AGE
    httpbin-6d8bs2s***-***** 1/1 Running 0 69s

3. Создайте Gateway и HTTPRoute

  1. Создайте cloudru-gateway.yaml и сохраните манифест:

    kind: Gateway
    apiVersion: gateway.networking.k8s.io/v1
    metadata:
    name: http
    namespace: httpbin
    spec:
    gatewayClassName: kgateway
    listeners:
    - protocol: HTTP
    port: 8080
    name: http
  2. Создайте cloudru-gateway-http.yaml и сохраните манифест:

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
    name: httpbin
    namespace: httpbin
    spec:
    parentRefs:
    - name: http
    rules:
    - backendRefs:
    - name: httpbin
    port: 8000
  3. Последовательно выполните:

    kubectl apply -f cloudru-gateway.yaml
    kubectl apply -f cloudru-gateway-http.yaml

    Результат:

    gateway.gateway.networking.k8s.io/http created
    httproute.gateway.networking.k8s.io/httpbin created

4. Проверьте работу приложения

  1. Получите внешний IP-адрес Gateway:

    kubectl get svc -n httpbin

    Вы получите примерно такой вывод:

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    http LoadBalancer 10.***.**.*** <external_ip> 8080:32610/TCP 110s
    httpbin ClusterIP 10.***.**.*** <none> 8000/TCP 7m22s

    Где <external_ip> — назначенный IP-адрес.

  2. Отправьте запрос на внешний IP-адрес балансировщика:

    curl http://<external_ip>:8080/get

    Пример успешного ответа:

    {
    "args": {},
    "headers": {
    "Accept": [
    "*/*"
    ],
    "Host": [
    "37.**.***.***:8080"
    ],
    "User-Agent": [
    "curl/8.19.0"
    ],
    "X-Envoy-Expected-Rq-Timeout-Ms": [
    "15000"
    ],
    "X-Envoy-External-Address": [
    "10.*.*.***"
    ],
    "X-Forwarded-For": [
    "10.*.*.***"
    ],
    "X-Forwarded-Proto": [
    "http"
    ],
    "X-Request-Id": [
    "80983427-8393-40c5-834d-d566********"
    ]
    },
    "origin": "10.*.*.***",
    "url": "http://37.**.***.***:8080/get"
    }

    Kgateway правильно обрабатывает объекты Gateway API и перенаправляет вызовы на httpbin.