Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Практические руководства
    • Все руководства
    • Настройка подключения к Managed Service for PostgreSQL из контейнера Serverless Containers
    • Создать ВМ с Container Optimized Image
    • Создать ВМ с Container Optimized Image и дополнительным томом для Docker-контейнера
    • Создать группу ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Создать группу ВМ с Container Optimized Image
    • Создать ВМ с Container Optimized Image и несколькими Docker-контейнерами
    • Изменить ВМ с Container Optimized Image
    • Настройка вывода информации из Docker-контейнера в серийный порт
      • Создание нового Kubernetes-проекта
      • Создание кластера Kubernetes без доступа в интернет
      • Запуск рабочих нагрузок с GPU
      • Использование групп узлов c GPU без предустановленных драйверов
      • Установка Time-Slicing GPUs
      • Миграция ресурсов в другую зону доступности
      • Шифрование секретов
        • Горизонтальное масштабирование приложения в кластере
        • Вертикальное масштабирование приложения в кластере
        • Изменение параметров сервера метрик (Metrics Server)
        • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием

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

  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Подготовьте цель тестирования
  • Подготовьте домен
  • Установите Ingress
  • Настройте горизонтальное автомасштабирование подов
  • Проведите нагрузочное тестирование gRPC-сервиса
  • Как удалить созданные ресурсы
  1. Контейнерная инфраструктура
  2. Managed Service for Kubernetes
  3. Настройка и тестирование масштабирования
  4. Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием

Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием в Yandex Managed Service for Kubernetes

Статья создана
Yandex Cloud
Обновлена 28 апреля 2025 г.
  • Подготовьте облако к работе
    • Необходимые платные ресурсы
  • Подготовьте цель тестирования
  • Подготовьте домен
  • Установите Ingress
  • Настройте горизонтальное автомасштабирование подов
  • Проведите нагрузочное тестирование gRPC-сервиса
  • Как удалить созданные ресурсы

По этому руководству вы развернете автомасштабируемый gRPC-сервис в кластере Kubernetes с помощью Ingress-контроллера Yandex Application Load Balancer и проведете нагрузочное тестирование сервиса.

Чтобы развернуть сервис и осуществить нагрузочное тестирование:

  1. Подготовьте облако к работе.
  2. Подготовьте цель тестирования.
  3. Подготовьте домен.
  4. Установите Ingress.
  5. Настройте горизонтальное автомасштабирование подов.
  6. Проведите нагрузочное тестирование gRPC-сервиса.

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

Подготовьте облако к работеПодготовьте облако к работе

  1. Зарегистрируйте доменное имя для вашего сайта.

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

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

    Важно

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

  3. Подготовьте кластер Managed Service for Kubernetes к работе.

  4. Установите Metrics Provider в пространство имен kube-public.

  5. Установите ALB Ingress Controller.

  6. (Опционально) Установите ExternalDNS c плагином для Yandex Cloud DNS, чтобы автоматически создать DNS-запись в Yandex Cloud DNS при создании Ingress-контроллера.

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

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

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

Подготовьте цель тестированияПодготовьте цель тестирования

В этой инструкции в качестве цели тестирования будет использоваться gRPC-сервис.

  1. Сохраните следующую спецификацию для создания приложения в файле grpc-server.yaml:

    ### Deployment.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: grpc-app
      labels:
        app: grpc-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: grpc-app
      template:
        metadata:
          name: grpc-app
          labels:
            app: grpc-app
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: app
                        operator: In
                        values:
                          - grpc-app
                  topologyKey: "kubernetes.io/hostname"
    
          containers:
            - name: grpc-app
              image: cr.yandex/crp6a9o7k9q5rrtt2hoq/grpc-test-server
              resources:
                requests:
                  memory: "256Mi"
                  cpu: "500m"
                limits:
                  memory: "500Mi"
                  cpu: "1"
    
    ### Service.
    apiVersion: v1
    kind: Service
    metadata:
      name: grpc-service
    spec:
      selector:
        app: grpc-app
      type: NodePort
      ports:
        - name: grpc
          port: 80
          targetPort: 8080
          protocol: TCP
          nodePort: 30085
    
  2. Создайте приложение:

    kubectl apply -f grpc-server.yaml
    

Подготовьте доменПодготовьте домен

  1. Создайте публичную зону DNS и делегируйте домен.

    Примечание

    Для домена example.com зона должна называться example.com. (с точкой в конце).

  2. Добавьте сертификат от Let's Encrypt®.

  3. Пройдите процедуры проверки прав на домен.

Установите IngressУстановите Ingress

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

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: grpc-demo
      annotations:
        ingress.alb.yc.io/subnets: <идентификаторы_подсетей>
        ingress.alb.yc.io/external-ipv4-address: auto 
        ingress.alb.yc.io/protocol: grpc
        ingress.alb.yc.io/security-groups: <идентификатор_группы_безопасности>
    spec:
      tls:
        - hosts:
            - <имя_сайта>
          secretName: yc-certmgr-cert-id-<идентификатор_сертификата> 
      rules:
        - host: <имя_сайта>
          http:
            paths:
              - pathType: Prefix
                path: "/api.Adder/Add"
                backend:
                  service:
                    name: grpc-service
                    port:
                      number: 80
              - pathType: Prefix
                path: "/grpc.reflection.v1alpha.ServerReflection"
                backend:
                  service:
                    name: grpc-service
                    port:
                      number: 80
    

    Где:

    • ingress.alb.yc.io/subnets — список идентификаторов подсетей через запятую.

    • ingress.alb.yc.io/external-ipv4-address — предоставление публичного доступа к Application Load Balancer из интернета.

      При значении auto Ingress-контроллер получит публичный IP-адрес автоматически. При удалении Ingress-контроллера IP-адрес также будет удален из облака.

    • ingress.alb.yc.io/security-groups — идентификатор группы безопасности, созданной при подготовке облака к работе. Если в вашем облаке не включены группы безопасности, удалите эту аннотацию.

    • secretName — указание на TLS-сертификат из Yandex Certificate Manager в формате yc-certmgr-cert-id-<идентификатор_сертификата>.

    • hosts, host — доменное имя, которому соответствует TLS-сертификат.

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

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

    kubectl apply -f ingress.yaml
    
  3. Проверьте, что ресурс создан и получил публичный IP-адрес:

    kubectl get ingress grpc-demo
    

    Результат:

    NAME       CLASS   HOSTS        ADDRESS     PORTS    AGE
    grpc-demo  <none>  <имя_сайта>  <IP-адрес>  80, 443  2m
    

    Где:

    • <имя_сайта> — доменное имя, которому соответствует TLS-сертификат.
    • <IP-адрес> — IP-адрес сайта.

    В столбце ADDRESS должен появиться IP-адрес. В противном случае балансировщик не создался или создался некорректно — проверьте логи пода yc-alb-ingress-controller-*.

  4. Если вы не устанавливали ExternalDNS c плагином для Cloud DNS, создайте в Cloud DNS A-запись, указывающую на публичный адрес балансировщика. При использовании ExternalDNS c плагином для Cloud DNS запись создастся автоматически.

Настройте горизонтальное автомасштабирование подовНастройте горизонтальное автомасштабирование подов

  1. Создайте файл hpa.yaml со спецификацией Horizontal Pod Autoscaler:

    ### HPA.
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: grpc-app
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: grpc-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
        - type: External
          external:
          metric:
            name: "load_balancer.requests_count_per_second"
            selector:
              matchLabels:
                service: "application-load-balancer"
                load_balancer: <идентификатор_балансировщика>
                code: "total"
                backend_group: <идентификаторы_группы_бэкендов>
          target:
            type: AverageValue
            averageValue: 2
    

    Где:

    • load_balancer — идентификатор L7-балансировщика.
    • backend_group — идентификатор группы бэкендов.

    Найти их можно в консоли Application Load Balancer или выполнив команды:

    yc alb load-balancer list
    yc alb backend-group list
    
  2. Создайте Horizontal Pod Autoscaler:

    kubectl apply -f hpa.yaml
    

Проведите нагрузочное тестирование gRPC-сервисаПроведите нагрузочное тестирование gRPC-сервиса

  1. Создайте сервисный аккаунт:

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

    2. Назначьте роли сервисному аккаунту:

      • loadtesting.generatorClient — позволяет запускать агент, тест на агенте и загружать результаты в хранилище.
      • compute.admin — позволяет управлять виртуальной машиной в Yandex Compute Cloud.
      • vpc.user — позволяет подключаться к сетевым ресурсам Yandex Virtual Private Cloud и использовать их.
  2. Создайте и настройте NAT-шлюз в подсети, где размещается цель тестирования и будет размещен агент. Это обеспечит доступ агента к сервису Yandex Load Testing.

  3. Создайте агент тестирования.

  4. Подготовьте файл с тестовыми данными ammo.json:

    {"tag": "/Add", "call": "api.Adder.Add", "payload": {"x": 21, "y": 12}}
    
  5. Подготовьте файл конфигурации load.yaml:

    phantom:
      enabled: false
      package: yandextank.plugins.Phantom
    pandora:
      enabled: true
      package: yandextank.plugins.Pandora
      config_content:
        pools:
        - id: Gun
          gun:
            type: grpc
            target: <название_вашего_сайта>:<порт>
            tls: true
          ammo:
            type: grpc/json
            file: ammo.json
          result:
            type: phout
            destination: ./phout.log
          rps:
            - duration: 60s
              type: line
              from: 1
              to: 10
          startup:
            - type: once
              times: 1000
        log:
          level: debug
        monitoring:
          expvar:
          enabled: true
          port: 1234
    autostop:
        enabled: true
        package: yandextank.plugins.Autostop
        autostop:
          - limit (5m)
    uploader:
      enabled: true
      package: yandextank.plugins.DataUploader
      job_name: '[pandora][grpc][tls]'
      job_dsc: ''
      ver: ''
      api_address: loadtesting.api.cloud.yandex.net:443
    
  6. Запустите тест:

    • В блоке Прикрепленные файлы нажмите Выбрать файлы и выберите сохраненный ранее файл ammo.json.

    • В блоке настроек Настройки теста:

      • В поле Способ настройки выберите Конфигурационный файл.
      • В поле Файл конфигурации нажмите Выбрать файлы и загрузите подготовленный ранее файл load.yaml.
  7. Наблюдайте за прохождением теста:

    1. В консоли управления выберите сервис Managed Service for Kubernetes.
    2. Выберите ваш тестовый кластер Managed Service for Kubernetes.
    3. Перейдите на вкладку Рабочая нагрузка.
    4. Наблюдайте за изменением количества подов приложения по мере увеличения и уменьшения нагрузки.
    5. По завершении теста в консоли управления выберите сервис Application Load Balancer.
    6. Выберите созданный L7-балансировщик.
    7. Перейдите на вкладку Мониторинг.
    8. Просмотрите графики нагрузки за время работы теста.

Как удалить созданные ресурсыКак удалить созданные ресурсы

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

  1. Если вы настраивали CNAME-записи в Cloud DNS, удалите зону DNS.
  2. Удалите L7-балансировщик.
  3. Удалите кластер Managed Service for Kubernetes.
  4. Удалите таблицу маршрутизации.
  5. Удалите NAT-шлюз.

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

Предыдущая
Изменение параметров сервера метрик (Metrics Server)
Следующая
Установка Ingress-контроллера NGINX с Let's Encrypt®
Проект Яндекса
© 2025 ООО «Яндекс.Облако»