Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Практические руководства
  • Веб-сервис
  • Интернет-магазины
  • Хранение и восстановление данных
  • Тестовая среда
    • Все руководства
    • Тестирование приложений с помощью GitLab
    • Создание тестовых ВМ через GitLab CI
    • Высокопроизводительные вычисления на прерываемых ВМ
    • Эмуляция множества IoT-устройств
    • Нагрузочное тестирование gRPC-сервиса
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • HTTPS-тест с постоянной нагрузкой с помощью Phantom
    • HTTPS-тест со ступенчатой нагрузкой с помощью Pandora
    • Нагрузочное тестирование с нескольких агентов
    • Миграция результатов нагрузочного тестирования из OverLoad
    • Запуск внешних агентов для нагрузочного тестирования
  • Управление инфраструктурой
  • Построение Data Platform
  • Продукты Microsoft в Yandex Cloud
  • Сетевая инфраструктура
  • Визуализация и анализ данных
  • Интернет вещей
  • Бессерверные технологии
  1. Тестовая среда
  2. Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием

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

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

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

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

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

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

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

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

  2. Если для вашего облака включены группы безопасности, создайте группу с правилами, описанными в разделе Настройка групп безопасности для инструментов Application Load Balancer для Managed Service for Kubernetes.

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

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

  4. Установите Metrics Provider.

  5. Установите Ingress-контроллер:

    1. Создайте сервисный аккаунт для Ingress-контроллера.

    2. Установите Ingress-контроллер Application Load Balancer для Managed Service for Kubernetes.

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

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

  • плата за использование мастера и исходящий трафик 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

  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. Создайте в Cloud DNS A-запись, указывающую на публичный адрес балансировщика.

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

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

    ### HPA
    apiVersion: autoscaling/v2beta2
    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-сервиса

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

    1. Создайте сервисный аккаунт sa-loadtest в каталоге, где будет размещаться агент, с которого будет подаваться нагрузка.
    2. Назначьте роли сервисному аккаунту:
      • loadtesting.generatorClient — позволяет запускать агент, тест на агенте и загружать результаты в хранилище.
      • compute.admin — позволяет управлять виртуальной машиной в Compute Cloud.
      • vpc.user — позволяет подключаться к сетевым ресурсам Virtual Private Cloud и использовать их.
  2. Создайте и настройте NAT-шлюз в подсети, где размещается цель тестирования и будет размещен агент. Это обеспечит доступ агента к сервису 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: <your-site-name>:<port>
            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
    uploader:
      enabled: true
      package: yandextank.plugins.DataUploader
      job_name: '[pandora][grpc][tls]'
      job_dsc: ''
      ver: ''
      api_address: loadtesting.api.cloud.yandex.net:443
    

    Где:

    • target — название вашего сайта и порт (для HTTPS: 443).
  6. Запустите тест:

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

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

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

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

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

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

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Подготовьте облако к работе
  • Необходимые платные ресурсы
  • Подготовьте цель тестирования
  • Подготовьте домен
  • Установите Ingress
  • Настройте горизонтальное автомасштабирование подов
  • Проведите нагрузочное тестирование gRPC-сервиса
  • Как удалить созданные ресурсы