Вертикальное масштабирование приложения в кластере
Managed Service for Kubernetes поддерживает несколько видов автоматического масштабирования. Из этой статьи вы узнаете, как настроить автоматическое управление ресурсами пода с помощью Vertical Pod Autoscaler:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes. При создании задайте настройки:
- Используйте созданные ранее группы безопасности.
- Если вы планируете работать с кластером в пределах сети Yandex Cloud, выделять кластеру публичный IP-адрес не нужно. Для подключений извне предоставьте кластеру публичный адрес.
-
Создайте группу узлов. При создании задайте настройки:
- Используйте созданные ранее группы безопасности.
- Выделите публичный IP-адрес, чтобы предоставить группе узлов доступ в интернет и возможность скачивать Docker-образы и компоненты.
-
Установите kubectl
и настройте его на работу с созданным кластером.Если для кластера не предоставлен публичный адрес и
kubectl
настроен через внутренний адрес кластера, выполняйте командыkubectl
на ВМ Yandex Cloud, находящейся в одной сети с кластером. -
Установите Vertical Pod Autoscaler из репозитория
:cd /tmp && \ git clone https://github.com/kubernetes/autoscaler.git && \ cd autoscaler/vertical-pod-autoscaler/hack && \ ./vpa-up.sh
Создайте Vertical Pod Autoscaler и тестовое приложение
-
Создайте файл
app.yaml
, содержащий настройки тестового приложенияnginx
и балансировщика нагрузки:app.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
-
Создайте файл
vpa.yaml
, содержащий настройки Vertical Pod Autoscaler:vpa.yaml
--- apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: nginx spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: nginx updatePolicy: updateMode: "Auto" minReplicas: 1
-
Создайте объекты:
kubectl apply -f app.yaml && \ kubectl apply -f vpa.yaml
-
Убедитесь, что поды Vertical Pod Autoscaler и
nginx
перешли в состояниеRunning
:kubectl get pods -n kube-system | grep vpa && \ kubectl get pods | grep nginx
Результат:
vpa-admission-controller-58********-qmxtv 1/1 Running 0 44h vpa-recommender-67********-jqvgt 1/1 Running 0 44h vpa-updater-64********-xqsts 1/1 Running 0 44h nginx-6c********-62j7w 1/1 Running 0 42h
Проверьте работу Vertical Pod Autoscaler
Для проверки работы Vertical Pod Autoscaler будет создана имитация рабочей нагрузки на приложение nginx
.
-
Изучите рекомендации, которые предоставляет Vertical Pod Autoscaler до создания нагрузки:
kubectl describe vpa nginx
Обратите внимание на низкие значения
Cpu
в метрикахStatus.Recommendation.Container Recommendations
:Name: nginx Namespace: default Labels: <none> Annotations: <none> API Version: autoscaling.k8s.io/v1 Kind: VerticalPodAutoscaler ... Status: Conditions: Last Transition Time: 2022-03-18T08:02:04Z Status: True Type: RecommendationProvided Recommendation: Container Recommendations: Container Name: nginx Lower Bound: Cpu: 25m Memory: 262144k Target: Cpu: 25m Memory: 262144k Uncapped Target: Cpu: 25m Memory: 262144k Upper Bound: Cpu: 25m Memory: 262144k
-
Убедитесь, что Vertical Pod Autoscaler управляет ресурсами подов приложения
nginx
:kubectl get pod <имя_пода_nginx> --output yaml
Результат:
apiVersion: v1 kind: Pod metadata: annotations: vpaObservedContainers: nginx vpaUpdates: 'Pod resources updated by nginx: container 0: cpu request, memory request, cpu limit, memory limit' ... spec: containers: ... name: nginx resources: limits: cpu: 50m memory: 500000Ki requests: cpu: 25m memory: 262144k
-
В отдельном окне запустите процесс, имитирующий рабочую нагрузку:
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 и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
-
Через несколько минут изучите рекомендации, которые предоставляет Vertical Pod Autoscaler после создания нагрузки:
kubectl describe vpa nginx
Vertical Pod Autoscaler выделил дополнительные ресурсы подам при повышении нагрузки. Обратите внимание на повышение значений
Cpu
в метрикахStatus.Recommendation.Container Recommendations
:Name: nginx Namespace: default Labels: <none> Annotations: <none> API Version: autoscaling.k8s.io/v1 Kind: VerticalPodAutoscaler ... Status: Conditions: Last Transition Time: 2022-03-18T08:02:04Z Status: True Type: RecommendationProvided Recommendation: Container Recommendations: Container Name: nginx Lower Bound: Cpu: 25m Memory: 262144k Target: Cpu: 410m Memory: 262144k Uncapped Target: Cpu: 410m Memory: 262144k Upper Bound: Cpu: 28897m Memory: 1431232100
-
Завершите процесс имитации рабочей нагрузки. В течение нескольких минут значения метрик
Status.Recommendation.Container Recommendations
вернутся к первоначальным.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Kubernetes.
- Если для доступа к кластеру или узлам использовались статические публичные IP-адреса, освободите и удалите их.