Краткое введение в Horizontal Pod Autoscaler (HPA) для дальнейшего изучения
На этом этапе вы познакомитесь с Horizontal Pod Autoscaler (HPA) — мощной функцией Kubernetes, которая автоматически масштабирует приложения на основе использования ресурсов. HPA позволяет определять правила масштабирования на основе таких показателей, как использование ЦП, потребление памяти или даже на основе пользовательских метрик.
Понимание HPA:
HPA автоматически регулирует количество запущенных реплик подов в Deployment, ReplicaSet или StatefulSet на основе наблюдаемого использования ЦП или памяти, а также на основе пользовательских метрик, предоставляемых вашими приложениями. Это обеспечивает автоматическое масштабирование вашего приложения для обработки меняющейся нагрузки трафика, улучшая производительность и доступность.
Включите надстройку metrics server в Minikube:
minikube addons enable metrics-server
Пример вывода:
* The 'metrics-server' addon is enabled
Metrics server предоставляет Kubernetes данными о использовании ваших ресурсов, и он необходим для работы HPA.
Создайте развертывание с запросами на ресурсы:
nano ~/project/k8s-manifests/hpa-example.yaml
Добавьте следующее содержимое:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
Примените развертывание:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
Объяснение конфигурации YAML:
- Этот YAML-файл определяет Deployment для PHP-приложения и соответствующий Service.
- Конфигурация Deployment очень похожа на конфигурацию для NGINX, за исключением:
name: php-apache: Имя развертывания и контейнера пода.
image: k8s.gcr.io/hpa-example: Docker-образ для контейнера.
resources: Этот раздел указывает требования к ресурсам для контейнера.
limits.cpu: 500m: Максимальное количество ЦП, которое контейнер может использовать.
requests.cpu: 200m: Гарантированное количество ЦП, назначенное контейнеру.
- Сервис представляет собой стандартную конфигурацию сервиса, которая делает развертывание доступным внутри кластера.
Создайте конфигурацию HPA:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
Добавьте следующий манифест HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Примените конфигурацию HPA:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
Объяснение конфигурации YAML:
apiVersion: autoscaling/v2: Указывает версию API для HorizontalPodAutoscaler.
kind: HorizontalPodAutoscaler: Указывает, что это объект HPA.
metadata: Содержит метаданные о HPA.
name: php-apache: Имя HPA.
spec: Содержит спецификацию HPA.
scaleTargetRef: Определяет целевой Deployment, который будет масштабироваться.
apiVersion: apps/v1: Версия API целевого ресурса.
kind: Deployment: Тип целевого ресурса, который представляет собой Deployment.
name: php-apache: Имя целевого Deployment для масштабирования.
minReplicas: 1: Минимальное количество реплик, которые должны оставаться запущенными.
maxReplicas: 10: Максимальное количество реплик, до которого можно масштабировать.
metrics: Определяет, как определять метрики масштабирования.
type: Resource: Масштабирование на основе метрики ресурса.
resource.name: cpu: Масштабирование на основе использования ЦП.
resource.target.type: Utilization: Масштабирование на основе процента запрошенного ЦП подом.
resource.target.averageUtilization: 50: Масштабирование происходит, когда среднее использование ЦП по всем подам превышает 50% запрошенного.
Проверьте конфигурацию HPA:
kubectl get hpa
Пример вывода:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
Симуляция нагрузки и наблюдение за автоматическим масштабированием в реальном времени
Для имитации высокой нагрузки и запуска автоматического масштабирования вы запустите генератор нагрузки в одном терминале и будете наблюдать за процессом масштабирования в отдельном терминале.
Сначала откройте терминал для генератора нагрузки:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
Не закрывайте терминал с генератором нагрузки. ОТКРОЙТЕ ДРУГОЙ ТЕРМИНАЛ, чтобы наблюдать за процессом масштабирования.
В новом терминале вы можете использовать несколько команд для наблюдения за автоматическим масштабированием в реальном времени:
- Следите за статусом HPA (обновляется каждые несколько секунд):
kubectl get hpa -w
- Наблюдайте за созданием подов при масштабировании HPA:
kubectl get pods -w
- Отслеживайте события, связанные с процессом масштабирования:
kubectl get events --sort-by='.lastTimestamp' -w
Вы можете запустить любую из этих команд, чтобы наблюдать за различными аспектами процесса автоматического масштабирования. Например, наблюдение за подами с флагом -w показывает, как поды создаются в реальном времени при масштабировании системы:
Пример вывода для kubectl get pods -w:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
Вы увидите, как HPA реагирует на увеличение нагрузки, увеличивая количество подов. Обновление метрик может занять минуту или более, чтобы отразить изменения:
Пример вывода для kubectl get hpa -w:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
После того, как вы закончите наблюдение, нажмите Ctrl+C, чтобы остановить команду наблюдения, а затем вернитесь в первый терминал и нажмите Ctrl+C, чтобы остановить генератор нагрузки.
Основные моменты о HPA:
- Автоматически масштабирует поды на основе использования ресурсов, что повышает устойчивость приложения.
- Может масштабироваться на основе использования ЦП, памяти или пользовательских метрик.
- Определяет минимальное и максимальное количество реплик, обеспечивая сбалансированное и эффективное масштабирование.
- HPA является важной частью для поддержания производительности и доступности приложения при различной нагрузке.
- Использование флага
-w (watch) с командами kubectl позволяет наблюдать за изменениями в кластере в реальном времени.