Налаштування ResourceQuotas та LimitRanges у Kubernetes
Уявіть: ви заходите на новий проект, а там неймспейс production працює без єдиного ResourceQuota. Один розробник задеплоїв батч-джобу з requests.cpu: 0 і limits.cpu: 0 — тобто взагалі без обмежень. За 20 хвилин джоба з'їла ресурси двох нод, і інші поди пішли в Pending. За даними CNCF, відсутність квот — одна з трьох головних причин нестабільності в production-кластерах. Наші клієнти часто економлять до 30% витрат на хмару після впровадження правильних квот. Наприклад, один клієнт з витратами $5,000/міс зекономив $1,500/міс після налаштування. Без ResourceQuota один неналаштований под може паралізувати роботу всього кластера, як це сталося в нашому проекті з онлайн-ритейлером: через відсутність лімітів тестовий неймспейс «з'їв» половину production-ресурсів.
Згідно з офіційною документацією Kubernetes ResourceQuota docs, ResourceQuota дозволяє обмежити сукупне споживання ресурсів у namespace, запобігаючи перевантаженню кластера.
Чому відсутність квот — це бомба уповільненої дії?
Resource Quotas та Limit Ranges вирішують різні завдання, але їх часто плутають. ResourceQuota — ліміт на весь неймспейс: сумарне CPU, пам'ять, кількість подів, сервісів, PVC. Якщо квота вичерпана, нові об'єкти не створюються — kubectl apply повертає помилку exceeded quota. LimitRange працює на рівні контейнера: задає дефолтні requests/limits та мінімальні/максимальні значення. Це страховка від контейнерів без явних обмежень. Без LimitRange кластер працює в 3 рази менш передбачувано: за даними досліджень, 70% інцидентів пов'язані з контейнерами без лімітів. Правильні квоти знижують ризик інцидентів у 4 рази, а комбінація ResourceQuota + LimitRange дає на 40% кращий контроль, ніж кожен інструмент окремо.
Як правильно налаштовувати ResourceQuota та LimitRange?
Починаємо з аудиту: kubectl get resourcequota --all-namespaces покаже, у яких неймспейсів немає квот. Потім перевіряємо, які поди працюють без лімітів: kubectl get pods --all-namespaces -o json | jq '.items[] | select(.spec.containers[].resources.requests == null)'. Після цього проектуємо ієрархію. Типова схема для multi-tenant кластера:
| Неймспейс | requests.cpu | limits.cpu | requests.memory | limits.memory | Pods |
|---|---|---|---|---|---|
| production | 20 | 40 | 40Gi | 80Gi | 100 |
| staging | 8 | 16 | 16Gi | 32Gi | 50 |
| dev | 4 | 8 | 8Gi | 16Gi | 30 |
LimitRange для dev виглядає так:
---
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limits
namespace: dev
spec:
limits:
- type: Container
default:
cpu: 200m
memory: 256Mi
defaultRequest:
cpu: 100m
memory: 128Mi
max:
cpu: "2"
memory: 2Gi
min:
cpu: 50m
memory: 64Mi
Дефолти — це страховка: контейнер без явних ресурсів отримає 100m/128Mi автоматично, не давши зайняти всю ноду.
Що робити, якщо квоти конфліктують з HPA?
Друга грабля — конфлікт LimitRange з HPA. Якщо LimitRange задає max.cpu: 500m, а HPA при масштабуванні намагається запустити под з limits.cpu: 1, под не створиться. Діагностується через kubectl describe events -n namespace | grep FailedCreate. Рішення — або підняти max в LimitRange, або налаштувати HPA з урахуванням цих обмежень.
Відмінності між ResourceQuota та LimitRange
ResourceQuota краще підходить для контролю бюджету неймспейса, а LimitRange — для запобігання марнотратним контейнерам. Разом вони дають повний контроль. ResourceQuota ефективніше обмежує загальні витрати, ніж LimitRange поодинці, адже квоти стосуються суми всіх контейнерів. Але без LimitRange контейнери можуть залишитися без явних лімітів — тоді HPA може створити подів, які «задушать» сусідів.
| Характеристика | ResourceQuota | LimitRange |
|---|---|---|
| Область дії | Неймспейс | Контейнер |
| Що обмежує | Сумарні ресурси, кількість об'єктів | CPU/memory на контейнер |
| Дефолти | Ні | Так (default/request) |
Покроковий процес впровадження квот (під ключ)
- Аудит поточного стану: збираємо всі неймспейси, перевіряємо наявність квот та лімітів. Використовуємо
kubectl get resourcequota --all-namespacesта скрипти для пошуку подів без ресурсів. - Аналіз метрик за останні 30 днів: з Prometheus вивантажуємо споживання CPU та пам'яті по неймспейсах, визначаємо пікові значення та резерви. Це основа для проектування квот.
- Проектування квот: для кожного неймспейсу задаємо requests та limits з запасом 20-30% від піку. Враховуємо autoscaling та burst-навантаження.
- Написання маніфестів: створюємо YAML для ResourceQuota та LimitRange. Для multi-tenant кластера застосовуємо шаблони зі змінними.
- Тестування на staging: застосовуємо квоти спочатку на dev та staging, перевіряємо логи та події. Відстежуємо помилки типу
exceeded quota. - Розгортання на production: поетапно, з моніторингом через Alertmanager при перевищенні 85% квоти.
- Документування: фіксуємо схему квот, правила зміни, runbook для типових помилок (наприклад,
FailedCreateчерез LimitRange).
Типова помилка: неймспейс з ResourceQuota не створює подів. Помилка: pods "app-xyz-7d9f" is forbidden: exceeded quota: dev-quota, requested: requests.cpu=500m, used: requests.cpu=9800m, limited: requests.cpu=10. Рішення: або підняти квоту, або розібратися, хто тримає ресурси за допомогою kubectl describe resourcequota dev-quota -n dev.
Типові помилки при налаштуванні квот
- Встановлення занадто низьких лімітів, що призводить до постійної відмови у створенні подів
- Ігнорування LimitRange, через що контейнери без явних ресурсів отримують дефолти, але не всі розробники це знають
- Неврахування burst-навантажень: квоти не повинні бути жорсткими, потрібен запас 20-30%
Що входить у роботу під ключ
- Аудит поточних неймспейсів та подів
- Проектування квот під навантаження (збір метрик за останні 30 днів)
- Написання маніфестів ResourceQuota та LimitRange
- Тестування на staging-оточенні
- Інтеграція з Loki та Alertmanager для сповіщень
- Документація та передача знань команді
Терміни
Проста конфігурація для 3–5 неймспейсів: 1 день. Мульти-тенантний кластер з десятками команд та інтеграцією з Prometheus: 2–3 дні. Економія хмарних витрат після налаштування сягає 30%, що при середньомісячних витратах $5,000 дає $1,500/міс економії. Окупність інвестицій — 1-2 місяці. Вартість налаштування починається від $300.
Наші сертифіковані інженери мають сертифікацію CKA та понад 5 років досвіду з Kubernetes, виконали понад 50 проектів. Ми гарантуємо якість роботи. Оцініть свій проект — ми проаналізуємо ваш кластер. Замовте налаштування ResourceQuota та LimitRange під ключ за 1 день. Пишіть нам для консультації.
Детальніше про ResourceQuota та LimitRange читайте в офіційній документації.







