Autoscailing

🚀 Как Kubernetes управляет масштабированием?

В Kubernetes есть 3 основных механизма масштабирования:

Тип масштабирования Как работает? Когда использовать?
Ручное (Manual Scaling) Указываем количество реплик replicas: N Когда нагрузка стабильная
Горизонтальное (HPA – Horizontal Pod Autoscaler) Автоматически увеличивает/уменьшает кол-во подов Когда нагрузка на CPU/RAM меняется
Вертикальное (VPA – Vertical Pod Autoscaler) Автоматически меняет requests/limits CPU/RAM Если поды потребляют слишком много ресурсов
Автоскейлинг нод (Cluster Autoscaler) Добавляет/удаляет worker-ноды при нехватке ресурсов Когда поды не помещаются на существующих нодах

1️⃣ Ручное масштабирование (Manual Scaling)

Можно задать фиксированное число реплик:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3  # Количество реплик фиксировано
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: nginx
        resources:
          requests:
            cpu: "100m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"

📌 Когда использовать?

✅ Если нагрузка предсказуема, и динамическое масштабирование не нужно.

📌 Как изменить вручную?

kubectl scale deployment my-app --replicas=5

2️⃣ Горизонтальное масштабирование (HPA - Horizontal Pod Autoscaler)

HPA автоматически добавляет или удаляет поды в зависимости от нагрузки (CPU, RAM, запросов).

📌 Пример HPA по CPU:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70  # Если CPU >70%, увеличиваем поды

📌 Как применить?

kubectl apply -f hpa.yaml
kubectl get hpa

📌 Когда использовать?

✅ Если сервис нагружается волнами (например, утром больше пользователей, ночью меньше).

✅ Если нагрузка зависит от API-запросов (можно использовать KEDA – Kubernetes Event-driven Autoscaling).


3️⃣ Вертикальное масштабирование (VPA - Vertical Pod Autoscaler)

VPA автоматически увеличивает CPU/RAM у подов, а не их количество.

📌 Пример VPA:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Auto"
  resourcePolicy:
    containerPolicies:
      - containerName: my-app
        minAllowed:
          cpu: "200m"
          memory: "256Mi"
        maxAllowed:
          cpu: "1"
          memory: "1Gi"

📌 Когда использовать?

✅ Когда подов мало, но они загружены, и горизонтальное масштабирование неэффективно.

✅ Когда приложение плохо работает с множеством реплик (например, stateful-сервисы).

📌 Как проверить текущие рекомендации VPA?

kubectl describe vpa my-app-vpa

🚨 Минус VPAПоды пересоздаются при изменении ресурсов, поэтому нужно учитывать downtime.


4️⃣ Автоскейлинг нод (Cluster Autoscaler)

Если в кластере не хватает ресурсов для новых подов, Cluster Autoscaler добавляет новые worker-ноды.

📌 Как включить Cluster Autoscaler в AWS EKS?

eksctl enable cluster-autoscaler --name=my-cluster

📌 Как проверить, есть ли Pending Pods (ожидающие поды)?

kubectl get pods --all-namespaces | grep Pending

📌 Когда использовать?

✅ Когда нагрузка резко увеличивается, и поды не влезают в существующие ноды.

✅ Когда надо экономить на инфраструктуре, удаляя ненужные ноды в низкой нагрузке.


🎯 Итог: Когда использовать каждый механизм?

Сценарий Какой метод масштабирования использовать?
Хотим задать фиксированное число подов Manual Scaling (replicas: N)
Нагрузка меняется в зависимости от CPU/RAM HPA (Horizontal Pod Autoscaler)
Приложение нагружено, но плохо работает с репликами VPA (Vertical Pod Autoscaler)
В кластере не хватает места для новых подов Cluster Autoscaler (AWS, GCP, Azure)

🚀 Оптимальное решение – комбинировать HPA + Cluster Autoscaler (автоматически добавлять поды и ноды).