Вертикальное масштабирование приложения в кластере
Managed Service for Kubernetes поддерживает несколько видов автоматического масштабирования. Из этой статьи вы узнаете, как настроить автоматическое управление ресурсами пода с помощью Vertical Pod Autoscaler:
Перед началом работы
-
Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
. -
Создайте группы безопасности для мастера Kubernetes и узлов:
sg-k8s
— для мастера и группы узлов.k8s-public-services
— для публичного доступа к сервисам из интернета.k8s-master-whitelist
— для доступа к API Kubernetes.
-
Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации. При создании кластера и группы узлов:
- Используйте созданные ранее группы безопасности.
- Выберите автоматический тип назначения публичного адреса.
-
Установите kubectl и настройте его на работу с созданным кластером.
Создайте 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: 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
-
Создайте файл
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"
-
Создайте объекты:
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-58cf99779c-qmxtv 1/1 Running 0 44h vpa-recommender-678f4f6d4b-jqvgt 1/1 Running 0 44h vpa-updater-64ddd67787-xqsts 1/1 Running 0 44h nginx-6c5cbfc6d9-62j7w 1/1 Running 0 42h nginx-6c5cbfc6d9-6t4nz 1/1 Running 0 42h
Примечание
Для корректной работы Vertical Pod Autoscaler требуется как минимум два пода
nginx
.
Проверьте работу 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
Совет
Чтобы увеличить нагрузку и ускорить выполнение сценария, запустите несколько процессов в отдельных окнах.
-
Через несколько минут изучите рекомендации, которые предоставляет 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-адреса, освободите и удалите их.