Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Создание кластера Kubernetes без доступа в интернет
    • Запуск рабочих нагрузок с GPU
    • Использование групп узлов c GPU без предустановленных драйверов
    • Установка Time-Slicing GPUs
    • Миграция ресурсов в другую зону доступности
    • Использование модулей Yandex Cloud в Terraform
    • Шифрование секретов в Managed Service for Kubernetes
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
      • Настройка логирования для L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
      • Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer
      • Проверка состояния приложений в кластере Managed Service for Kubernetes с помощью L7-балансировщика Application Load Balancer
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
      • Редактирование изображений для сайтов с помощью Thumbor
      • Использование Istio
      • Использование HashiCorp Vault для хранения секретов
  • Управление доступом
  • Правила тарификации
  • Справочник Terraform
  • Метрики Monitoring
  • Аудитные логи Audit Trails
  • История изменений
  • Обучающие курсы

В этой статье:

  • Необходимые платные ресурсы
  • Перед началом работы
  • Создайте ресурсы Managed Service for Kubernetes
  • Установите Gateway API и настройте доменные зоны
  • Подготовьте тестовые приложения
  • Настройте приложение для среды dev
  • Настройте приложение для среды prod
  • Создайте тестовые приложения
  • Проверьте работу Gateway API
  • Удалите созданные ресурсы
  1. Практические руководства
  2. Использование продуктов Cloud Marketplace
  3. Настройка Gateway API

Настройка Gateway API

Статья создана
Yandex Cloud
Улучшена
mmerihsesh
Обновлена 6 мая 2025 г.
  • Необходимые платные ресурсы
  • Перед началом работы
  • Создайте ресурсы Managed Service for Kubernetes
  • Установите Gateway API и настройте доменные зоны
  • Подготовьте тестовые приложения
    • Настройте приложение для среды dev
    • Настройте приложение для среды prod
    • Создайте тестовые приложения
  • Проверьте работу Gateway API
  • Удалите созданные ресурсы

Gateway API — набор ресурсов API, моделирующих сетевое взаимодействие в кластере Kubernetes.

Из этой статьи вы узнаете, как организовать доступ к приложениям, находящимся в двух тестовых средах dev и prod, с помощью Yandex Application Load Balancer через Gateway API. Для этого потребуется создать публичную доменную зону и делегировать домен сервису Yandex Cloud DNS.

Чтобы интегрировать Gateway API и Application Load Balancer:

  1. Создайте ресурсы Managed Service for Kubernetes.
  2. Установите Gateway API и настройте доменные зоны.
  3. Подготовьте тестовые приложения.
  4. Создайте тестовые приложения.
  5. Проверьте работу Gateway API.

Если созданные ресурсы вам больше не нужны, удалите их.

Необходимые платные ресурсыНеобходимые платные ресурсы

В стоимость поддержки описываемого решения входят:

  • Плата за DNS-зону и DNS-запросы (см. тарифы Cloud DNS).
  • Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
  • Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
  • Плата за использование вычислительных ресурсов L7-балансировщика (см. тарифы Application Load Balancer).
  • Плата за публичные IP-адреса (см. тарифы Virtual Private Cloud).

Перед началом работыПеред началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

    По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

  2. Зарегистрируйте публичную доменную зону и делегируйте домен.

Создайте ресурсы Managed Service for KubernetesСоздайте ресурсы Managed Service for Kubernetes

  1. Создайте кластер и группу узлов Kubernetes.

    Вручную
    Terraform
    1. Если у вас еще нет сети, создайте ее.

    2. Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Kubernetes и группа узлов.

    3. Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.

      Важно

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

    4. Создайте кластер Kubernetes и группу узлов любой подходящей конфигурации. При создании укажите группы безопасности, подготовленные ранее.

    1. Если у вас еще нет Terraform, установите его.

    2. Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.

    3. Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его.

    4. Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.

    5. Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-gateway-api.tf. В файле описаны:

      • Сеть.

      • Подсеть.

      • Кластер Kubernetes.

      • Сервисный аккаунт, необходимый для работы кластера и группы узлов Kubernetes.

      • Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.

        Важно

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

    6. Укажите в файле конфигурации:

      • Идентификатор каталога.
      • Версию Kubernetes для кластера и групп узлов Kubernetes.
      • CIDR кластера Kubernetes.
    7. Проверьте корректность файлов конфигурации Terraform с помощью команды:

      terraform validate
      

      Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    8. Создайте необходимую инфраструктуру:

      1. Выполните команду для просмотра планируемых изменений:

        terraform plan
        

        Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

      2. Если вас устраивают планируемые изменения, внесите их:

        1. Выполните команду:

          terraform apply
          
        2. Подтвердите изменение ресурсов.

        3. Дождитесь завершения операции.

      В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.

  2. Установите kubectl и настройте его на работу с созданным кластером.

  3. Создайте сервисный аккаунт, необходимый для работы Gateway API.

  4. Назначьте ему роли:

    • alb.editor — для создания необходимых ресурсов.
    • certificate-manager.admin — для работы с сертификатами, зарегистрированными в сервисе Yandex Certificate Manager.
    • compute.viewer — для использования узлов кластера Managed Service for Kubernetes в целевых группах балансировщика нагрузки.
    • vpc.publicAdmin — для управления внешней связностью.
  5. Создайте для него статический ключ и сохраните в файл sa-key.json:

    yc iam key create \
      --service-account-name <имя_сервисного_аккаунта_для_Gateway_API> \
      --output sa-key.json
    

Установите Gateway API и настройте доменные зоныУстановите Gateway API и настройте доменные зоны

  1. Установите приложение Gateway API с помощью инструкции. При установке используйте ключ сервисного аккаунта, созданный ранее.

  2. Зарезервируйте публичные IP-адреса для тестовых сред prod и dev:

    yc vpc address create \
      --name=prod \
      --labels reserved=true \
      --external-ipv4 \
      zone=<зона_доступности> && \
    yc vpc address create \
      --name=dev \
      --labels reserved=true \
      --external-ipv4 \
      zone=<зона_доступности>
    

    Где <зона_доступности> — зона доступности, в которой расположен ваш кластер Kubernetes.

    Сохраните публичные IP-адреса — они понадобятся для дальнейшей настройки.

  3. Создайте ресурсные записи для вашей публичной DNS-зоны:

    yc dns zone add-records \
      --name <имя_DNS-зоны> \
      --record '*.prod 60 A <IP-адрес_для_среды_prod>' && \
    yc dns zone add-records \
      --name <имя_DNS-зоны> \
      --record '*.dev 60 A <IP-адрес_для_среды_dev>'
    

    Пример корректной команды:

    yc dns zone add-records \
     --name my-domain-name \
     --record '*.dev 60 A 171.154.241.41'
    
  4. Создайте пространство имен для TLS-секретов:

    kubectl create namespace gateway-api-tls-secrets
    
  5. Создайте сертификаты OpenSSL:

    openssl req -x509 \
      -newkey rsa:4096 \
      -keyout gateway-key-prod.pem \
      -out gateway-cert-prod.pem \
      -nodes \
      -days 365 \
      -subj '/CN=*.prod.<доменная_зона>' && \
    openssl req -x509 \
       -newkey rsa:4096 \
       -keyout gateway-key-dev.pem \
       -out gateway-cert-dev.pem \
       -nodes \
       -days 365 \
       -subj '/CN=*.dev.<доменная_зона>'
    

    Пример корректной команды:

    openssl req -x509 \
     -newkey rsa:4096 \
     -keyout gateway-key-prod.pem \
     -out gateway-cert-prod.pem \
     -nodes \
     -days 365 \
     -subj '/CN=*.prod.my-test-domain.com'
    

    На основании этих сертификатов в кластере Kubernetes будут созданы секреты для тестовых сред prod и dev.

  6. Создайте секреты:

    kubectl create -n gateway-api-tls-secrets secret tls gateway-prod-tls \
      --cert=gateway-cert-prod.pem \
      --key=gateway-key-prod.pem && \
    kubectl create -n gateway-api-tls-secrets secret tls gateway-dev-tls \
      --cert=gateway-cert-dev.pem \
      --key=gateway-key-dev.pem
    

Подготовьте тестовые приложенияПодготовьте тестовые приложения

Для проверки работы Gateway API будут созданы два приложения (tutum/hello-world и nginxdemos/hello). Для каждого приложения понадобится настройка и выполнение трех YAML-файлов:

  • dev-gw.yaml и prod-gw.yaml — настройки Gateway. В этих манифестах нужно указать:
    • Группы безопасности, в которых развернут кластер Kubernetes, в параметре metadata.annotations.gateway.alb.yc.io/security-groups.
    • Доменную зону с префиксами *.dev и *.prod в параметрах hostname.
    • IP-адреса для сред dev и prod в параметре spec.addresses.value.
  • dev-route.yaml и prod-route.yaml — настройка маршрутизации для приложений. В этих манифестах нужно указать доменную зону с префиксами app.dev и app.prod в параметре spec.hostnames.
  • dev-app.yaml и prod-app.yaml — настройки приложений. С помощью этих манифестов будут созданы:
    • Пространство имен (уникальное для каждого приложения).
    • Deployment приложения.
    • Сервис.

Настройте приложение для среды devНастройте приложение для среды dev

  1. Создайте манифест dev-gw.yaml:

    dev-gw.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: gateway-api-dev
      annotations:
        gateway.alb.yc.io/security-groups: <идентификаторы_групп_безопасности_кластера>
    spec:
      gatewayClassName: yc-df-class
      listeners:
      - name: gateway-api-dev
        protocol: HTTP
        port: 80
        hostname: "*.dev.<доменная_зона>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - dev-app
      - name: gateway-api-dev-tls
        protocol: HTTPS
        port: 443
        hostname: "*.dev.<доменная_зона>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - dev-app
        tls:
          certificateRefs:
          - group: ""
            kind: Secret
            name: gateway-dev-tls
            namespace: gateway-api-tls-secrets
          mode: Terminate
      addresses:
       - type: IPAddress
         value: "<IP-адрес_для_среды_dev>"
    
  2. Создайте файл dev-route.yaml:

    dev-route.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: dev-app-http-route
      namespace: dev-app
    spec:
      hostnames:
      - "app.dev.<доменная_зона>"
      parentRefs:
      - name: gateway-api-dev
        namespace: default
      rules:
      - matches:
        - path:
            value: /
        backendRefs:
        - name: app
          port: 80
    
  3. Создайте манифест dev-app.yaml:

    dev-app.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev-app
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app
      namespace: dev-app
    spec:
      selector:
        matchLabels:
          app: app
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: tutum/hello-world
            resources:
              limits:
                memory: "128Mi"
                cpu: "500m"
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: app
      namespace: dev-app
    spec:
      type: NodePort
      selector:
        app: app
      ports:
      - port: 80
        targetPort: 80
    

Настройте приложение для среды prodНастройте приложение для среды prod

  1. Создайте манифест prod-gw.yaml:

    prod-gw.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
      name: gateway-api-prod
      annotations:
        gateway.alb.yc.io/security-groups: <идентификаторы_групп_безопасности_кластера>
    spec:
      gatewayClassName: yc-df-class
      listeners:
      - name: gateway-api-prod
        protocol: HTTP
        port: 80
        hostname: "*.prod.<доменная_зона>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - prod-app
      - name: gateway-api-prod-tls
        protocol: HTTPS
        port: 443
        hostname: "*.prod.<доменная_зона>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - prod-app
        tls:
          certificateRefs:
          - group: ""
            kind: Secret
            name: gateway-prod-tls
            namespace: gateway-api-tls-secrets
          mode: Terminate
      addresses:
        - type: IPAddress
          value: "<IP-адрес_для_среды_prod>"
    
  2. Создайте манифест prod-route.yaml:

    prod-route.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: prod-app-http-route
      namespace: prod-app
    spec:
      hostnames:
      - "app.prod.<доменная_зона>"
      parentRefs:
      - name: gateway-api-prod
        namespace: default
      rules:
      - matches:
        - path:
            value: /
        backendRefs:
        - name: app
          port: 80
    
  3. Создайте манифест prod-app.yaml:

    prod-app.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: prod-app
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app
      namespace: prod-app
    spec:
      selector:
        matchLabels:
          app: app
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: tutum/hello-world
            resources:
              limits:
                memory: "128Mi"
                cpu: "500m"
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: app
      namespace: prod-app
    spec:
      type: NodePort
      selector:
        app: app
      ports:
      - port: 80
        targetPort: 80
    

Создайте тестовые приложенияСоздайте тестовые приложения

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

    kubectl apply -f prod-gw.yaml && \
    kubectl apply -f prod-app.yaml && \
    kubectl apply -f prod-route.yaml && \
    kubectl apply -f dev-gw.yaml && \
    kubectl apply -f dev-app.yaml && \
    kubectl apply -f dev-route.yaml
    
  2. Убедитесь, что поды приложений перешли в состояние Running:

    kubectl get pods --namespace dev-app && \
    kubectl get pods --namespace prod-app
    
  3. Убедитесь, что для Gateway API создан балансировщик нагрузки:

    yc application-load-balancer load-balancer list
    

    Примечание

    Создание балансировщика нагрузки может занять несколько минут.

Проверьте работу Gateway APIПроверьте работу Gateway API

Для проверки работы Gateway API перейдите по ссылкам в браузере:

  • app.prod.<доменная_зона>.
  • app.dev.<доменная_зона>.

Примечание

Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.

Удалите созданные ресурсыУдалите созданные ресурсы

Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:

Вручную
Terraform
  1. Удалите кластер Kubernetes.
  2. Удалите созданные подсети и сети.
  3. Удалите созданный сервисный аккаунт.
  1. В терминале перейдите в директорию с планом инфраструктуры.

    Важно

    Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.

  2. Удалите ресурсы:

    1. Выполните команду:

      terraform destroy
      
    2. Подтвердите удаление ресурсов и дождитесь завершения операции.

    Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.

Была ли статья полезна?

Предыдущая
Настройка Fluent Bit для работы с Cloud Logging
Следующая
Настройка L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
Проект Яндекса
© 2025 ООО «Яндекс.Облако»