Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

Kubernetes HPA — automatyczne skalowanie podów

Opublikowano: 10 kwietnia 2026 · Kategoria: VPS / Kubernetes

Ręczne ustawianie liczby replik to anty-pattern w Kubernetes. HPA (Horizontal Pod Autoscaler) automatycznie dostosowuje liczbę podów na podstawie obciążenia — dodaje repliki gdy ruch rośnie, usuwa gdy ruch spada. W efekcie płacisz tylko za zasoby które faktycznie używasz, a aplikacja nie pada pod dużym ruchem. Ten artykuł pokazuje pełną konfigurację: od metrics-server przez CPU/RAM scaling, po zaawansowane custom metrics z Prometheus i KEDA.

Instalacja metrics-server

HPA wymaga metrics-server do odczytu CPU i RAM z podów. W k3s jest on domyślnie zainstalowany. W pełnym Kubernetes (kubeadm) trzeba go dodać:

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

# Dla klastrów lokalnych (k3d, minikube) dodaj flage TLS:
kubectl patch deployment metrics-server -n kube-system --type=json \
  -p='[{"op":"add","path":"/spec/template/spec/containers/0/args/-","value":"--kubelet-insecure-tls"}]'

# Weryfikacja (po ~60 sek od instalacji)
kubectl top nodes
kubectl top pods --all-namespaces

# Jesli kubectl top nie dziala — sprawdz logi:
kubectl logs -n kube-system deployment/metrics-server

Podstawowy HPA — skalowanie po CPU

Zanim stworzysz HPA, Deployment MUSI mieć ustawione resources.requests.cpu — bez tego HPA nie ma punktu odniesienia i nie będzie działać.

# Deployment z wymaganymi requests (warunek HPA!)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web
          image: nginx:1.25
          resources:
            requests:
              cpu: "100m"       # WYMAGANE dla HPA CPU
              memory: "128Mi"   # WYMAGANE dla HPA Memory
            limits:
              cpu: "500m"
              memory: "512Mi"
# hpa-cpu.yaml — HPA v2 (Kubernetes 1.23+)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 60   # skaluj gdy srednia CPU > 60% requests
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 70   # skaluj gdy RAM > 70% requests
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300  # 5 min cooling down
      policies:
        - type: Pods
          value: 1
          periodSeconds: 60           # max 1 pod usuniecia na minute
    scaleUp:
      stabilizationWindowSeconds: 30  # szybki scale-up
      policies:
        - type: Pods
          value: 4
          periodSeconds: 60           # max 4 nowe pody na minute
kubectl apply -f hpa-cpu.yaml

# Monitoring HPA
kubectl get hpa web-app-hpa
kubectl describe hpa web-app-hpa

# Test load (w osobnym terminalu — generuje ruch na pod)
kubectl run -i --tty load-generator --rm \
  --image=busybox:1.28 \
  --restart=Never \
  -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://web-app; done"

# Obserwuj skalowanie w czasie rzeczywistym
watch kubectl get hpa,pods

Custom metrics — Prometheus Adapter

Skalowanie po CPU i RAM nie wystarczy dla wszystkich aplikacji. Prometheus Adapter udostępnia dowolne metryki z Prometheusa przez Kubernetes Custom Metrics API. HPA może wtedy skalować np. po liczbie żądań na sekundę (RPS), długości kolejki, lub niestandardowym wskaźniku biznesowym.

# Instalacja Prometheus Adapter przez Helm
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus-adapter prometheus-community/prometheus-adapter \
  --set prometheus.url=http://prometheus-server.monitoring.svc.cluster.local \
  --namespace monitoring

# Konfiguracja — mapper metryki z Prometheusa do K8s API
# values.yaml (fragment):
rules:
  custom:
    - seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: "^(.*)_total"
        as: "${1}_per_second"
      metricsQuery: 'rate(http_requests_total{{.LabelMatchers}}[2m])'

# HPA uzywajacy custom metric
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-app-custom-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-app
  minReplicas: 2
  maxReplicas: 20
  metrics:
    - type: Pods
      pods:
        metric:
          name: http_requests_per_second
        target:
          type: AverageValue
          averageValue: "100"   # skaluj gdy >100 RPS per pod

KEDA — skalowanie event-driven i do zera

KEDA rozszerza K8s o skalowanie na podstawie 70+ źródeł zdarzeń — kolejki, streamy, bazy danych, cron. Jego największa zaleta: skalowanie do zera replik gdy brak pracy, i back to N gdy pojawi się praca.

# Instalacja KEDA
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --namespace keda --create-namespace

# ScaledObject — skalowanie po RabbitMQ (przyklad)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: worker-scaledobject
spec:
  scaleTargetRef:
    name: message-worker          # nazwa Deployment
  minReplicaCount: 0             # skalowanie do zera!
  maxReplicaCount: 30
  cooldownPeriod: 60
  triggers:
    - type: rabbitmq
      metadata:
        host: amqp://user:[email protected]
        queueName: job-queue
        queueLength: "10"        # 1 pod per 10 wiadomosci w kolejce

Porównanie HPA vs VPA vs KEDA

Narzędzie Skaluje Źródło metryk Skalowanie do 0 Kiedy używać
HPA Liczba podów CPU, RAM, Custom Nie (min 1) Bezstanowe API, web serwisy
VPA CPU/RAM per pod CPU, RAM historyczne Nie Optymalizacja requests, bazy
KEDA Liczba podów 70+ źródeł zdarzeń Tak (do 0) Event-driven, kolejki, batch

Najczęstsze pytania

Jak działa Horizontal Pod Autoscaler w Kubernetes? +
HPA to kontroler K8s, który co 15 sekund (domyślnie) sprawdza metryki podów i porównuje je z wartościami docelowymi (targetUtilization). Jeśli średnie użycie CPU lub RAM przekracza próg, HPA zwiększa liczbę replik w Deployment lub StatefulSet. Gdy metryki spadną, HPA zmniejsza repliki po cooling down period (domyślnie 5 minut dla skalowania w dół, aby uniknąć trzepotania). HPA działa na podstawie danych z metrics-server lub custom metrics API.
Czym różni się HPA od VPA (Vertical Pod Autoscaler)? +
HPA (Horizontal) skaluje LICZBĘ podów — dodaje nowe repliki gdy jest za mało zasobów. VPA (Vertical) skaluje ZASOBY jednego poda — zwiększa requests.cpu i requests.memory. HPA jest lepszy dla bezstanowych serwisów, gdzie skalowanie poziome jest łatwe. VPA jest użyteczny gdy nie chcesz lub nie możesz zwiększać liczby replik (np. klient z licencją per instancja, bazy danych). W Kubernetes nie można używać HPA i VPA jednocześnie na tych samych zasobach CPU/Memory bez ryzyka konfliktów — użyj VPA w trybie Off (tylko rekomendacje) z HPA.
Co to jest KEDA i kiedy go używać zamiast HPA? +
KEDA (Kubernetes Event-Driven Autoscaling) to rozszerzenie K8s, które pozwala skalować pody na podstawie zdarzeń zewnętrznych: liczby wiadomości w kolejce (RabbitMQ, Kafka, SQS), zapytań HTTP przez Nginx, metryk Prometheus, jobów w bazie danych i wielu innych. Standardowy HPA opiera się tylko na CPU/RAM. KEDA umożliwia skalowanie do zera (zero replicas gdy brak pracy) i skalowanie ze zera gdy pojawi się praca — co jest niemożliwe z czystym HPA. Idealny dla event-driven microservices i batch processingu.
Jak zainstalować metrics-server w Kubernetes? +
metrics-server to komponent zbierający metryki CPU i RAM z kubelet na każdym węźle. Instalacja: kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml. Dla klastrów lokalnych (k3d, minikube, kind) często trzeba dodać flagę --kubelet-insecure-tls w args kontenera metrics-server. Po instalacji sprawdź: kubectl top nodes i kubectl top pods. Bez metrics-server HPA działa ale nie może pobierać metryk i będzie nieaktywny.

Sprawdź oferty pasujące do tego scenariusza

Poniżej masz szybkie przejścia do ofert i stron z kodami rabatowymi tam, gdzie są dostępne.