Установка Envoy Gateway

Envoy Gateway — это инструмент для управления трафиком в Kubernetes, с помощью которого можно предоставить доступ к сервисам приложения ELMA365 через единый шлюз — API Gateway.

Envoy Gateway позволяет:

  • маршрутизировать и перенаправлять трафик;
  • обеспечивать расшифровку TLS и управление запросами;
  • реализовывать балансировку нагрузки;
  • использовать расширенные возможности наблюдения за сетями.

Установка и настройка Envoy Gateway состоит из нескольких этапов:

  1. Скачивание helm-чарта и конфигурационного файла.
  2. Заполнение конфигурационного файла.
  3. Установка с помощью helm в Kubernetes-кластер.
  4. Создание GatewayClass.
  5. Создание TLS-сертификата.
  6. Создание Gateway.
  7. Настройка внешнего IP-адреса через MetalLB (опционально).
  8. Настройка ELMA365 для работы с Gateway API.

Важно: рекомендуем использовать в кластере только один Gateway‑контроллер, чтобы избежать конфликта ресурсов HTTPRoute и Gateway, непредсказуемой маршрутизации и повышенной нагрузки. Два контроллера можно разворачивать только временно, например при миграции, или в строго изолированных namespace с разными ресурсами GatewayClass.

Шаг 1. Скачать helm-чарт и конфигурационный файл

Для установки через интернет получите конфигурационный файл values-envoy-gateway.yaml, выполнив команду:

helm repo add elma365 https://charts.elma365.tech
helm repo update
helm show values elma365/envoy-gateway > values-envoy-gateway.yaml

Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет

Шаг 2. Заполнить конфигурационный файл

Задайте настройки для установки Envoy Gateway в конфигурационном файле values-envoy-gateway.yaml.

Важно: проверьте, что в параметре url: http://envoy-gateway-system-kube-prometheus-prometheus.envoy-gateway-system.svc указан путь к вашему сервису Prometheus.

Пример содержания файла values-envoy-gateway.yaml

Заполнение параметров подключения к приватному registry для установки в закрытом контуре без доступа в интернет

Шаг 3. Установить чарт envoy-gateway в Kubernetes-кластер 

С помощью helm установите чарт envoy-gateway в namespace envoy-gateway-system:

  • для установки через интернет:

helm upgrade --install -n envoy-gateway-system envoy-gateway elma365/envoy-gateway -f values-envoy-gateway.yaml

  • для установки без доступа в интернет перейдите в каталог с загруженным чартом и выполните команду:

helm upgrade --install envoy-gateway ./envoy-gateway -f values-envoy-gateway.yaml -n envoy-gateway-system

Шаг 4. Создать GatewayClass

Ресурс GatewayClass определяет, какой контроллер будет обрабатывать ресурсы Gateway в кластере.

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

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: envoy-gateway
spec:
  controllerName: gateway.envoyproxy.io/gatewayclass-controller
  parametersRef:
    group: gateway.envoyproxy.io
    kind: EnvoyProxy
    name: custom-envoy-proxy
    namespace: envoy-gateway-system
EOF

Шаг 5. Создать TLS-сертификат

Для обеспечения доступа по протоколу HTTPS создайте TLS-сертификат и добавьте его в Kubernetes в виде секрета.

Вы можете использовать:

Добавьте созданный сертификат в Kubernetes. Для этого в пространстве имён kube-system создайте TLS-секрет с полученным файлом сертификата в формате .crt и ключом в формате .key:

kubectl create secret tls elma365-tls -n envoy-gateway-system \
--cert=/etc/ssl/certs/selfsigned.crt \
--key=/etc/ssl/private/selfsigned.key

где:

  • elma365-tls — имя секрета, которое будет использоваться в ресурсе Gateway;
  • --cert — путь к сертификату;
  • --key — путь к приватному ключу.

Шаг 6. Создать Gateway

Ресурс Gateway определяет правила обработки входящего трафика в кластере. Он описывает, какие порты и протоколы используются, а также какие сертификаты применяются для HTTPS. Чтобы настроить его:

  1. Добавьте ресурс Gateway и свяжите с ресурсом GatewayClass:

kubectl apply -n envoy-gateway-system -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
   name: envoy-gateway
spec:
   gatewayClassName: envoy-gateway
   listeners:
   - name: http
     port: 80
     protocol: HTTP
     allowedRoutes:
       namespaces:
        from: All
   - name: https
     port: 443
     protocol: HTTPS
     tls:
       mode: Terminate
       certificateRefs:
       - name: elma365-tls
     allowedRoutes:
       namespaces:
         from: All
EOF

где:

  • gatewayClassName — контроллер, который будет обрабатывать ресурс Gateway;
  • listeners — список точек входа:
    • port — порт;
    • protocol — протокол: HTTP или HTTPS;
    • tls.mode: Terminate — завершение TLS‑соединения на стороне Gateway;
    • certificateRefs — ссылка на ранее созданный TLS-секрет. Значение в поле name должно совпадать с именем сертификата в Kubernteres;
  • allowedRoutes — определяет, из каких пространств имён разрешено подключение маршрутов.
  1. Опубликуйте сервис envoy-gateway одним из способов:
    • с помощью стороннего балансировщика — например, установите решение MetalLB;
    • с помощью встроенных возможностей Gateway — чтобы присвоить сервису тип LoadBalancer, выполните команду, указав вместо <node_ip> IP‑адрес узла, на котором доступен сервис, например 192.168.1.10:

kubectl patch svc $(kubectl get svc -n envoy-gateway-system -o name | grep envoy-gateway | head -1 | sed 's|service/||') -n envoy-gateway-system -p '{"spec": {"type": "LoadBalancer", "externalIPs":["<node_ip>"]}}'

Шаг 7. Настроить внешний IP-адрес через MetalLB (опционально)

Для правильной работы Gateway API требуется прямой выход в интернет с публичным IP-адресом на узле кластера с использованием сервиса типа NodePort. После создания Gateway автоматически создаётся сервис типа LoadBalancer, c помощью которого поступает входящий трафик.

Вы можете установить инструмент MetalLB, который работает так же, как облачные балансировщики нагрузки. В нём используются механизмы L2 (ARP/NDP) или протокол BGP для предоставления IPадреса сервисам типа LoadBalancer, которые создаёт Gateway.

Когда использовать MetalLB

Чтобы узнать о наличии внешнего IP‑адреса для сервиса Gateway, посмотрите настройки сервисов с помощью команды:

kubectl get svc -n envoy-gateway-system

Проверьте значение в колонке EXTERNAL-IP:

  • если указан IP-адрес — внешний доступ уже настроен;
  • если установлено значение <pending> или <none> — в кластере отсутствует внешний балансировщик:
    • в облачных Kubernetes-кластерах — внешний балансировщик создастся автоматически, поэтому дополнительных действий не требуется;
    • в локальных или тестовых окружениях — можно использовать MetalLB.

Установить MetalLB

Чтобы применять MetalLB для настройки внешнего доступа к Gateway:

  1. Установите MetalLB:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.15.3/config/manifests/metallb-native.yaml

  1. Запустите команду для отслеживания состояния подов и дождитесь запуска компонентов:

kubectl get pods -n metallb-system -w

  1. Настройте пул IP-адресов:

kubectl apply -f - <<EOF
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: host-ip-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.29.176-192.168.29.176
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: host-ip-adv
  namespace: metallb-system
spec:
  ipAddressPools:
  - host-ip-pool
EOF

где 192.168.29.176 — пример IP‑адреса хоста, на котором установлен Kubernetes. Используйте IP‑адрес узла в вашем кластере, который доступен для внешнего трафика.

  1. Проверьте настройки сервиса Gateway:

kubectl get svc -n envoy-gateway-system

Ресурс Gateway готов к использованию для маршрутизации трафика ELMA365.

Шаг 8. Настроить ELMA365 для работы с Gateway API

После установки Gateway включите поддержку Gateway API в конфигурации ELMA365.

Для этого в конфигурационном файле values-elma365.yaml добавьте или измените параметры:

global:
 …
  gatewayAPI:
    ## включение Gateway API (HTTPRoute)
    enabled: true
    parentRefs:
    - name: envoy-gateway
      namespace: envoy-gateway-system

где:

  • enabled — включает использование Gateway API вместо Ingress;
  • parentRefs — указывает Gateway, через который публикуется ELMA365.

Значения должны соответствовать параметрам ранее созданного ресурса Gateway.

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