← Назад к вопросам
Как реализуется масштабирование в Kubernetes?
2.0 Middle🔥 181 комментариев
#Docker, Kubernetes и DevOps
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Масштабирование в Kubernetes
Kubernetes предоставляет несколько встроенных механизмов для автоматического масштабирования приложений в зависимости от нагрузки и потребления ресурсов.
Виды масштабирования
1. Horizontal Pod Autoscaler (HPA) — горизонтальное масштабирование
Основной механизм для изменения количества подов:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app # Масштабируем этот Deployment
minReplicas: 1 # Минимум подов
maxReplicas: 10 # Максимум подов
metrics:
- type: Resource
resource:
name: cpu # Метрика для масштабирования
target:
type: Utilization
averageUtilization: 70 # Целевое использование CPU в %
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80 # Целевое использование памяти в %
behavior:
scaleDown:
stabilizationWindowSeconds: 300 # Не уменьшаем быстро
policies:
- type: Percent
value: 50 # Уменьшаем на 50% максимум
periodSeconds: 15
scaleUp:
stabilizationWindowSeconds: 0 # Быстро масштабируем вверх
policies:
- type: Percent
value: 100 # Удваиваем подов
periodSeconds: 15
- type: Pods
value: 4 # Или добавляем по 4 пода
periodSeconds: 15
selectPolicy: Max # Берём самую агрессивную политику
Как это работает:
- HPA регулярно опрашивает метрики подов
- Вычисляет текущее использование ресурсов
- Сравнивает с целевым значением:
desired_replicas = current_replicas * (current_metric / target_metric) - Изменяет количество реплик в Deployment
- Kubernetes создаёт/удаляет поды
Пример вычисления:
Текущее использование CPU: 140%
Целевое использование CPU: 70%
Текущие реплики: 2
Желаемые реплики = 2 * (140 / 70) = 4 пода
2. Vertical Pod Autoscaler (VPA) — вертикальное масштабирование
Автоматически изменяет CPU/Memory запросы и лимиты подов:
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto" # Auto, Recreate или Off
resourcePolicy:
containerPolicies:
- containerName: app
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 2
memory: 1Gi
controlledResources: ["cpu", "memory"]
Как это работает:
- VPA анализирует реальное использование ресурсов подами
- Рекомендует оптимальные CPU/Memory
- При
updateMode: Autoпересоздаёт поды с новыми параметрами - Помогает избежать излишних ресурсов или дефицита
3. Cluster Autoscaler — масштабирование нод
Добавляет/удаляет узлы в кластере:
# Типичная конфигурация в облачных провайдерах
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-autoscaler-status
data:
nodes.max: "10"
nodes.min: "1"
scale-down-enabled: "true"
skip-nodes-with-system-pods: "true"
Как это работает:
- Cluster Autoscaler видит, что есть поды в состоянии
Pending(не влезают на ноды) - Автоматически добавляет новую ноду в кластер
- Scheduler размещает ожидающие поды на новой ноде
- Когда ноды недогружены, удаляет их
Метрики для HPA
Resource metrics (встроенные)
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Требует работающего Metrics Server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Custom metrics
Для пользовательских метрик (из Prometheus, CloudWatch и т.д.):
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: "1k" # 1000 запросов в секунду на под
External metrics
Метрики из внешних систем (очередь сообщений, API провайдера):
metrics:
- type: External
external:
metric:
name: queue_depth
selector:
matchLabels:
queue: orders
target:
type: AverageValue
averageValue: "30" # 30 сообщений на под
Примеры:
# Посмотреть доступные метрики
kubectl get --all-namespaces APIService | grep metrics
# Посмотреть текущие метрики подов
kubectl top pods
kubectl top nodes
Архитектура масштабирования
┌─────────────────────────────────────────┐
│ Метрики (CPU, Memory, Custom) │
└────────────────────┬────────────────────┘
│
┌────────────▼──────────────┐
│ HPA Controller │
│ (проверяет каждые 15s) │
└────────────┬──────────────┘
│
┌───────────▼──────────────┐
│ Решение о масштабировании
│ Обновляет Deployment │
└───────────┬──────────────┘
│
┌───────────▼──────────────┐
│ ReplicaSet создаёт │
│ или удаляет поды │
└────────────────────────┘
Практический пример: Java приложение
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-app
spec:
replicas: 2
selector:
matchLabels:
app: java-app
template:
metadata:
labels:
app: java-app
spec:
containers:
- name: java-app
image: myregistry/java-app:latest
resources:
requests:
memory: "256Mi"
cpu: "250m" # 250 millicores
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: java-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: java-app
minReplicas: 2
maxReplicas: 8
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Ключевые моменты
-
Requests vs Limits
- Requests — гарантированные ресурсы, используются для расчёта HPA
- Limits — максимум, при превышении контейнер убивается
-
Stabilization Window
- Предотвращает флаппинг (быстрые колебания в количестве подов)
- scaleDown имеет большее окно (обычно 5 минут)
- scaleUp имеет меньшее окно (быстрый отклик)
-
Grace Period
- HPA не масштабирует в течение 3 минут после последнего масштабирования
- Дает приложению время для стабилизации
-
Стоимость в облаке
- Постоянное добавление/удаление нод может увеличить затраты
- Настраивай параметры масштабирования аккуратно