Установка и настройка Istio Gateway

Istio Gateway — это компонент на базе Gateway API для управления входящим трафиком в Kubernetes-кластере. Он выступает точкой входа в систему и позволяет гибко настраивать маршрутизацию HTTP- и HTTPS‑трафика.

В статье рассмотрим:

Установка Istio Gateway API (опционально)

Этот шаг выполняется, только если в кластере ещё нет установленного Istio Gateway. Если этот компонент уже есть, вы можете пропустить этот шаг.

Установка состоит из следующих этапов:

  1. Скачать Helm-чарт и конфигурационный файл.
  2. Заполнить конфигурационный файл.
  3. Установить Helm-чарт Istio с поддержкой Gateway API.
  4. Создать GatewayClass.
  5. Создать TLS-сертификат.
  6. Создать Gateway.
  7. Настроить внешний IP-адрес через MetalLB (опционально).

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

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

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

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

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

Заполните конфигурационный файл values-istio.yaml для установки сервиса Istio и включите в нём поддержку Gateway API:

global:
  gatewayAPI:
    enabled: true

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

 

Шаг 3. Установить Helm-чарт Istio с поддержкой Gateway API

Выполните установку чарта Istio в пространство имён istio-system. Пространство имён будет создано во время установки, если не было создано ранее.

В зависимости от способа установки выполните следующие действия:

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

helm upgrade --install istio elma365/istio -f values-istio.yaml -n istio-system --create-namespace

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

helm upgrade --install istio ./istio -f values-istio.yaml -n istio-system --create-namespace

 

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

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

Создайте GatewayClass:

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: istio
spec:
  controllerName: istio.io/gateway-controller
EOF

 

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

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

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

  • самоподписанный сертификат;
  • сертификат, выданный доверенным центром сертификации.
  1. Для генерации сертификата воспользуйтесь одной из инструкций:

 

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

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

Где:

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

 

 

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

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

В рамках Istio Gateway создаётся ресурс Gateway API и связывается с ранее созданным GatewayClass.

Создайте основной Gateway:

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

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

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

После создания Gateway необходимо обеспечить внешний доступ к нему. В Istio каждый Gateway автоматически создаёт Kubernetes Service типа LoadBalancer, c помощью которого осуществляется входящий трафик.

  1. Проверьте сервис Gateway с помощью команды:

kubectl get svc -n istio-system

Если в колонке EXTERNAL-IP указан IP-адрес — внешний доступ уже настроен. Если значение EXTERNAL-IP равно <pending> или <none>, в кластере отсутствует внешний балансировщик.

В облачных Kubernetes-кластерах внешний балансировщик создаётся автоматически, поэтому дополнительных действий не требуется.

  1. В локальных или тестовых окружениях (On-Premises / Single-node кластер) внешний балансировщик отсутствует, поэтому можно использовать MetalLB. Он позволяет реализовать поведение LoadBalancer и назначить внешний IP для Gateway.
     
    Установите 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 main-gateway-istio -n istio-system

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

 

Настройка ELMA365 для работы с Istio Gateway API

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

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

global:
 …
  gatewayAPI:
    ## включение Gateway API (HTTPRoute)
    enabled: true
    parentRefs:
    - name: main-gateway
      namespace: istio-system
    envoyFilter:
      enabled: true
      namespace: istio-system
      workloadSelector:
        gateway.istio.io/managed: istio.io-gateway-controller

Где:

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

Параметры должны соответствовать ранее созданному ресурсу Gateway.

Полное описание всех параметров конфигурационного файла values-elma365.yaml, а также шаги работы с этим файлом читайте в статье «Изменение параметров ELMA365 Enterprise».