Установка контроллера Gwin
Gwin — инструмент для управления балансировщиками нагрузки Yandex Application Load Balancer в кластерах Yandex Managed Service for Kubernetes.
Следуя этому руководству, вы установите в кластер Managed Service for Kubernetes контроллер Gwin. По конфигурации ресурсов Ingress или Gateway API контроллер автоматически развернет балансировщик Application Load Balancer, который:
- автоматически получает динамический публичный IP-адрес;
- принимает HTTP-трафик на порт
80; - принимает HTTPS-трафик на порт
443, используя сертификат Certificate Manager; - отправляет GET-запросы к тестовому сервису
example-service.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- Плата за мастер Managed Service for Kubernetes (см. тарифы Managed Service for Kubernetes).
- Плата за узлы кластера Managed Service for Kubernetes: использование вычислительных ресурсов и хранилища (см. тарифы Compute Cloud).
- Плата за публичные IP-адреса для хостов кластера Managed Service for Kubernetes и узлов кластера Managed Service for Kubernetes, если для них включен публичный доступ (см. тарифы Virtual Private Cloud).
- Плата за использование вычислительных ресурсов балансировщика (см. тарифы Application Load Balancer).
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду
yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров--folder-nameили--folder-id. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes. При создании укажите группы безопасности, подготовленные ранее.
-
Создайте группу узлов. Выделите ей публичный адрес, чтобы предоставить доступ в интернет и возможность скачивать Docker-образы и компоненты. Укажите группы безопасности, подготовленные ранее.
-
Установите kubectl
и настройте его на работу с созданным кластером. -
Создайте сервисный аккаунт, от имени которого контроллер будет создавать ресурсы Application Load Balancer, и назначьте ему роли на каталог:
- alb.editor — для создания необходимых ресурсов Application Load Balancer.
- vpc.publicAdmin — для управления внешней сетевой связностью.
- certificate-manager.certificates.downloader — если используются облачные сертификаты, зарегистрированные в сервисе Yandex Certificate Manager.
- certificate-manager.editor — если используются сертификаты кластера Managed Service for Kubernetes. В этом случае контроллер создает соответствующие им облачные сертификаты.
- compute.viewer — для использования узлов кластера Managed Service for Kubernetes в целевых группах L7-балансировщика.
- k8s.viewer — чтобы контроллер мог определить, в какой сети нужно развернуть L7-балансировщик.
- (опционально) smart-web-security.editor — для подключения профиля безопасности Yandex Smart Web Security к виртуальному хосту L7-балансировщика.
- (опционально) logging.writer — если в ресурсе Gateway указана лог-группа для записи логов L7-балансировщика в Yandex Cloud Logging.
-
Создайте авторизованный ключ доступа для сервисного аккаунта в формате JSON и сохраните его в файл
sa-key.json:yc iam key create \ --service-account-name <имя_сервисного_аккаунта> \ --output sa-key.json
Установите Gwin
Установка с помощью Yandex Cloud Marketplace
-
Перейдите на страницу каталога
и выберите сервис Managed Service for Kubernetes. -
Нажмите на имя нужного кластера Managed Service for Kubernetes и выберите вкладку
Marketplace. -
В разделе Доступные для установки приложения выберите Gwin и нажмите кнопку Перейти к установке.
-
Задайте настройки приложения:
- Пространство имен — создайте новое пространство имен (например,
gwin-space). Если вы оставите пространство имен по умолчанию, Gwin может работать некорректно. - Название приложения — укажите название приложения.
- Идентификатор каталога — укажите идентификатор каталога, в котором будет работать Gwin.
- Ключ сервисного аккаунта — скопируйте содержимое файла
sa-key.json.
- Пространство имен — создайте новое пространство имен (например,
-
Нажмите кнопку Установить.
-
Дождитесь перехода приложения в статус
Deployed.
Установка с помощью Helm-чарта
-
Установите менеджер пакетов Helm
версии не ниже 3.8.0. -
Для установки Helm-чарта
с контроллером Gwin выполните команду:helm pull oci://cr.yandex/yc-marketplace/yandex-cloud/gwin/gwin-chart \ --version v1.0.4 \ --untar \ helm install \ --namespace <пространство_имен> \ --create-namespace \ --set controller.folderId=<идентификатор_каталога> \ --set-file controller.ycServiceAccount.secret.value=./sa-key.json \ gwin ./gwin-chartЕсли вы укажете в параметре
namespaceпространство имен по умолчанию, Gwin может работать некорректно. Рекомендуется указывать значение, отличное от всех существующих пространств имен (например,gwin-space).Идентификатор каталога можно запросить со списком каталогов в облаке.
Подготовьте тестовое приложение
Чтобы проверить работу контроллера Gwin, создайте тестовое приложение example-app:
-
Создайте пользовательский сертификат для домена, который будет использоваться приложением:
openssl req -x509 -newkey rsa:4096 -keyout example-com.key -out example-com.crt -days 365 -nodes -subj \ "/C=RU/ST=Moscow/L=Moscow/O=Example/OU=IT/CN=example.com"Команда выпустит самоподписанный сертификат и сгенерирует для него приватный ключ. Будут созданы два файла:
example-com.crt— для сертификата.example-com.key— для приватного ключа.
-
Добавьте сертификат в Certificate Manager:
yc certificate-manager certificate create \ --folder-id <идентификатор_каталога> \ --name example-certificate \ --chain example-com.crt \ --key example-com.keyПроверьте результат и сохраните идентификатор сертификата, указанный в поле
id:id: fpqmg47avvim******** folder_id: b1g7gvsi89m3******** created_at: "2020-09-15T06:54:44.916325Z" ... issued_at: "2020-09-15T06:54:44.916325Z" not_after: "2021-09-15T06:48:26Z" not_before: "2020-09-15T06:48:26Z" -
Создайте для приложения пространство имен:
kubectl create namespace example-ns -
В отдельной директории создайте конфигурационный файл приложения
example-app.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment namespace: example-ns labels: app: example-app spec: replicas: 2 selector: matchLabels: app: example-app template: metadata: labels: app: example-app spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 volumeMounts: - name: config-volume mountPath: /etc/nginx/conf.d volumes: - name: config-volume configMap: name: example-html --- apiVersion: v1 kind: ConfigMap metadata: name: example-html namespace: example-ns data: default.conf: | server { listen 80; server_name _; location / { return 200 'Hello World'; add_header Content-Type text/plain; } } --- apiVersion: v1 kind: Service metadata: name: example-service namespace: example-ns labels: app: example-app spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 protocol: TCP name: http selector: app: example-app -
В той же директории создайте конфигурационный файл
resources.yamlдля ресурсов Gateway API или Ingress:Gateway APIIngressapiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: example-gateway namespace: example-ns annotations: gwin.yandex.cloud/securityGroups: <идентификаторы_групп_безопасности_балансировщика> spec: gatewayClassName: gwin-default listeners: - name: http protocol: HTTP port: 80 hostname: "example.com" allowedRoutes: namespaces: from: Same - name: https protocol: HTTPS port: 443 hostname: "example.com" allowedRoutes: namespaces: from: Same tls: certificateRefs: - group: gwin.yandex.cloud kind: YCCertificate name: example-certificate addresses: - type: gwin.yandex.cloud/autoIPv4 value: auto --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: example-redirect-httproute namespace: example-ns spec: hostnames: - "example.com" parentRefs: - name: example-gateway sectionName: http rules: - filters: - type: RequestRedirect requestRedirect: scheme: https statusCode: 301 --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: example-httproute namespace: example-ns spec: hostnames: - "example.com" parentRefs: - name: example-gateway sectionName: https rules: - matches: - path: value: /api type: PathPrefix method: GET backendRefs: - kind: Service name: example-service port: 80 --- apiVersion: gwin.yandex.cloud/v1 kind: YCCertificate metadata: name: example-certificate namespace: example-ns spec: certificateRef: certificateID: "<идентификатор_сертификата>"apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress namespace: example-ns annotations: gwin.yandex.cloud/groupName: example gwin.yandex.cloud/externalIPv4Address: auto gwin.yandex.cloud/rules.allowedMethods: "GET" gwin.yandex.cloud/securityGroups: <идентификаторы_групп_безопасности_балансировщика> spec: ingressClassName: gwin-default rules: - host: example.com http: paths: - pathType: Prefix path: "/api" backend: service: name: example-service port: number: 80 tls: - hosts: - example.com secretName: "yc-certmgr-cert-id-<идентификатор_сертификата>"Примечание
В примерах конфигураций балансировщику присваивается динамический публичный IP-адрес. При удалении балансировщика из облака также будет удален его IP-адрес. Чтобы избежать потери IP-адреса в производственной среде, резервируйте и используйте статический IP-адрес.
-
Примените файлы конфигурации:
kubectl apply -f example-app.yaml && \ kubectl apply -f resources.yaml
Проверьте результат
-
Убедитесь, что балансировщик Application Load Balancer создан:
Gateway APIIngress-
Выполните команду:
kubectl get gateway -n example-ns example-gateway -
Проверьте, что в поле
ADDRESSвывода команды отображается IP-адрес балансировщика:NAME CLASS ADDRESS PROGRAMMED AGE example-gateway gwin-default <IP-адрес> 32h
-
Выполните команду:
kubectl get ingress -n example-ns example-ingress -
Проверьте, что в поле
ADDRESSвывода команды отображается IP-адрес балансировщика:NAME CLASS HOSTS ADDRESS PORTS AGE example-ingress gwin-default example.com <IP-адрес> 80, 443 31h
-
-
Убедитесь, что при запросах к тестовому приложению выполняется перенаправление с HTTP на HTTPS:
curl -I <IP-адрес_балансировщика> -H "Host:example.com"Ожидаемый результат:
HTTP/1.1 301 Moved Permanently location: https://example.com:443/ date: Sat, 06 Sep 2025 23:09:19 GMT server: ycalb transfer-encoding: chunked -
Убедитесь, что выполняются HTTPS-запросы к тестовому приложению:
curl --resolve example.com:443:<IP-адрес_балансировщика> \ --cacert example-com.crt \ https://example.com/api/helloОжидаемый результат:
Hello World
Удалите созданные ресурсы
Некоторые ресурсы платные. Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата: