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
  • История изменений
  • Обучающие курсы

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

  • Необходимые платные ресурсы
  • Перед началом работы
  • Установите Ingress-контроллер Application Load Balancer
  • Создайте тестовое приложение
  • Создайте профиль безопасности
  • Создайте ресурс Ingress
  • Создайте DNS-запись для домена
  • Проверьте результат
  • Удалите созданные ресурсы
  1. Практические руководства
  2. Использование продуктов Cloud Marketplace
  3. Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer

Создание L7-балансировщика с профилем безопасности Smart Web Security через Ingress-контроллер Application Load Balancer

Статья создана
Yandex Cloud
Обновлена 26 марта 2025 г.
  • Необходимые платные ресурсы
  • Перед началом работы
  • Установите Ingress-контроллер Application Load Balancer
  • Создайте тестовое приложение
  • Создайте профиль безопасности
  • Создайте ресурс Ingress
    • Создайте DNS-запись для домена
  • Проверьте результат
  • Удалите созданные ресурсы

Приложения в кластере Yandex Managed Service for Kubernetes можно защитить от DDoS-атак и ботов с помощью сервиса Yandex Smart Web Security. Для этого опубликуйте приложения через ресурс Ingress, которому назначен профиль безопасности Smart Web Security и который использует Ingress-контроллер Application Load Balancer.

Опираясь на ресурс Ingress будет развернут L7-балансировщик с профилем безопасности, подключенным к виртуальным хостам балансировщика. Бэкенды приложений, которые указаны в ресурсе Ingress, будут защищены с помощью Smart Web Security: все поступающие к бэкендам HTTP-запросы будут обработаны в соответствии с правилами в профиле безопасности.

Чтобы через Ingress создать L7-балансировщик с подключенным профилем безопасности:

  1. Установите Ingress-контроллер Application Load Balancer.
  2. Создайте тестовое приложение.
  3. Создайте профиль безопасности.
  4. Создайте ресурс Ingress.
  5. Создайте DNS-запись для домена.
  6. Проверьте результат.

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

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

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

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

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

  1. Подготовьте необходимую инфраструктуру:

    Вручную
    Terraform
    1. Создайте сервисный аккаунт, который будет использоваться Ingress-контроллером Application Load Balancer.

      Назначьте аккаунту следующие роли на каталог, в котором будет создан кластер:

      • alb.editor,

      • vpc.publicAdmin,

      • compute.viewer,

      • smart-web-security.editor.

        Важно

        Эта роль необходима для корректной интеграции L7-балансировщика Application Load Balancer с профилем безопасности.

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

      Назначьте аккаунту следующие роли на каталог, в котором будет создан кластер:

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

      Также настройте группы безопасности, необходимые для работы Application Load Balancer.

      Важно

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

    4. Создайте кластер. При создании кластера выберите:

      • Cозданный ранее сервисный аккаунт. Используйте его для ресурсов и для узлов.
      • Созданные ранее группы безопасности, которые должны быть назначены кластеру.
      • Опцию, которая назначает кластеру публичный адрес. Такой адрес нужен, чтобы можно было использовать Kubernetes API из интернета.
    5. Создайте группу узлов в кластере. При создании группы узлов выберите:

      • Созданные ранее группы безопасности, которые должны быть назначены группе узлов.
      • Опцию, которая назначает узлам публичный адрес. Такой адрес нужен, чтобы можно было скачивать образы из интернета.
    1. Если у вас еще нет Terraform, установите его.

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

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

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

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

      • Сеть.

      • Подсеть.

      • Кластер Kubernetes.

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

      • Сервисный аккаунт, необходимый для работы Ingress-контроллера Application Load Balancer.

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

        Часть правил необходима для работы Application Load Balancer.

        Важно

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

      • Профиль безопасности Smart Web Security с правилом Smart Protection и простым правилом для проверки работы профиля, которое будет разрешать трафик только с определенного IP-адреса.

        Базовое правило по умолчанию не указывается в манифесте и создается автоматически.

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

      • Идентификатор каталога.
      • Версию Kubernetes для кластера и групп узлов Kubernetes.
      • CIDR кластера Kubernetes, CIDR сервисов.
      • Имя сервисного аккаунта кластера Managed Service for Kubernetes.
      • Имя сервисного аккаунта Application Load Balancer.
      • Имя профиля безопасности Smart Web Security.
      • IP-адрес, трафик с которого будет разрешен.
    7. Проверьте корректность файлов конфигурации Terraform с помощью команды:

      terraform validate
      

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

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

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

        terraform plan
        

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

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

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

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

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

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

    Примечание

    Если вы развернули инфраструктуру с помощью Terraform, выполнять шаг с Созданием профиля безопасности не нужно.

  2. Убедитесь, что у вас есть домен и вы можете управлять ресурсными записями в зоне DNS для этого домена. Тестовое приложение будут доступно через Ingress на поддомене этого домена.

    Если у вас еще нет домена, зарегистрируйте домен у любого регистратора доменных имен. Чтобы управлять ресурсными записями домена с помощью Yandex Cloud DNS, создайте публичную зону DNS и делегируйте домен.

    Примечание

    В качестве примера используется домен example.com и поддомен demo.example.com.

    Используйте ваши домены при прохождении этого практического руководства.

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

Установите Ingress-контроллер Application Load BalancerУстановите Ingress-контроллер Application Load Balancer

  1. Установите Ingress-контроллер Application Load Balancer в пространство имен yc-alb.

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

    Использование отдельного пространства имен yc-alb позволит отделить ресурсы контроллера от ресурсов тестового приложения и Ingress.

  2. Убедитесь, что контроллер был успешно установлен:

    kubectl logs deployment.apps/yc-alb-ingress-controller -n yc-alb
    

    В логах должны содержаться сообщения об успешном старте Ingress-контроллера.

    Пример части результата выполнения команды
    ...    INFO    Starting EventSource    {"controller": "ingressgroup", ...}
    ...    INFO    Starting Controller     {"controller": "ingressgroup"}
    ...    INFO    Starting EventSource    {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...}
    ...    INFO    Starting Controller     {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...}
    ...    INFO    Starting EventSource    {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...}
    ...    INFO    Starting Controller     {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...}
    
    ...
    
    ...    INFO    Starting workers        {"controller": "ingressgroup", ...}
    ...    INFO    Starting workers        {"controller": "grpcbackendgroup", "controllerGroup": "alb.yc.io", ...}
    ...    INFO    Starting workers        {"controller": "httpbackendgroup", "controllerGroup": "alb.yc.io", ...}
    

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

Создайте приложение и соответствующий ему сервис, который будет опубликован (exposed) с помощью Ingress:

  1. Создайте манифест demo-app1.yaml для развертывания приложения:

    demo-app1.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: demo-app1
      labels:
        tutorial: sws
    data:
      nginx.conf: |
        worker_processes auto;
        events {
        }
        http {
          server {
            listen 80 ;
            location = /_healthz {
              add_header Content-Type text/plain;
              return 200 'ok';
            }
            location / {
              add_header Content-Type text/plain;
              return 200 'Index';
            }
            location = /app1 {
              add_header Content-Type text/plain;
              return 200 'This is APP#1';
            }
          }
        }
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-app1
      labels:
        app: demo-app1
        tutorial: sws
        version: v1
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: demo-app1
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      template:
        metadata:
          labels:
            app: demo-app1
            version: v1
        spec:
          terminationGracePeriodSeconds: 5
          volumes:
            - name: demo-app1
              configMap:
                name: demo-app1
          containers:
            - name: demo-app1
              image: nginx:latest
              ports:
                - name: http
                  containerPort: 80
              livenessProbe:
                httpGet:
                  path: /_healthz
                  port: 80
                initialDelaySeconds: 3
                timeoutSeconds: 2
                failureThreshold: 2
              volumeMounts:
                - name: demo-app1
                  mountPath: /etc/nginx
                  readOnly: true
              resources:
                limits:
                  cpu: 250m
                  memory: 128Mi
                requests:
                  cpu: 100m
                  memory: 64Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-app1
      labels:
        tutorial: sws
    spec:
      selector:
        app: demo-app1
      type: NodePort
      ports:
        - name: http
          port: 80
          targetPort: 80
          protocol: TCP
    
  2. Разверните приложение:

    kubectl apply -f demo-app1.yaml
    

    Будут созданы объекты ConfigMap, Deployment и Service для приложения demo-app1.

  3. Убедитесь, что все объекты были созданы успешно:

    kubectl get configmap,deployment,svc -l tutorial=sws
    
    Пример результата выполнения команды
    NAME                  DATA   AGE
    configmap/demo-app1   1      ...
    
    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/demo-app1   2/2     2            2           ...
    
    NAME                TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)      AGE
    service/demo-app1   NodePort   ...          <none>        80:.../TCP   ...
    

Создайте профиль безопасностиСоздайте профиль безопасности

Создайте профиль безопасности с простым правилом, чтобы работу профиля было легко проверить. Правила в профиле будут разрешать трафик только с определенного IP-адреса.

Создайте профиль безопасности:

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

  2. В списке сервисов выберите Smart Web Security.

  3. Нажмите кнопку Создать профиль и выберите По преднастроенному шаблону.

    Профиль будет содержать несколько преднастроенных правил безопасности:

    • Правило Smart Protection с полной защитой для всего трафика. Это правило является приоритетным по отношению к базовому правилу по умолчанию.

    • Базовое правило по умолчанию, которое запрещает весь трафик, не попавший под более приоритетные правила.

      Совет

      Создание преднастроенного профиля с полной защитой Smart Protection является предпочтительным. Рекомендуем использовать его, чтобы обеспечить наибольшую безопасность защищаемого ресурса.

  4. Задайте данные профиля:

    • Имя — имя профиля, например test-sp1.

    • Действие для базового правила по умолчанию — действие, которое должно выполнять базовое правило.

      Оставьте выбранным действие Запретить, чтобы базовое правило запрещало весь трафик.

  5. Добавьте правило безопасности:

    1. Нажмите кнопку Добавить правило.

    2. Укажите основные настройки правила:

      • Имя — имя правила, например test-rule1.

      • Приоритет — укажите такое значение, чтобы правило имело приоритет над преднастроенными правилами. Например, можно указать значение 999800.

        Примечание

        Чем меньше значение параметра, тем больший приоритет у правила. Приоритеты преднастроенных правил:

        • базовое правило по умолчанию — 1000000;
        • правило Smart Protection с полной защитой — 999900.
      • Тип правила — выберите Базовое.

      • Действие — выберите Разрешить.

    3. В блоке Условия настройте условия так, чтобы разрешался трафик только с определенного IP-адреса:

      1. Выберите область действия правила на трафик При условии.
      2. Выберите условие IP.
      3. Выберите условие на IP Совпадает или принадлежит диапазону.
      4. Укажите публичный IP-адрес, например 203.0.113.200.
    4. Нажмите кнопку Добавить.

    В списке правил безопасности появится созданное правило.

  6. Нажмите кнопку Создать.

В списке профилей безопасности появится созданный профиль. Запишите идентификатор этого профиля безопасности — он потребуется позднее.

Создайте ресурс IngressСоздайте ресурс Ingress

В этом ресурсе Ingress будут описаны параметры балансировщика Application Load Balancer. Ingress-контроллер, установленный ранее, развернет балансировщик с указанными параметрами после создания ресурса Ingress.

Согласно правилам Ingress, трафик к виртуальному хосту demo.example.com по пути /app1 будет направляться к бэкенду service/demo-app1. Созданный ранее профиль безопасности будет использоваться, чтобы защитить этот бэкенд.

Чтобы создать ресурс Ingress:

  1. Создайте файл demo-ingress.yaml с описанием ресурса Ingress:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-ingress
      annotations:
        ingress.alb.yc.io/subnets: "<список_идентификаторов_подсетей>"
        ingress.alb.yc.io/security-groups: "<идентификатор_группы_безопасности>"
        ingress.alb.yc.io/external-ipv4-address: "auto"
        ingress.alb.yc.io/group-name: "demo-sws"
        ingress.alb.yc.io/security-profile-id: "<идентификатор_профиля_безопасности>"
    spec:
      rules:
        - host: demo.example.com
          http:
            paths:
              - path: /app1
                pathType: Exact
                backend:
                  service:
                    name: demo-app1
                    port:
                      number: 80
    

    Где:

    • ingress.alb.yc.io/subnets — список идентификаторов подсетей, в которых будет расположен балансировщик.

      Если вы создали инфраструктуру с помощью Terraform, используйте идентификатор подсети, которая имеет имя subnet-a.

    • ingress.alb.yc.io/security-groups — идентификатор группы, созданной ранее для балансировщика.

      Если вы создали инфраструктуру с помощью Terraform, укажите идентификатор группы, которая имеет имя alb-traffic.

    • ingress.alb.yc.io/security-profile-id — идентификатор профиля безопасности, созданного ранее в сервисе Smart Web Security.

      Примечание

      Профиль безопасности будет применен только к виртуальным хостам для ресурса Ingress, в котором задана аннотация. Для ресурса Ingress, который описан выше, профиль будет применен к единственному виртуальному хосту demo.example.com.

      Этот ресурс Ingress — единственный в группе Ingress demo-sws. Профиль безопасности не будет применен к виртуальным хостам других ресурсов Ingress, если такие ресурсы будут позднее добавлены в группу.

Подробнее об аннотациях см. в разделе Поля и аннотации ресурса Ingress.

  • Создайте ресурс Ingress:

    kubectl apply -f demo-ingress.yaml
    

    Ingress-контроллер Application Load Balancer запустит процесс создания целевых групп, групп бэкендов, HTTP-роутеров и балансировщика нагрузки.

  • Периодически проверяйте статус ресурса Ingress, пока в столбце ADDRESS не появится IP-адрес балансировщика:

    kubectl get ingress demo-ingress
    

    Это будет означать, что балансировщик создан успешно и может принимать трафик.

    Пример результата выполнения команды
    NAME             CLASS    HOSTS              ADDRESS         PORTS   AGE
    demo-ingress     <none>   demo.example.com   <IP_адрес>      80      ...
    
  • Создайте DNS-запись для доменаСоздайте DNS-запись для домена

    1. Создайте A-запись для домена demo.example.com в зоне example.com. В значении укажите IP-адрес балансировщика, который был создан ранее.

    2. Дождитесь, пока завершится распространение DNS-записей (DNS propagation).

      Проверить, что DNS-записи распространились, можно либо с помощью онлайн-сервисов, либо с помощью запросов вручную к разным DNS-серверам:

      nslookup -type=a demo.example.com <IP_адрес_DNS_сервера>
      

    Проверьте результатПроверьте результат

    Запросы к приложению, развернутому в кластере Kubernetes, проходят через балансировщик нагрузки Application Load Balancer. Виртуальные хосты, на которые направляются запросы, защищены с помощью профиля безопасности. Этот профиль был настроен так, чтобы разрешать трафик только с определенного IP-адреса (например, с 203.0.113.200).

    Проверьте, что балансировщик работает корректно с учетом настроенного профиля безопасности:

    1. Проверьте с хоста с разрешенным IP-адресом 203.0.113.200, что выполняется маршрутизация трафика по правилу, заданному в ресурсе Ingress:

      curl http://demo.example.com/app1
      

      Ожидаемый результат:

      This is demo-app1
      
    2. Проверьте с хоста с другим IP-адресом, который не входит в список разрешенных (например 203.0.113.100), что маршрутизация трафика не выполняется:

      curl http://demo.example.com/app1
      

      Ожидаемый результат: ответ от балансировщика с кодом HTTP 403 Forbidden и сообщением об ограничении доступа к ресурсу.

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

    • Сервисному аккаунту для Ingress-контроллера должны быть назначены необходимые роли, в том числе для работы с сервисом Smart Web Security.
    • Группы безопасности для кластера Managed Service for Kubernetes и его групп узлов должны быть настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
    • Профиль безопасности должен быть настроен корректно, чтобы разрешать трафик с нужного адреса.

    Совет

    После подтверждения работоспособности профиля добавьте нужные правила, если это необходимо.

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

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

    1. Удалите созданный ресурс Ingress:

      kubectl delete ingress demo-ingress
      

      Будет удален балансировщик нагрузки, а также HTTP-роутер, связанный с балансировщиком.

      Профиль безопасности Smart Web Security будет отключен от виртуальных хостов, указанных в ресурсе Ingress.

    2. Удалите кластер Managed Service for Kubernetes и связанную с ним инфраструктуру:

      Вручную
      Terraform

      Удалите кластер Managed Service for Kubernetes.

      При необходимости удалите сервисные аккаунты и группы безопасности, созданные перед началом работы.

      1. В терминале перейдите в директорию с планом инфраструктуры.

        Важно

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

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

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

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

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

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

    Предыдущая
    Настройка логирования для L7-балансировщика Application Load Balancer с помощью Ingress-контроллера
    Следующая
    Проверка состояния приложений в кластере Managed Service for Kubernetes с помощью L7-балансировщика Application Load Balancer
    Проект Яндекса
    © 2025 ООО «Яндекс.Облако»