Установка Cilium Gateway

Cilium Gateway API служит единой точкой входа в кластер для работы с внешним трафиком в ELMA365. Использование Gateway API позволяет управлять доступом к ELMA365 через единый интерфейс и передавать данные с помощью Cilium в eBPF‑программы.

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

  • определять доступ к сервисам из внешних источников;
  • автоматически настраивать L7‑маршрутизацию (HTTP/gRPC);
  • обеспечивать расшифровку TLS;
  • реализовывать балансировку нагрузки.

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. Установите CRD из Gateway API версии 1.5.1 согласно инструкциям в документации Cilium Gateway API.
    Вы также можете установить их с помощью команды:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.1/config/crd/standard/gateway.networking.k8s.io_backendtlspolicies.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.5.0/config/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml

  1. С помощью helm установите чарт cilium в namespace kube-system:
    1. Для установки через интернет выполните команду:

helm upgrade --install -n kube-system cilium elma365/cilium -f values-cilium.yaml

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

helm upgrade --install cilium ./cilium -f values-cilium.yaml -n kube-system

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

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

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

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

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

где:

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

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

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

Чтобы создать ресурс Gateway и связать с ресурсом GatewayClass:

kubectl apply -n kube-system -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
   name: cilium-gateway
spec:
   gatewayClassName: cilium
   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 — определяет, из каких пространств имён разрешено подключение маршрутов.

После создания Gateway можно подключать маршруты для публикации сервисов с помощью ресурса HTTPRoute.

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

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

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

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

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

kubectl get svc -n kube-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 kube-system

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

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

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

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

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

где:

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

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

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