GH GambleHub

Планувальник ресурсів і авто-скейлінг

Коротке резюме

Стійкий скейлінг тримається на чотирьох опорах:

1. Коректні запити/ліміти і класи QoS.

2. Правильне укладання (топологія, афініті, пріоритети, передемпція).

3. Багаторівневий авто-скейлінг: HPA/VPA/KEDA + Cluster/Node autoscaler + warm pools.

4. SLO-орієнтована логіка (latency/queue depth) з анти-флапінгом і бюджетами.


Базова модель ресурсів

Requests/Limits і класи QoS

Requests = гарантії для планувальника; Limits = стелі для runtime.
QoS: Guaranteed (req = lim по CPU/Memory), Burstable (частково), BestEffort (нічого).
Виробничі сервіси з жорсткими SLO - Guaranteed/Burstable; фонові - Burstable/BestEffort.

CPU/Пам'ять/IO/Мережа

CPU - еластичний (time-sharing), пам'ять - жорстка (OOM-kill при перевищенні).
На IO/мережу закладайте ліміти/пріоритети окремо (cgroups/TC), інакше «галасливі сусіди».

GPU/акселератори

Запитуйте векторно (GPU = 1, VRAM через профілі), використовуйте nodeSelector/taints і PodPriority для критики.
Для інференсу - batch size і підігрів моделей.


Політики укладання (Scheduling)

Пріоритети, передемпція та PDB

PriorityClass для критичних шляхів (платежі, логін), передемпція дозволена.
PodDisruptionBudget захищає мінімальні репліки при евакуації/апдейтах.

Аффініті/Топологія

node/pod affinity для колокації/деколокації (наприклад, не класти репліки на один хост).
topologySpreadConstraints вирівнюють поди по зонах/AZ.
NUMA/топологія: pin-CPU/hugepages там, де важлива низька латентність.

Тейїнти і толеранси

Розведіть пули: `prod`, `batch`, `gpu`, `system`. Критика терпить менше сусідів.


Авто-скейлінг: рівні та сигнали

1) HPA (Horizontal Pod Autoscaler)

Скейліт репліки подів за метриками: CPU/Memory/кастомні (Prometheus Adapter).
Хороші сигнали: latency p95/p99, queue length/lag, RPS per pod, consumer lag.
Анти-флапінг: стабілізація (stabilizationWindow), мінімальний крок, cooldown.

Приклад HPA (latency-driven):
yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: { name: api-hpa }
spec:
scaleTargetRef: { apiVersion: apps/v1, kind: Deployment, name: api }
minReplicas: 6 maxReplicas: 120 behavior:
scaleUp:
stabilizationWindowSeconds: 60 policies: [{ type: Percent, value: 100, periodSeconds: 60 }]
scaleDown:
stabilizationWindowSeconds: 300 policies: [{ type: Percent, value: 20, periodSeconds: 60 }]
metrics:
- type: Pods pods:
metric:
name: http_server_request_duration_seconds_p95 target:
type: AverageValue averageValue: "0.25" # 250ms

2) VPA (Vertical Pod Autoscaler)

Тюнінгує requests/limits під реальне споживання (оновлює рекомендації).
Режими: 'Off'( збір),'Auto'( перезапуск),'Initial'( тільки при старті).
Практика: увімкнути «Off» → зібрати статистику → застосовувати при релізах.

3) KEDA/черга-заснований скейлінг

Реагує на зовнішні сигнали: Kafka lag, SQS depth, Redis length, Prometheus.
Ідеальний для консьюмерів подій/черг (EDA).

KEDA ScaledObject (Kafka lag):
yaml apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: { name: consumer-scale }
spec:
scaleTargetRef: { name: txn-consumer }
minReplicaCount: 2 maxReplicaCount: 200 cooldownPeriod: 120 pollingInterval: 5 triggers:
- type: kafka metadata:
bootstrapServers: broker:9092 consumerGroup: tx-cg topic: payments lagThreshold: "10000"

4) Cluster/Node Autoscaler (CA) + Warm Pools

CA додає/прибирає ноди при дефіциті/надлишку.
Warm pools: заздалегідь розігріті ноди/підготовлені образи (прискорюють cold start).
Для піків - step-scaling і збільшений minNodes заздалегідь.


Швидкість реакції і прогрів

SLO-затримка реакції: фронтовий шар ≤ 1-2 хв, бекенди/БД - окремо і заздалегідь.
Прогрів: TLS/DNS/коннекти, завантаження моделей, прогрів кешу і JIT.
Shadow-навантаження для «прокачування» колд-шляху до події.


Анти-флапінг і стабільність

Гістерезис на метриках, згладжування. середні).
Stabilization windows в HPA, великі в'scaleDown'.
Step-скейлінг замість «пила»; rate-limit на зміну реплік.
Budget-скейлінг: обмежити% трафіку/реплік, що додаються за хвилину.


Спостережуваність і SLO

Ключові SLI:
  • p95/99 latency, error rate, throughput, queue depth/lag, CPU/Memory saturation, pod pending time, node pressure.
Алерти:
  • Зростання pending pods, unschedulable події, дефіцит IP/підмереж, image pull довгий, evictions.
  • Трейси: tail-based sampling на хвости p99 → бачимо вузькі місця при скейлі.

FinOps: Вартість еластичності

Метрики: $/1000 RPS, $/мс p95, $/година резерву.
Мікс: on-demand + reserved + spot (для не-критики).
Поріг авто-скейла пов'язаний з вартістю помилки: іноді вигідно тримати warm-запас.


Специфіка для iGaming/фінтех

Піки матчів/турнірів: заздалегідь підняти'minReplicas'і minNodes, включити warm pools і прогрів кешів/моделей.
Платіжні консьюмери: KEDA по lag + ідемпотентність, ліміти провайдерів (PSP) як зовнішні тригери деградації.
Антибот: окремий пул, швидкий масштаб правил, «сірі» маршрути.
Регуляторика: PDB у комплаєнс-сервісів, пріоритети вищі, ніж у batch.


Чек-листи

Проектування

  • Requests/limits задані за даними профілювання; QoS вибрана.
  • PriorityClass, PDB, taints/tolerations і topologySpread - налаштовані.
  • HPA по SLO-метрикам, не тільки CPU.
  • VPA в'Off'для збору рекомендацій (міграція до'Auto'планово).
  • KEDA/черги для подієвих навантажень.
  • CA + warm pools, образи кешуються (image pre-pull).

Експлуатація

  • Stabilization windows і cooldownы задані (флапінг виключений).
  • Алерти на pending/unschedulable, lag, p95, error-rate.
  • Runbooks: «немає нод», «image не тягнеться», «OOM/evict», «шторм ретраїв».
  • Capacity-review щомісяця: факт скейла vs план/вартість.

Типові помилки

HPA тільки по CPU → lat-регрес при IO/лімітах БД.
Відсутність PDB і пріоритетів → критика передемптиться першою.
Змішання критики і batch на одному пулі без taints → «галасливі сусіди».
Нульовий прогрів → холодні старти на піку.
Агресивний'scaleDown'→ пила і thrash контейнерів.
KEDA без ідемпотентності → дублікати повідомлень при штормі.


Міні-плейбуки

1) Перед піковою подією (T-30 хв)

1. Збільшити'minReplicas '/minNodes, активувати warm pools.
2. Прогріти CDN/DNS/TLS/коннекти, завантажити моделі.
3. Включити «сірі» маршрути/ліміти для ботів.
4. Перевірити dashboards: pending/lag/p95.

2) Дефіцит нод (unschedulable)

1. Перевірити CA, квоти хмари, підмережі/IP.
2. Тимчасово знизити ліміти batch, включити передемпцію для низьких пріоритетів.
3. Підняти тимчасово більший інстанс-тип або другий пул.

3) Зростання lag в черзі

1. KEDA: scale up по тригеру; 2) підняти ліміти консьюмера;

2. включити idempotency-keys і backpressure продьюсерів.

4) Пила реплік

1. Збільшити stabilization/cooldown; 2) перейти на step-скейлінг;

2. згладити метрику експоненціальним середнім.


Конфіг-шпаргалки

VPA (збір рекомендацій):
yaml apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: { name: api-vpa }
spec:
targetRef: { apiVersion: "apps/v1", kind: Deployment, name: api }
updatePolicy: { updateMode: "Off" } # собираем рекомендации
Cluster Autoscaler (ідеї прапорів, концепт):

--balance-similar-node-groups
--expander=least-waste
--max-empty-bulk-delete=10
--scale-down-utilization-threshold=0.5
--scale-down-delay-after-add=10m
Topology spread (рівномірність по зонах):
yaml topologySpreadConstraints:
- maxSkew: 1 topologyKey: topology.kubernetes.io/zone whenUnsatisfiable: DoNotSchedule labelSelector: { matchLabels: { app: api } }

Підсумок

Ефективний планувальник і авто-скейлінг - це коректні запити/ліміти + розумне укладання + багаторівневий скейлінг (HPA/VPA/KEDA/CA) + прогрів і анти-флаппінг, прив'язані до SLO і вартості мілісекунди. Зафіксуйте політики в IaC, спостерігайте за «правильними» метриками (latency/lag), тримайте warm-запас під піки - і платформа буде еластичною, передбачуваною і економною.

Contact

Зв’яжіться з нами

Звертайтеся з будь-яких питань або за підтримкою.Ми завжди готові допомогти!

Розпочати інтеграцію

Email — обов’язковий. Telegram або WhatsApp — за бажанням.

Ваше ім’я необов’язково
Email необов’язково
Тема необов’язково
Повідомлення необов’язково
Telegram необов’язково
@
Якщо ви вкажете Telegram — ми відповімо й там, додатково до Email.
WhatsApp необов’язково
Формат: +код країни та номер (наприклад, +380XXXXXXXXX).

Натискаючи кнопку, ви погоджуєтесь на обробку даних.