Как реализовать масштабирование приложений в Kubernetes-кластере?

«Как реализовать масштабирование приложений в Kubernetes-кластере?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Масштабирование в Kubernetes реализуется на нескольких уровнях, от автоматического увеличения подов до масштабирования самого кластера.

1. Горизонтальное масштабирование подов (HPA - Horizontal Pod Autoscaler): Это основной метод. HPA автоматически увеличивает или уменьшает количество реплик Deployment/StatefulSet на основе метрик (CPU, память, кастомные).

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-service
  minReplicas: 3
  maxReplicas: 15
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 65
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: 500
  behavior: # Настройка поведения масштабирования (K8s 1.18+)
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 50
        periodSeconds: 60

Ключевые практики для HPA:

  • Кастомные метрики: Использую Prometheus Adapter для масштабирования на основе бизнес-метрик (RPS, latency, очередь сообщений).
  • Правильные requests/limits: Без корректно заданных лимитов ресурсов для подов HPA не сможет корректно рассчитывать утилизацию.
  • Поведение масштабирования (behavior): Настраиваю scaleDown менее агрессивным, чем scaleUp, чтобы избежать "дребезга" подов при скачкообразной нагрузке.

2. Вертикальное масштабирование подов (VPA - Vertical Pod Autoscaler): VPA автоматически настраивает requests и limits для контейнеров на основе исторического потребления. Использую его осторожно, обычно в режиме Recommendation, так как для применения изменений часто требуется перезапуск пода.

3. Кластерное автомасштабирование (Cluster Autoscaler): Когда подам не хватает ресурсов в кластере, CA автоматически добавляет новые ноды (в облачных провайдерах) или вызывает масштабирование пула нод. Настраиваю его вместе с HPA.

4. Для stateful-нагрузок (базы данных, Kafka): Использую специализированные операторы (например, Zalando Postgres Operator, Strimzi для Kafka), которые умеют безопасно масштабировать stateful-приложения, управляя данными и репликацией.

Тестирование: Перед внедрением в production обязательно провожу нагрузочное тестирование (с помощью, например, k6 или locust), чтобы убедиться, что логика масштабирования срабатывает корректно и приложение выдерживает переходный период.