Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Подключение к узлу по SSH
    • Обновление Kubernetes
    • Настройка автомасштабирования
    • Подключение к кластеру
      • Обзор способов подключения
      • Настройка групп безопасности
      • Создание статического файла конфигурации
    • Установка приложений из Cloud Marketplace
      • Основы работы с Cloud Marketplace
      • Установка Argo CD
      • Установка Container Storage Interface для S3
      • Установка Crossplane
      • Установка External Secrets Operator
      • Установка Falco
      • Установка Filebeat
      • Установка Fluent Bit
      • Установка Gateway API
      • Установка GitLab Agent
      • Установка GitLab Runner
      • Установка HashiCorp Vault
      • Установка Ingress-контроллера Application Load Balancer
      • Установка Jaeger
      • Установка Kyverno & Kyverno Policies
      • Установка Loki
      • Установка Metrics Provider
      • Установка NodeLocal DNS
      • Установка Policy Reporter
      • Установка Thumbor
    • Сетевые сценарии
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
    • Работа с постоянными томами
      • Динамическая подготовка тома
      • Статическая подготовка тома
      • Управление классами хранилищ
      • Увеличение размера тома для подов
      • Увеличение размера тома для контроллера StatefulSet
      • Подключение тома в блочном режиме
      • Интеграция с Object Storage
    • Управление кластером Kubernetes
      • Получение информации о кластере Kubernetes
      • Создание кластера Kubernetes
      • Изменение кластера Kubernetes
      • Создание пространства имен в кластере Kubernetes
      • Удаление кластера Kubernetes
    • Управление группой узлов
      • Информация об имеющихся группах узлов
      • Создание группы узлов
      • Подключение к узлу по SSH
      • Настройка автомасштабирования
      • Изменение группы узлов
      • Управление метками узлов кластера Kubernetes
      • Удаление группы узлов
    • Подключение внешних узлов к кластеру
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Релизные каналы и обновления
    • Шифрование секретов
    • Использование объектов API Kubernetes
      • Том
      • Сервис
    • Группа узлов
      • Автоматическое масштабирование группы узлов
      • Расселение подов с узла
      • Динамическое резервирование ресурсов для узла
      • Группы узлов с GPU
    • Сеть в Managed Service for Kubernetes
    • Внешние узлы кластера
    • Сетевые настройки и политики кластера
    • Автоматическое масштабирование
    • Квоты и лимиты
    • Рекомендации по использованию Managed Service for Kubernetes
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • ClusterService
      • NodeGroupService
      • VersionService
      • OperationService
    • REST (англ.)
      • Overview
      • Cluster
        • Overview
        • create
        • delete
        • get
        • list
        • listNodeGroups
        • listNodes
        • listOperations
        • start
        • stop
        • update
      • NodeGroup
        • Overview
        • create
        • delete
        • get
        • list
        • listNodes
        • listOperations
        • update
      • Version
        • Overview
        • list
  • Вопросы и ответы
    • Общие вопросы
    • Хранилище данных
    • Настройка и обновление
    • Автоматическое масштабирование
    • Ресурсы
    • Логи
    • Все вопросы на одной странице
  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-сервиса
  • Как удалить созданные ресурсы