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-сервиса с масштабированием

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

  • Необходимые платные ресурсы
  • Перед началом работы
  • Масштабирование от утилизации CPU
  • Масштабирование от количества запросов к приложению
  • Алгоритм работы
  • Установка объектов
  • Проверка автоматического масштабирования
  • Удалите созданные ресурсы
  1. Контейнерная инфраструктура
  2. Managed Service for Kubernetes
  3. Настройка и тестирование масштабирования
  4. Горизонтальное масштабирование приложения в кластере

Горизонтальное масштабирование приложения в кластере Yandex Managed Service for Kubernetes

Статья создана
Yandex Cloud
Улучшена
mmerihsesh
Обновлена 21 апреля 2025 г.
  • Необходимые платные ресурсы
  • Перед началом работы
  • Масштабирование от утилизации CPU
  • Масштабирование от количества запросов к приложению
    • Алгоритм работы
    • Установка объектов
    • Проверка автоматического масштабирования
  • Удалите созданные ресурсы

Managed Service for Kubernetes поддерживает несколько видов автоматического масштабирования. Из этой статьи вы узнаете, как настроить автоматическое масштабирование кластера с помощью комбинации Cluster Autoscaler и Horizontal Pod Autoscaler.

  • Масштабирование от утилизации CPU.
  • Масштабирование от количества запросов к приложению.

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

Важно

В процессе работы общее количество узлов в группах может вырасти до шести. Убедитесь, что у вас достаточно ресурсов каталога для выполнения инструкций из этого руководства.

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

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

  • Плата за кластер Managed Service for Kubernetes: использование мастера и исходящий трафик (см. тарифы Managed Service for Kubernetes).
  • Плата за узлы кластера (ВМ): использование вычислительных ресурсов, операционной системы и хранилища (см. тарифы Compute Cloud).
  • Плата за публичный IP-адрес для узлов кластера (см. тарифы Virtual Private Cloud).
  • Плата за сервис Key Management Service: количество активных версий ключа (в статусах Active и Scheduled For Destruction) и выполненных криптографических операций (см. тарифы Key Management Service).

Перед началом работыПеред началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.

    По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.

  2. Установите менеджер пакетов Helm.

  3. Создайте сервисные аккаунты для мастера и групп узлов и назначьте им роли.

    • Сервисный аккаунт sa-k8s-master для управления кластером:
      • k8s.clusters.agent — для управления кластером Kubernetes.
      • load-balancer.admin — для управления сетевым балансировщиком нагрузки.
    • Сервисный аккаунт sa-k8s-nodes для управления группой узлов:
      • container-registry.images.puller — для загрузки образов из Yandex Container Registry.
  4. Создайте сеть с именем k8s-network для размещения кластера. При создании сети выберите опцию Создать подсети.

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

    Важно

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

  6. Создайте ключ шифрования:

    • Имя — k8s-symetric-key.
    • Алгоритм шифрования — AES-128.
    • Период ротации, дни — 365 дней.
  7. Создайте кластер Managed Service for Kubernetes со следующими настройками:

    • Сервисный аккаунт для ресурсов — sa-k8s-master.
    • Сервисный аккаунт для узлов — sa-k8s-nodes.
    • Ключ шифрования — k8s-symetric-key.
    • Релизный канал — RAPID.
    • Публичный адрес — Автоматически.
    • Тип мастера — Высокодоступный.
    • Облачная сеть — k8s-network.
    • Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика и для доступа к API Kubernetes.
    • Включить туннельный режим — Включено.
  8. Создайте две группы узлов в зонах доступности ru-central1-a и ru-central1-b со следующими настройками:

    • В блоке Масштабирование:
      • Тип — Автоматический.
      • Минимальное кол-во узлов — 1.
      • Максимальное кол-во узлов — 3.
      • Начальное кол-во узлов — 1.
    • В блоке Сетевые настройки:
      • Публичный адрес — Автоматически.
      • Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика, для подключения к сервисам из интернета и для подключения к узлам по SSH.
      • Расположение — ru-central1-a или ru-central1-b.
  9. Установите kubectl и настройте его на работу с созданным кластером.

Масштабирование от утилизации CPUМасштабирование от утилизации CPU

Из этого раздела вы узнаете, как настроить автоматическое масштабирование кластера в зависимости от нагрузки на CPU.

  1. Создайте файл k8s-autoscale-CPU.yaml, который содержит настройки тестового приложения, балансировщика нагрузки и Horizontal Pod Autoscaler:

    k8s-autoscale-CPU.yaml
    ---
    ### Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: registry.k8s.io/hpa-example
              resources:
                requests:
                  memory: "256Mi"
                  cpu: "500m"
                limits:
                  memory: "500Mi"
                  cpu: "1"
    ---
    ### Service
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: LoadBalancer
    ---
    ### HPA
    apiVersion: autoscaling/v1
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      minReplicas: 1
      maxReplicas: 10
      targetCPUUtilizationPercentage: 20
    
  2. Создайте объекты:

    kubectl apply -f k8s-autoscale-CPU.yaml
    
  3. В отдельном окне запустите отслеживание нагрузки на компоненты Kubernetes:

    watch kubectl get pod,svc,hpa,nodes -o wide
    
  4. Запустите процесс, имитирующий рабочую нагрузку:

    URL=$(kubectl get service nginx -o json \
      | jq -r '.status.loadBalancer.ingress[0].ip') && \
      while true; do wget -q -O- http://$URL; done
    

    Совет

    Чтобы увеличить нагрузку и ускорить выполнение сценария, запустите несколько процессов в отдельных окнах.

    Примечание

    Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.

    В течение нескольких минут Horizontal Pod Autoscaler увеличит количество подов на узлах из-за роста потребления CPU. Когда текущих ресурсов кластера будет недостаточно, чтобы удовлетворить значение requests, Cluster Autoscaler увеличит количество узлов в группах.

  5. Завершите процесс имитации рабочей нагрузки. В течение нескольких минут количество узлов и подов вернется к начальному состоянию.

Масштабирование от количества запросов к приложениюМасштабирование от количества запросов к приложению

Из этого раздела вы узнаете, как настроить автоматическое масштабирование кластера в зависимости от количества запросов к приложению (Requests Per Second, RPS).

Алгоритм работыАлгоритм работы

  1. Ingress-контроллер передает в систему мониторинга Prometheus информацию о количестве запросов к приложению.

  2. Prometheus создает и публикует метрику nginx_ingress_controller_requests_per_second — количество запросов к приложению за секунду.

    Чтобы создать такую метрику, в конфигурационный файл Prometheus values-prom.yaml добавлено правило:

    rules:
      groups:
        - name: Ingress
          rules:
            - record: nginx_ingress_controller_requests_per_second
              expr: rate(nginx_ingress_controller_requests[2m])
    
  3. На основании данных метрики средства автоматического масштабирования вносят изменения в количество подов и узлов.

Установка объектовУстановка объектов

  1. Клонируйте GitHub-репозиторий, который содержит актуальные конфигурационные файлы:

    git clone https://github.com/yandex-cloud-examples/yc-mk8s-autoscaling-solution.git && \
    cd yc-mk8s-autoscaling-solution
    
  2. Добавьте репозитории Helm, которые содержат Ingress-контроллер и систему мониторинга Prometheus:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx && \
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts && \
    helm repo update
    
  3. Установите Ingress-контроллер:

    helm upgrade \
      --install rps ingress-nginx/ingress-nginx \
      --values values-ingr.yaml
    
  4. Установите Prometheus:

    helm upgrade \
      --install prometheus prometheus-community/prometheus \
      --values values-prom.yaml
    
  5. Установите Prometheus-адаптер, с помощью которого средства автоматического масштабирования будут получать метрики из Prometheus:

    helm upgrade \
      --install prometheus-adapter prometheus-community/prometheus-adapter \
      --values values-prom-ad.yaml
    
  6. Создайте тестовое приложение, правило Ingress и Horizontal Pod Autoscaler:

    kubectl apply -f k8s_autoscale-RPS.yaml
    

    После создания объектов в Prometheus появится новая метрика nginx_ingress_controller_requests_per_second. Prometheus начнет считать эту метрику только после прохождения трафика через Ingress-контроллер.

  7. Выполните несколько тестовых запросов к Ingress-контроллеру:

    URL=$(kubectl get service rps-ingress-nginx-controller -o json \
      | jq -r '.status.loadBalancer.ingress[0].ip') && \
      curl --header "Host: nginx.example.com" http://$URL
    

    Примечание

    Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.

  8. Убедитесь, что метрика nginx_ingress_controller_requests_per_second доступна:

    kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq . | \
      grep ingresses.networking.k8s.io/nginx_ingress_controller_requests_per_second
    

    Результат:

    "name": "ingresses.networking.k8s.io/nginx_ingress_controller_requests_per_second",
    

Проверка автоматического масштабированияПроверка автоматического масштабирования

  1. В отдельном окне запустите отслеживание нагрузки на компоненты Kubernetes:

    watch kubectl get pod,svc,hpa,nodes -o wide
    
  2. Запустите процесс, который имитирует рабочую нагрузку:

    URL=$(kubectl get service rps-ingress-nginx-controller -o json \
      | jq -r '.status.loadBalancer.ingress[0].ip') && \
      while true; do curl --header "Host: nginx.example.com" http://$URL; done
    

    Примечание

    Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.

    В течение нескольких минут Horizontal Pod Autoscaler увеличит количество подов на узлах из-за роста количества запросов к приложению. Когда текущих ресурсов кластера будет недостаточно, чтобы удовлетворить значение requests, Cluster Autoscaler увеличит количество узлов в группах.

  3. Завершите процесс имитации рабочей нагрузки. В течение нескольких минут количество узлов и подов вернется к начальному состоянию.

Удалите созданные ресурсыУдалите созданные ресурсы

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

  1. Удалите кластер Kubernetes.
  2. Если для доступа к кластеру или узлам использовались статические публичные IP-адреса, освободите и удалите их.

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

Предыдущая
Шифрование секретов
Следующая
Вертикальное масштабирование приложения в кластере
Проект Яндекса
© 2025 ООО «Яндекс.Облако»