
Статья подготовлена вместе с экспертом
Александр Прохоров, ведущий разработчик Backend

Будем держать в курсе новостей и облачных трендов


Большинство команд, которые приходят к оптимизации Kubernetes, делают это после неприятного открытия: кластер работает, приложения отвечают, но счёт за инфраструктуру давно перестал соответствовать реальной нагрузке. По данным Datadog (State of Kubernetes, 2024), средняя утилизация выделенных ресурсов в кластерах составляет 18% по ЦП и 23% по памяти. Остальное — оплаченные, но неиспользуемые мощности.
Корень проблемы почти всегда один: запросы и лимиты выставлены наугад или не выставлены вовсе. А ведь грамотная настройка этих механизмов позволяет сократить расходы на инфраструктуру на 30–60% и устранить простои из-за нехватки ЦП или памяти — без увеличения бюджета.
В нашей практике развития платформы VK Cloud мы видим, как неоптимизированные кластеры приводят к перерасходу 40–60% бюджета. В этой статье разберём, как правильно настроить запросы и лимиты ресурсов, когда подключать автомасштабирование и как выстроить мониторинг, чтобы реагировать на проблемы раньше, чем они дойдут до пользователей.

Александр Прохоров, ведущий разработчик Backend
Без контроля ресурсов один контейнер способен забрать всё процессорное время или всю память узла, оставив соседние поды ни с чем. Вот к чему это приводит на практике:
Запросы стоит пересматривать регулярно: нагрузка на приложения меняется, и то, что было точной настройкой три месяца назад, сегодня может оказаться источником проблем.
Kubernetes управляет тремя категориями ресурсов каждого контейнера: процессорным временем (CPU), оперативной памятью (memory) и сетевыми ресурсами.
CPU измеряется в миллиярдах (millicores): одно ядро процессора равно 1000m, запрос cpu: 500m резервирует половину ядра. Лимит ЦП работает через механизм cgroups ядра Linux — при превышении контейнер получает throttling. Планировщик Kubernetes не разместит pod на узле, если запрос превышает доступные мощности. Память указывается в мебибайтах (Mi) или гибибайтах (Gi). Лимит памяти — жёсткое ограничение: превышение немедленно приводит к OOMKilled. Здесь важно отличие от CPU: превышение лимита cpu замедляет приложение, превышение лимита memory завершает процесс.
Сетевые ресурсы Kubernetes не лимитирует по умолчанию, но QoS и сетевые политики позволяют управлять приоритетом трафика и полосой пропускания.
Запросы (requests) — минимальный объём ресурсов, гарантированный контейнеру. Планировщик использует их при выборе узла для pod. Если на узле есть свободные ресурсы сверх запроса, контейнер может их использовать.
Ограничения (limits) — максимальный объём. Kubelet принудительно соблюдает их через cgroups: превышение по ЦП даёт throttling, по памяти — OOMKilled.
resources: requests: requests: cpu: "500m" memory: "512Mi" limits: cpu: "1000m" memory: "1024Mi"
Если задать limits без requests, Kubernetes скопирует limits в requests автоматически. Это распространённая ошибка: контейнер резервирует максимальный объём ресурсов и блокирует их для соседних подов.
ResourceQuota задаёт ограничения на суммарные ресурсы в namespace: запросы и лимиты ЦП и памяти, количество подов. Это защищает кластер от ситуации, когда одна команда занимает все доступные мощности. LimitRange устанавливает значения по умолчанию для контейнеров, у которых разработчик не указал запросы или ограничения. Без LimitRange такой контейнер запустится без каких-либо ограничений — и станет потенциальным источником проблем. LimitRange также задаёт минимальный и максимальный объём ЦП и памяти для одного контейнера.
Вместе ResourceQuota и LimitRange дают контроль над ресурсами на уровне namespace без необходимости вручную проверять каждый деплоймент.

Создайте кластер в VK Cloud
OOMKilled возникает, когда контейнер потребляет больше памяти, чем указано в limits. Ядро Linux принудительно завершает процесс, контейнер перезапускается и прерывает обработку запросов. По данным CNCF Survey (2024), проблемы с памятью входят в топ-3 причин инцидентов в Kubernetes.
Чаще всего это происходит по одной из трёх причин.
Устанавливайте лимит памяти на 20–30% выше среднего потребления и опирайтесь на метрики за 7–14 дней, а не на интуицию.
Соотношение запросов и ограничений определяет QoS-класс pod, который влияет на приоритет вытеснения при нехватке ресурсов.
Для production-приложений задавайте лимиты по профилю нагрузки: по ЦП — в 1,5–2 раза выше запроса, по памяти — в 1,2–1,5 раза. Разница обоснована механикой Kubernetes: превышение лимита ЦП замедляет контейнер, превышение лимита памяти его убивает.
В Managed Kubernetes от VK Cloud для каждой группы узлов доступны индивидуальные конфигурации: флейворы с ЦП до 64 ядер и памятью до 512 ГБ, что позволяет подобрать ресурсы узла под конкретные требования приложения.
Ручная настройка запросов и ограничений хорошо работает для стабильных нагрузок, но большинство production-приложений ведут себя иначе: трафик то растёт, то падает. Для таких случаев в Kubernetes есть три инструмента автомасштабирования.
Horizontal Pod Autoscaler (HPA) увеличивает или уменьшает количество реплик pod по метрикам. По умолчанию HPA ориентируется на загрузку ЦП, но умеет работать и с памятью, и с пользовательскими метриками. Если среднее использование ЦП превышает целевое значение, HPA добавляет реплики, при снижении — убирает лишние. Для расчёта утилизации HPA использует значения requests контейнеров.
Vertical Pod Autoscaler (VPA) корректирует сами запросы и ограничения контейнеров, опираясь на историческое потребление ресурсов. VPA анализирует метрики за 8 дней, рассчитывает оптимальные значения и применяет их при пересоздании pod. Доступны три режима: Off — только рекомендации без применения, Initial — значения выставляются при создании pod, Auto — VPA обновляет запросы и ограничения для уже работающих подов.
Cluster Autoscaler управляет количеством узлов в кластере. Если запросы ресурсов подов превышают то, что кластер может предоставить, автоскейлер добавляет узел. Когда узел простаивает — вытесняет поды на другие узлы и удаляет его.
| Сценарий | Инструмент | Логика |
| Web-приложение с переменным трафиком | HPA | Масштабирование реплик приложения по ЦП или запросам |
| Stateful-модуль (база данных) | VPA | Увеличение ресурсов pod |
| Рост числа приложений в кластере | Cluster Autoscaler | Добавление узлов при превышении запросов ресурсов |
| Пиковые нагрузки | HPA + Cluster Autoscaler | Больше подов + больше узлов |
В Managed Kubernetes от VK Cloud Cluster Autoscaler предустановлен и масштабирует кластер до 500 узлов и 55 000 подов. Посекундная тарификация гарантирует оплату только за реально использованные ресурсы.
Не используйте HPA и VPA для одной метрики одновременно. VPA изменит запросы и ограничения ресурсов, HPA пересчитает использование и создаст лишние реплики. Разделяйте: VPA — на memory, HPA — на cpu.
Без данных о реальном потреблении настройка запросов, лимитов и автомасштабирования превращается в угадывание. Мониторинг показывает, какие контейнеры запрашивают слишком много, а каким не хватает ограничений.
Metrics Server — базовый аддон Kubernetes, который поставляет метрики ЦП и памяти в реальном времени. Хранит данные за несколько минут — достаточно для оперативной диагностики, но не для анализа тrendов.
Prometheus + Grafana — стандартная связка для мониторинга кластера. Prometheus собирает метрики с kubelet, cAdvisor и kube-state-metrics, Grafana визуализирует потребление ресурсов по контейнерам, подам и узлам. Именно здесь видно, у каких контейнеров запросы сильно расходятся с фактическим потреблением.
cAdvisor — встроенный модуль kubelet, который собирает метрики ресурсов контейнеров: ЦП, память, использование диска. Prometheus забирает данные напрямую из него.
В VK Cloud встроенный мониторинг отслеживает состояние Control Plane и узлов, а Cloud Alerting отправляет уведомления о масштабировании через email, Telegram или webhook.
Процесс оптимизации запросов и ограничений устроен так:
container_memory_working_set_bytescontainer_cpu_cfs_throttled_periods_totalPersistent Volumes (PV) и Persistent Volume Claims (PVC) позволяют контейнерам сохранять данные между перезапусками. Несколько практических правил при работе с хранилищами:
В VK Cloud PVC интегрированы с блочным хранилищем и поддерживают динамическое создание и расширение томов.
Балансировка нагрузки между подами в Kubernetes реализуется через Service. Для более тонкого контроля над сетью есть несколько инструментов.
Network Policies задают правила сетевого доступа между подами: изоляция по namespace, ограничение входящего и исходящего трафика. Без них любой pod в кластере может обращаться к любому другому.
CNI-плагины с bandwidth-ограничениями позволяют управлять полосой пропускания на уровне контейнера — там, где QoS-классов недостаточно.
Ingress Controller с rate-limiting защищает backend от всплесков трафика. Ограничение запросов в секунду не даёт входящему потоку превысить то, что backend способен обработать.
В VK Cloud сеть построена на SDN Sprut: низкая задержка между узлами и встроенная балансировка нагрузки L4/L7. Мультизональные кластеры с распределением между тремя ЦОД обеспечивают доступность при отказе одной зоны.
Несколько принципов, которые стоит держать в голове при работе с ресурсами кластера.
Managed Kubernetes от VK Cloud включает предустановленный Cluster Autoscaler, встроенный мониторинг и Self-Healing за 3–5 минут. Посекундная тарификация означает оплату только за реально использованные ресурсы. Платформа масштабируется до 500 узлов и 55 000 подов.
Управление ресурсами кластера в личном кабинете
Наши специалисты свяжутся с вами в ближайшее время и ответят на все вопросы.



