Налаштування ResourceQuotas та LimitRanges у Kubernetes

Коли в неймспейсі немає квот і лімітів, один недоналаштований под може перевантажити весь кластер і залишити інші сервіси без ресурсів. Ми налаштовуємо ResourceQuotas і LimitRanges, щоб ви могли контролювати споживання CPU та пам'яті на рівні namespace і контейнерів. Наша команда реалізує проєкт під ключ — від аудиту поточних лімітів до впровадження та подальшої підтримки, забезпечуючи стабільну роботу й захист від подібних збоїв.
Часті запитання

Налаштування 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)

Покроковий процес впровадження квот (під ключ)

  1. Аудит поточного стану: збираємо всі неймспейси, перевіряємо наявність квот та лімітів. Використовуємо kubectl get resourcequota --all-namespaces та скрипти для пошуку подів без ресурсів.
  2. Аналіз метрик за останні 30 днів: з Prometheus вивантажуємо споживання CPU та пам'яті по неймспейсах, визначаємо пікові значення та резерви. Це основа для проектування квот.
  3. Проектування квот: для кожного неймспейсу задаємо requests та limits з запасом 20-30% від піку. Враховуємо autoscaling та burst-навантаження.
  4. Написання маніфестів: створюємо YAML для ResourceQuota та LimitRange. Для multi-tenant кластера застосовуємо шаблони зі змінними.
  5. Тестування на staging: застосовуємо квоти спочатку на dev та staging, перевіряємо логи та події. Відстежуємо помилки типу exceeded quota.
  6. Розгортання на production: поетапно, з моніторингом через Alertmanager при перевищенні 85% квоти.
  7. Документування: фіксуємо схему квот, правила зміни, 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 читайте в офіційній документації.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142