Как настроить горизонтальный автоскейлинг подов на bare-metal Kubernetes кластере?

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

Ответ

На bare-metal кластере для автоскейлинга подов используется Horizontal Pod Autoscaler (HPA), но ему нужен источник метрик. Стандартный metrics-server предоставляет метрики CPU и памяти.

Базовая настройка HPA:

  1. Установите metrics-server:

    kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

    Возможно, потребуется добавить флаг --kubelet-insecure-tls в манифест, если используются self-signed сертификаты.

  2. Создайте 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.

  1. Установите Prometheus Adapter.
  2. Настройте 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 не блокируют связь между подами и источниками метрик.