﻿# Установка и настройка Istio Gateway

> [HTML Version](gateway-api.html)

Istio Gateway — это компонент на базе Gateway API для управления входящим трафиком в Kubernetes-кластере. Он выступает точкой входа в систему и позволяет гибко настраивать маршрутизацию HTTP- и HTTPS‑трафика.

В статье рассмотрим:

- [установку Istio Gateway API](#install-gateway-api);

- [настройку ELMA365 для работы с Istio Gateway API](#system-configuration).

## Установка Istio Gateway API (опционально)

Этот шаг выполняется, только если в кластере ещё нет установленного Istio Gateway. Если этот компонент уже есть, вы можете пропустить этот шаг.

Установка состоит из следующих этапов:

1. [Скачать Helm-чарт и конфигурационный файл](#chart).

2. [Заполнить конфигурационный файл](#configure).

3. [Установить Helm-чарт Istio с поддержкой Gateway API](#install-chart).

4. [Создать GatewayClass](#gatewayclass).

5. [Создать TLS-сертификат](#tls).

6. [Создать Gateway](#create-gateway).

7. [Настроить внешний IP-адрес через MetalLB (опционально)](#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

````
Получение конфигурационного файла для установки в закрытом контуре без доступа в интернет

1. На компьютере с доступом в интернет скачайте образы ELMA365 и загрузите их в локальный реестр образов:

````
helm repo add elma365 https://charts.elma365.tech  
helm repo update  
helm pull elma365/istio

````
Подробнее об этом читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. Полученный архив чарта `istio-X.Y.Z.tgz` скопируйте на сервер, где будет производиться установка.

3. Распакуйте этот чарт и скопируйте конфигурационный файл по умолчанию `values.yaml` в файл `values-istio.yaml`:

````
tar -xf istio-X.Y.Z.tgz

````


### Шаг 2. Заполнить конфигурационный файл

Заполните конфигурационный файл `values-istio.yaml` для установки сервиса Istio и включите в нём поддержку Gateway API:

````
global:  
  gatewayAPI:  
    enabled: true

````
Заполнение параметров подключения к приватному registry для установки в закрытом контуре без доступа в интернет

  
Для подключения к приватному registry нужно:

1. Скачать образы ELMA365 и загрузить их в локальный реестр образов. Подробнее об этом читайте в статье [«Загрузка образов ELMA365»](downloadin-images-elma365.md).

2. Задать адрес и путь для параметра `global.hub`.

3. В параметре `global.imagePullSecrets` указать наименование секрета с правами доступа к приватному registry. Секрет должен быть создан вручную и зашифрован в Base64.

````
\# Настройки Istio  
global:  
...  
  # параметры подключения к приватному registry  
  # адрес и путь для приватного registry  
  hub: registry.example.com/istio  
  tag: 1.19.0  
 # секрет с правами доступа к приватному registry должен быть создан вручную и зашифрован в Base64  
  imagePullSecrets:  
  - myRegistryKeySecretName  
...

````
Где формат repository:

- адрес — `registry.example.com`;

- путь — `/istio`.





### Шаг 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. Для генерации сертификата воспользуйтесь одной из инструкций:

- [официальная документация Istio](https://istio.io/latest/docs/tasks/traffic-management/ingress/secure-ingress/);

- статья в официальной справке ELMA365 [«Создание самоподписанных сертификатов TLS с помощью OpenSSL»](ssl-certificates.md). 



2. Добавьте созданный сертификат в 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  
  labels:  
    gateway.istio.io/managed: istio.io-gateway-controller  
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-кластерах внешний балансировщик создаётся автоматически, поэтому дополнительных действий не требуется.

2. В локальных или тестовых окружениях (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

3. ````
Дождитесь запуска компонентов:

````
kubectl get pods -n metallb-system -w

4. ````
Настройте пул 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-адрес ноды, доступный для внешнего трафика.

````
Конец примечание

5. ````
Проверьте сервис 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»](change-settings-enterprise.md).

