Настройка ResourceQuotas и LimitRanges в Kubernetes

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

Настройка ResourceQuotas и LimitRanges в Kubernetes

Представьте: вы заходите на новый проект, а там неймспейс production работает без единого ResourceQuota. Один разработчик задеплоил батч-джобу с requests.cpu: 0 и limits.cpu: 0 — то есть вообще без ограничений. За 20 минут джоба сожрала ресурсы двух нод, и остальные поды ушли в Pending. По данным CNCF, отсутствие квот — одна из трёх главных причин нестабильности в production-кластерах. Наши клиенты часто экономят до 30% затрат на облако после внедрения правильных квот. Без ResourceQuota один недонастроенный под может парализовать работу всего кластера, как это произошло в нашем проекте с онлайн-ритейлером: из-за отсутствия лимитов тестовый неймспейс «съел» половину production-ресурсов.

Согласно официальной документации Kubernetes, ResourceQuota позволяет ограничить совокупное потребление ресурсов в namespace, предотвращая перегрузку кластера.

Почему отсутствие квот — это бомба замедленного действия?

Resource Quotas и Limit Ranges решают разные задачи, но их часто путают. ResourceQuota — лимит на весь неймспейс: суммарное CPU, память, количество подов, сервисов, PVC. Если квота исчерпана, новые объекты не создаются — kubectl apply возвращает ошибку exceeded quota. LimitRange работает на уровне контейнера: задаёт дефолтные requests/limits и минимальные/максимальные значения. Это страховка от контейнеров без явных ограничений.

Как правильно настраивать 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%, что при среднемесячных расходах на облако в несколько тысяч долларов дает ощутимый эффект. Инвестиции в настройку квот окупаются в среднем за 1-2 месяца.

Свяжитесь с нами для аудита вашего кластера. Наши инженеры помогут настроить квоты и снизить затраты. Закажите услугу настройки ResourceQuota и LimitRange — получите стабильный кластер и экономию бюджета.

Подробнее о ResourceQuota и LimitRange читайте в официальной документации.

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

Последние работы

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