Перейти к содержимому

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

Вы можете развернуть несколько механизмов автоматического масштабирования в кластере Managed Kubernetes:

Перед развертыванием изучите рекомендации по планированию автоматического масштабирования, а также ограничения по совместимости для Vertical Pod Autoscaler.

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

  • Веб-консоль
  • MWS CLI
  • Terraform
  • API

Укажите параметры Cluster Autoscaler при создании или изменении группы узлов:

  1. В блоке Масштабирование включите опцию Автомасштабирование.

  2. Укажите настройки автоматического масштабирования:

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

Metrics Server необходим для работы Horizontal Pod Autoscaler и Vertical Pod Autoscaler. Этот компонент собирает данные о потреблении ресурсов (vCPU и RAM) с узлов и подов кластера, и передает их в системы автоматического масштабирования.

Чтобы установить Metrics Server:

  1. Скачайте установочный манифест:

    bash
    wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
  2. Откройте файл components.yaml и удалите символ # перед строкой --kubelet-insecure-tls. Это безопасно: Metrics Server находится в том же кластере, что и системы автоматического масштабирования, и не требует использования TLS-сертификатов для работы.

  3. Создайте Metrics Server:

    bash
    kubectl apply -f components.yaml
  4. Убедитесь, что сервер метрик создан и работает:

    bash
    kubectl get apiservice | grep metrics
  5. Проверьте, что сервер поставляет метрики:

    bash
    kubectl top pods
  1. Установите Metrics Server, если он еще не развернут в вашем кластере.

  2. Создайте Horizontal Pod Autoscaler для вашего приложения:

    bash
    kubectl autoscale deployment/<имя приложения> --cpu-percent=20 --min=1 --max=5

    Здесь:

    • --cpu-percent — желаемая нагрузка пода на vCPU, в процентах;
    • --min — минимальное количество подов;
    • --max — максимальное количество подов.
  3. Убедитесь, что Horizontal Pod Autoscaler для вашего приложения успешно создан:

    bash
    kubectl describe hpa/<имя приложения>

Когда нагрузка на под превысит значение cpu-percent, Horizontal Pod Autoscaler создаст новые поды для обеспечения бесперебойной работы приложения. Например, если cpu-percent имеет значение 20, а нагрузка на под составляет 60%, будет создано еще два дополнительных пода.

  1. Установите Metrics Server, если он еще не развернут в вашем кластере.

  2. Установите Vertical Pod Autoscaler из GitHub-репозитория:

    bash
    git clone https://github.com/kubernetes/autoscaler.git && \
    cd autoscaler/vertical-pod-autoscaler/hack && \
    ./vpa-up.sh
  3. Убедитесь, что поды Vertical Pod Autoscaler подняты и работают:

    bash
    kubectl get pods -n kube-system | awk '/vpa/'
  4. Создайте манифест Vertical Pod Autoscaler для вашего приложения:

    bash
    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
    name: <имя приложения>-vpa
    spec:
    targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: <имя приложения>
    updatePolicy:
    updateMode: "<режим работы VPA>"

    Настройка updateMode может принимать несколько значений:

    • Off — Vertical Pod Autoscaler предоставляет рекомендации по управлению ресурсами, но не изменяет их.
    • Recreate (по умолчанию) — Vertical Pod Autoscaler применяет рекомендации по ресурсам при создании и обновлении подов. Существующие поды пересоздаются методом вытеснения (Eviction), при этом учитываются правила PodDisruptionBudget.
    • InPlaceOrRecreate — Vertical Pod Autoscaler пытается обновить ресурсы существующих подов «на лету» (без перезапуска). Если это невозможно, он пересоздает под с помощью метода Recreate.
    • Initial — Vertical Pod Autoscaler назначает запросы ресурсов только при создании пода и больше никогда их не меняет.

    Подробнее о режимах работы Vertical Pod Autoscaler см. в документации Kubernetes.

  5. Создайте Vertical Pod Autoscaler:

    bash
    kubectl apply -f <имя файла с манифестом VPA>
  6. Посмотрите рекомендации, которые Vertical Pod Autoscaler предоставляет для вашего приложения:

    bash
    kubectl describe vpa <имя приложения>

    В блоке Container Recommendations:

    • Lower Bound — минимально допустимый объем запрошенных ресурсов (requests), при котором сохраняется работоспособность приложения;
    • Target — оптимальный объем запрошенных ресурсов, который Vertical Pod Autoscaler рекомендует для приложения с учетом текущей нагрузки;
    • Uncapped Target — рекомендация по объему запрошенных ресурсов, рассчитанная без учета ограничивающих политик;
    • Upper Bound — максимальный разумный объем запрошенных ресурсов для приложения.

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

Заголовок раздела «Проверить работу автоматического масштабирования»

Вы можете проверить работу Horizontal Pod Autoscaler и Vertical Pod Autoscaler с помощью нагрузочного тестирования. Для этого вы можете использовать как простое тестовое приложение, так и ваше собственное — если оно поддерживает работу с HTTP-запросами.

  • Тестовое приложение
  • Собственное приложение
  1. Создайте файл с манифестом для тестового приложения и сервиса:

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: simple-app
    labels:
    app: simple-app
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: simple-app
    template:
    metadata:
    labels:
    app: simple-app
    spec:
    containers:
    - name: nginx-container
    image: nginx:latest
    imagePullPolicy: Always
    ports:
    - containerPort: 80
    resources:
    requests:
    cpu: "100m"
    memory: "128Mi"
    limits:
    cpu: "200m"
    memory: "256Mi"
  2. Разверните приложение:

    bash
    kubectl apply -f <файл с манифестом тестового приложения>
  3. Убедитесь, что под и сервис тестового приложения работают:

    bash
    kubectl get pods,svc | grep simple-app
  4. Создайте Horizontal Pod Autoscaler или Vertical Pod Autoscaler для приложения simple-app.

  5. В отдельном окне запустите эмуляцию нагрузки:

    bash
    kubectl run -it --rm load-generator \
    --image=alpine/curl \
    --restart=Never \
    -- sh -c "while true; do curl -s http://simple-app-service > /dev/null; done"

    Этот скрипт будет бесконечно выполнять cURL-запрос к приложению simple-app, что приведет к росту нагрузки. Если нагрузка недостаточна для срабатывания автоматического масштабирования, запустите эмуляцию нагрузки еще в нескольких окнах.

  6. Наблюдайте за изменениями в масштабировании подов:

    • Для Horizontal Pod Autoscaler:

      bash
      kubectl get hpa -w

      Поле REPLICAS отражает текущее и новое количество подов, обслуживающих приложение. Вывод команды обновляется динамически с ростом или уменьшением количества подов.

    • Для Vertical Pod Autoscaler:

      bash
      kubectl describe vpa simple-app-vpa

      Информация в Container Recommendations отображает текущее и рекомендуемое состояние для объема запрошенных ресурсов (requests).

  7. Чтобы снять нагрузку с сервиса и остановить эмуляцию, нажмите CTRL + C.

  8. Удалите созданные механизмы автоматического масштабирования.

  9. Удалите тестовое приложение:

    bash
    kubectl delete -f <файл с манифестом тестового приложения>

Отключить автоматическое масштабирование

Заголовок раздела «Отключить автоматическое масштабирование»

Чтобы отключить Cluster Autoscaler, укажите фиксированное значение для количества узлов в группе при изменении группы узлов.

  • Веб-консоль
  • MWS CLI
  • Terraform
  • API
  1. В блоке Масштабирование выключите опцию Автомасштабирование.
  2. Укажите нужное число количество узлов.
  3. Примените изменения.
  1. Узнайте имя HPA, которое нужно удалить:

    bash
    kubectl get hpa -w
  2. Выполните команду:

    bash
    kubectl delete hpa/<имя HPA>

Чтобы удалить Vertical Pod Autoscaler, выполните команду:

bash
kubectl delete -f <имя файла с манифестом VPA>