Горизонтальное масштабирование приложения в кластере
Managed Service for Kubernetes поддерживает несколько видов автоматического масштабирования. Из этой статьи вы узнаете, как настроить автоматическое масштабирование кластера с помощью комбинации Cluster Autoscaler и Horizontal Pod Autoscaler.
Если созданные ресурсы вам больше не нужны, удалите их.
Важно
В процессе работы общее количество узлов в группах может вырасти до шести. Убедитесь, что у вас достаточно ресурсов каталога для выполнения инструкций из этого руководства.
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте сервисные аккаунты для мастера и групп узлов и назначьте им роли.
- Сервисный аккаунт
sa-k8s-master
для управления кластером:k8s.clusters.agent
— для управления кластером Kubernetes.load-balancer.admin
— для управления сетевым балансировщиком нагрузки.
- Сервисный аккаунт
sa-k8s-nodes
для управления группой узлов:container-registry.images.puller
— для загрузки образов из Yandex Container Registry.
- Сервисный аккаунт
-
Создайте сеть с именем
k8s-network
для размещения кластера. При создании сети выберите опцию Создать подсети. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
- Имя —
k8s-symetric-key
. - Алгоритм шифрования —
AES-128
. - Период ротации, дни —
365 дней
.
- Имя —
-
Создайте кластер Managed Service for Kubernetes со следующими настройками:
- Сервисный аккаунт для ресурсов —
sa-k8s-master
. - Сервисный аккаунт для узлов —
sa-k8s-nodes
. - Ключ шифрования —
k8s-symetric-key
. - Релизный канал —
RAPID
. - Публичный адрес —
Автоматически
. - Тип мастера —
Региональный
. - Облачная сеть —
k8s-network
. - Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика и для доступа к API Kubernetes.
- Включить туннельный режим —
Включено
.
- Сервисный аккаунт для ресурсов —
-
Создайте две группы узлов в зонах доступности
ru-central1-a
иru-central1-b
со следующими настройками:- В блоке Масштабирование:
- Тип —
Автоматический
. - Минимальное кол-во узлов —
1
. - Максимальное кол-во узлов —
3
. - Начальное кол-во узлов —
1
.
- Тип —
- В блоке Сетевые настройки:
- Публичный адрес —
Автоматически
. - Группы безопасности — выберите созданные ранее группы безопасности, которые содержат правила для служебного трафика, для подключения к сервисам из интернета и для подключения к узлам по SSH.
- Расположение —
ru-central1-a
илиru-central1-b
.
- Публичный адрес —
- В блоке Масштабирование:
-
Установите kubectl
и настройте его на работу с созданным кластером.
Масштабирование от утилизации CPU
Из этого раздела вы узнаете, как настроить автоматическое масштабирование кластера в зависимости от нагрузки на CPU.
-
Создайте файл
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
-
Создайте объекты:
kubectl apply -f k8s-autoscale-CPU.yaml
-
В отдельном окне запустите отслеживание нагрузки на компоненты Kubernetes:
watch kubectl get pod,svc,hpa,nodes -o wide
-
Запустите процесс, имитирующий рабочую нагрузку:
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 увеличит количество узлов в группах. -
Завершите процесс имитации рабочей нагрузки. В течение нескольких минут количество узлов и подов вернется к начальному состоянию.
Масштабирование от количества запросов к приложению
Из этого раздела вы узнаете, как настроить автоматическое масштабирование кластера в зависимости от количества запросов к приложению (Requests Per Second, RPS).
Алгоритм работы
-
Ingress-контроллер передает в систему мониторинга Prometheus
информацию о количестве запросов к приложению. -
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])
-
На основании данных метрики средства автоматического масштабирования вносят изменения в количество подов и узлов.
Установка объектов
-
Клонируйте GitHub-репозиторий, который содержит актуальные конфигурационные файлы:
git clone https://github.com/yandex-cloud-examples/yc-mk8s-autoscaling-solution.git && \ cd yc-mk8s-autoscaling-solution
-
Добавьте репозитории 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
-
Установите Ingress-контроллер:
helm upgrade \ --install rps ingress-nginx/ingress-nginx \ --values values-ingr.yaml
-
Установите Prometheus:
helm upgrade \ --install prometheus prometheus-community/prometheus \ --values values-prom.yaml
-
Установите Prometheus-адаптер
, с помощью которого средства автоматического масштабирования будут получать метрики из Prometheus:helm upgrade \ --install prometheus-adapter prometheus-community/prometheus-adapter \ --values values-prom-ad.yaml
-
Создайте тестовое приложение, правило Ingress и Horizontal Pod Autoscaler:
kubectl apply -f k8s_autoscale-RPS.yaml
После создания объектов в Prometheus появится новая метрика
nginx_ingress_controller_requests_per_second
. Prometheus начнет считать эту метрику только после прохождения трафика через Ingress-контроллер. -
Выполните несколько тестовых запросов к 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 и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
-
Убедитесь, что метрика
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",
Проверка автоматического масштабирования
-
В отдельном окне запустите отслеживание нагрузки на компоненты Kubernetes:
watch kubectl get pod,svc,hpa,nodes -o wide
-
Запустите процесс, который имитирует рабочую нагрузку:
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 увеличит количество узлов в группах. -
Завершите процесс имитации рабочей нагрузки. В течение нескольких минут количество узлов и подов вернется к начальному состоянию.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Kubernetes.
- Если для доступа к кластеру или узлам использовались статические публичные IP-адреса, освободите и удалите их.