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. Горизонтальное масштабирование приложения в кластере

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

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

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

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

Важно

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

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

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

    По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --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. Создайте группы безопасности для мастера и узлов:

    • sg-k8s — для мастера и группы узлов.
    • k8s-public-services — для обеспечения публичного доступа к сервисам из интернета.
    • k8s-master-whitelist — для доступа к API 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.
    • Группы безопасности — sg-k8s, k8s-master-whitelist.
    • Включить туннельный режим — включено.
  8. Создайте две группы узлов в зонах доступности ru-central1-a и ru-central1-b со следующими настройками:

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

Масштабирование от утилизации 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: k8s.gcr.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
    

Совет

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

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

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

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

Из этого раздела вы узнаете, как настроить автоматическое масштабирование кластера в зависимости от количества запросов к приложению (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/yc-architect-solution-library.git && \
      cd yc-architect-solution-library/demos/yc-k8s-autoscaling
    
  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 -H "Host: nginx.example.com" http://$URL
    
  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 -H "Host: nginx.example.com" http://$URL; done
    

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

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

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

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

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

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

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Масштабирование от утилизации CPU
  • Масштабирование от количества запросов к приложению
  • Алгоритм работы
  • Установка объектов
  • Проверка автоматического масштабирования
  • Удалите созданные ресурсы