Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
По этому руководству вы развернете автомасштабируемый gRPC
Чтобы развернуть сервис и осуществить нагрузочное тестирование:
- Подготовьте облако к работе.
- Подготовьте цель тестирования.
- Подготовьте домен.
- Установите Ingress.
- Настройте горизонтальное автомасштабирование подов.
- Проведите нагрузочное тестирование gRPC-сервиса.
По окончании тестирования удалите созданные ресурсы, если они больше не нужны.
Подготовьте облако к работе
-
Зарегистрируйте доменное имя для вашего сайта.
-
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Также настройте группы безопасности, необходимые для работы Application Load Balancer.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Подготовьте кластер Managed Service for Kubernetes к работе.
-
Установите Ingress-контроллер:
- Создайте сервисный аккаунт для Ingress-контроллера.
- Установите Ingress-контроллер Application Load Balancer для Managed Service for Kubernetes.
-
(Опционально) Установите 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-сервис.
-
Сохраните следующую спецификацию для создания приложения в файле
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
-
Создайте приложение:
kubectl apply -f grpc-server.yaml
Подготовьте домен
-
Создайте публичную зону DNS и делегируйте домен.
Примечание
Для домена example.com зона должна называться
example.com.
(с точкой в конце). -
Добавьте сертификат от
Let's Encrypt®
. -
Пройдите процедуры проверки прав на домен.
Установите Ingress
-
Создайте манифест ресурса 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.
-
-
Создайте ресурс
Ingress
:kubectl apply -f ingress.yaml
-
Проверьте, что ресурс создан и получил публичный 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-*
. -
Если вы не устанавливали ExternalDNS c плагином для Cloud DNS, создайте в Cloud DNS A-запись, указывающую на публичный адрес балансировщика. При использовании ExternalDNS c плагином для Cloud DNS запись создастся автоматически.
Настройте горизонтальное автомасштабирование подов
-
Создайте файл
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
-
Создайте Horizontal Pod Autoscaler:
kubectl apply -f hpa.yaml
Проведите нагрузочное тестирование gRPC-сервиса
-
Создайте сервисный аккаунт:
- Создайте сервисный аккаунт
sa-loadtest
в каталоге, где будет размещаться агент, с которого будет подаваться нагрузка. - Назначьте роли сервисному аккаунту:
loadtesting.generatorClient
— позволяет запускать агент, тест на агенте и загружать результаты в хранилище.compute.admin
— позволяет управлять виртуальной машиной в Yandex Compute Cloud.vpc.user
— позволяет подключаться к сетевым ресурсам Yandex Virtual Private Cloud и использовать их.
- Создайте сервисный аккаунт
-
Создайте и настройте NAT-шлюз в подсети, где размещается цель тестирования и будет размещен агент. Это обеспечит доступ агента к сервису Yandex Load Testing.
-
Создайте агент тестирования.
-
Подготовьте файл с тестовыми данными
ammo.json
:{"tag": "/Add", "call": "api.Adder.Add", "payload": {"x": 21, "y": 12}}
-
Подготовьте файл конфигурации
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
Где
target
— название вашего сайта и порт (для HTTPS: 443). -
- В блоке Прикрепленные файлы нажмите Выбрать файлы и выберите сохраненный ранее файл
ammo.json
. - В блоке настроек Настройки теста:
- В поле Способ настройки выберите
Конфигурационный файл
. - В поле Файл конфигурации нажмите Выбрать файлы и загрузите подготовленный ранее файл
load.yaml
.
- В поле Способ настройки выберите
- В блоке Прикрепленные файлы нажмите Выбрать файлы и выберите сохраненный ранее файл
-
Наблюдайте за прохождением теста:
- В консоли управления
выберите сервис Managed Service for Kubernetes. - Выберите ваш тестовый кластер Managed Service for Kubernetes.
- Перейдите на вкладку Рабочая нагрузка.
- Наблюдайте за изменением количества подов приложения по мере увеличения и уменьшения нагрузки.
- По завершении теста в консоли управления
выберите сервис Application Load Balancer. - Выберите созданный L7-балансировщик.
- Перейдите на вкладку Мониторинг.
- Просмотрите графики нагрузки за время работы теста.
- В консоли управления
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать:
- Если вы настраивали CNAME-записи в Cloud DNS, удалите зону DNS.
- Удалите L7-балансировщик.
- Удалите кластер Managed Service for Kubernetes.
- Удалите таблицу маршрутизации.
- Удалите NAT-шлюз.