Облачная платформа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-58d8******-***** 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/nginx:latest
    ports:
    - containerPort: 8080
  2. Примените манифесты:

    kubectl apply -f cloudru-httpbin.yaml

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

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

    kubectl -n httpbin get pods

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

    NAME READY STATUS RESTARTS AGE
    httpbin-6d8b******-***** 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. Откройте браузер и в адресную строку введите: http://<external-ip>.

    В результате вы увидите стандартную страницу приветствия Nginx.