Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Application Load Balancer
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Целевые группы
      • Создать целевую группу
      • Изменить целевую группу
      • Удалить целевую группу
    • Группы бэкендов
      • Создать группу бэкендов
      • Изменить группу бэкендов
      • Удалить группу бэкендов
    • HTTP-роутеры
      • Создать HTTP-роутер для HTTP-трафика
      • Создать HTTP-роутер для gRPC-трафика
      • Изменить HTTP-роутер
      • Удалить HTTP-роутер
    • L7-балансировщики
      • Создать L7-балансировщик
      • Изменить L7-балансировщик
      • Посмотреть статистику L7-балансировщика
      • Посмотреть логи L7-балансировщика
      • Получить идентификатор лог-группы L7-балансировщика
      • Остановить и запустить L7-балансировщик
      • Удалить L7-балансировщик
    • Инструменты для Managed Service for Kubernetes
      • Установить Ingress-контроллер
      • Установить Gateway API
      • Создать или изменить ресурсы по конфигурации
  • Практические руководства
    • Все практические руководства
    • Организация виртуального хостинга
    • Создание балансировщика с защитой от DDoS
    • Интеграция L7-балансировщика с CDN и Object Storage
    • Сине-зеленое и канареечное развертывание версий сервиса
    • Терминирование TLS-соединений
    • Запись логов балансировщика в PostgreSQL
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
  • Концепции
    • Обзор
    • Балансировщики нагрузки
    • HTTP-роутеры
    • Группы бэкендов
    • Целевые группы
    • Квоты и лимиты
  • Инструменты для Managed Service for Kubernetes
    • Ingress-контроллер
      • Обзор
      • Принципы работы
    • Gateway API
    • Необходимые настройки
      • Группы безопасности
      • Сервисный аккаунт
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • BackendGroupService
      • HttpRouterService
      • LoadBalancerService
      • TargetGroupService
      • VirtualHostService
      • OperationService
    • REST (англ.)
      • Overview
      • BackendGroup
        • Overview
        • addBackend
        • create
        • delete
        • get
        • list
        • listOperations
        • removeBackend
        • update
        • updateBackend
      • HttpRouter
        • Overview
        • create
        • delete
        • get
        • list
        • listOperations
        • update
      • LoadBalancer
        • Overview
        • addListener
        • addSniMatch
        • create
        • delete
        • get
        • getTargetStates
        • list
        • listOperations
        • removeListener
        • removeSniMatch
        • start
        • stop
        • update
        • updateListener
        • updateSniMatch
      • TargetGroup
        • Overview
        • addTargets
        • create
        • delete
        • get
        • list
        • listOperations
        • removeTargets
        • update
      • VirtualHost
        • Overview
        • create
        • delete
        • get
        • list
        • removeRoute
        • update
        • updateRoute
  • Справочники инструментов для Managed Service for Kubernetes
    • Обзор
    • Ingress-контроллер
      • Ingress
      • HttpBackendGroup
    • Gateway API
      • Gateway
      • HTTPRoute
    • Service
  • Справочник логов
  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/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-сервиса
  • Как удалить созданные ресурсы