← Назад к вопросам

Как реализуется масштабирование в 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    # Берём самую агрессивную политику

Как это работает:

  1. HPA регулярно опрашивает метрики подов
  2. Вычисляет текущее использование ресурсов
  3. Сравнивает с целевым значением: desired_replicas = current_replicas * (current_metric / target_metric)
  4. Изменяет количество реплик в Deployment
  5. 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"]

Как это работает:

  1. VPA анализирует реальное использование ресурсов подами
  2. Рекомендует оптимальные CPU/Memory
  3. При updateMode: Auto пересоздаёт поды с новыми параметрами
  4. Помогает избежать излишних ресурсов или дефицита

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"

Как это работает:

  1. Cluster Autoscaler видит, что есть поды в состоянии Pending (не влезают на ноды)
  2. Автоматически добавляет новую ноду в кластер
  3. Scheduler размещает ожидающие поды на новой ноде
  4. Когда ноды недогружены, удаляет их

Метрики для 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

Ключевые моменты

  1. Requests vs Limits

    • Requests — гарантированные ресурсы, используются для расчёта HPA
    • Limits — максимум, при превышении контейнер убивается
  2. Stabilization Window

    • Предотвращает флаппинг (быстрые колебания в количестве подов)
    • scaleDown имеет большее окно (обычно 5 минут)
    • scaleUp имеет меньшее окно (быстрый отклик)
  3. Grace Period

    • HPA не масштабирует в течение 3 минут после последнего масштабирования
    • Дает приложению время для стабилизации
  4. Стоимость в облаке

    • Постоянное добавление/удаление нод может увеличить затраты
    • Настраивай параметры масштабирования аккуратно
Как реализуется масштабирование в Kubernetes? | PrepBro