Ответ
На bare-metal кластере для автоскейлинга подов используется Horizontal Pod Autoscaler (HPA), но ему нужен источник метрик. Стандартный metrics-server предоставляет метрики CPU и памяти.
Базовая настройка HPA:
-
Установите metrics-server:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlВозможно, потребуется добавить флаг
--kubelet-insecure-tlsв манифест, если используются self-signed сертификаты. -
Создайте HPA для вашего Deployment:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: myapp-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80
Для кастомных метрик (например, длины очереди или RPS): Нужен адаптер, который преобразует метрики из вашей системы мониторинга (чаще всего Prometheus) в формат Kubernetes Custom Metrics API.
- Установите Prometheus Adapter.
- Настройте HPA на кастомную метрику:
metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 100
Event-driven автоскейлинг с KEDA: Для скейлинга на основе событий из Kafka, RabbitMQ, AWS SQS и др. отлично подходит KEDA (Kubernetes Event-driven Autoscaling).
Пример для RabbitMQ:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
spec:
scaleTargetRef:
name: order-processor
pollingInterval: 30
cooldownPeriod: 300
minReplicaCount: 1
maxReplicaCount: 20
triggers:
- type: rabbitmq
metadata:
host: amqp://guest:guest@rabbitmq.default.svc.cluster.local:5672
queueName: orders
queueLength: "50" # Каждый под обрабатывает ~50 сообщений. Новый под будет создан при превышении.
Важно для bare-metal: Убедитесь, что в кластере достаточно ресурсов (CPU, RAM) на узлах для масштабирования, и что Network Policies не блокируют связь между подами и источниками метрик.