Ваш кластер Kubernetes теряет деньги: вот как это остановить
Это перевод оригинальной статьи Your Kubernetes Cluster Is Bleeding Money: Here’s How to Stop It.
Подписывайтесь на телеграм-канал usr_bin, где я публикую много полезного по Linux, в том числе ссылки на статьи в этом блоге.
99,94% кластеров имеют избыточное выделение ресурсов. Вот как присоединиться к тем 0,06%, которые этого не делают.
Я с недоверием смотрел на наш счет за облачные услуги. У нас работал скромный кластер Kubernetes из 50 подов на десяти узлах, и каким-то образом мы тратили больше, чем команды, у которых нагрузка была втрое больше. Хуже всего то, что я понятия не имел, куда уходят деньги.
После нескольких месяцев расследований я обнаружил горькую правду: мы платили за ресурсы, которые никогда не использовали. И, согласно отчету Cast AI 2025 Kubernetes Cost Benchmark Report, не мы одни. Поразительные 99,94% кластеров Kubernetes имеют избыточное выделение ресурсов.
Задумайтесь над этим. Практически каждый кластер Kubernetes, работающий сейчас в производственной среде, тратит деньги впустую.
Скрытый налог, который вы платите каждый месяц
Вот что на самом деле показывают данные сравнительного анализа:
- Средняя загрузка CPU: 10%
- Средний уровень использования памяти: 23%
- Разница в избыточном выделении ресурсов: в 8 раз больше запрошенного, чем фактически использованного объема.
Это значит, что на каждый доллар, потраченный на вычислительные ресурсы, примерно 75 центов уходит на простаивающие ресурсы. По оценкам BCG, до 30% всех расходов на облачные сервисы расходуются таким образом впустую. Для многих организаций это миллионы долларов в год.
Но вот в чем дело: это не из-за небрежности инженеров. Сама система спроектирована так, чтобы такое происходило.
Почему мы выделяем слишком много ресурсов (и почему это абсолютно рационально)
Вспомните, когда вы в последний раз запрашивали ресурсы для развертывания. Что вы тогда подумали?
Если вы похожи на большинство инженеров, это было что-то вроде: «Я точно не знаю, что именно нужно, но я точно не хочу, чтобы программа зависла. Лучше запросить больше, чем меньше».
Это совершенно рациональное поведение. Последствия недостаточного выделения ресурсов немедленны и болезненны:
- Поды подвергаются ограничению скорости.
- Приложения замедляются
- Ошибка нехватки памяти убивает ваши сервисы
- Инженер на дежурстве получает уведомление в 3 часа утра
Последствия избыточного выделения ресурсов? Абстрактное число в счете, которое может когда-нибудь проверить чья-то команда… в будущем.
Поэтому мы добавляем буферы. Довольно щедрые. Исследования показывают, что среднее избыточное выделение CPU составляет 40%, а памяти — 57%. И 59% контейнеров вообще не имеют установленных лимитов CPU, то есть верхней границы нет.
Страх перед проблемами с производительностью создает замкнутый круг, ведущий к расточительству.
Пятишаговая методика решения этой проблемы
Я подробно расскажу вам о процессе, который помог нам сократить расходы на Kubernetes на 47% за шесть недель. Никакой магии, никаких дорогостоящих консультантов, просто систематическое применение уже существующих инструментов и практик.
Шаг 1: Обеспечьте видимость (Нельзя исправить то, чего не видишь)
Прежде чем что-либо оптимизировать, необходимо понять, на что вы фактически тратите деньги и куда.
Разверните OpenCost или Kubecost в своем кластере. Эти инструменты обеспечивают распределение ресурсов по пространствам имен и рабочим нагрузкам, напрямую соотнося с командами и продуктами.
# Install OpenCost via Helm helm install opencost opencost/opencost \ --namespace opencost-system \ --create-namespace
Фонд FinOps рекомендует использовать метод «демонстрации результатов» в качестве первого шага для изменения поведения. Когда команды могут точно видеть, во сколько обходится их работа, происходит нечто интересное: они начинают проявлять интерес.
Быстрый способ добиться успеха: стандартизировать метки Kubernetes для распределения затрат. Как минимум, каждая рабочая нагрузка должна иметь: app, team, env, и cost-centre. Это единственное изменение превратит ваши данные о выставлении счетов из шума в полезную информацию.
Шаг 2: Оптимизируйте рабочую нагрузку
Именно здесь кроется настоящая экономия.
Goldilocks — это инструмент с открытым исходным кодом, который отслеживает ваши рабочие нагрузки и рекомендует оптимальные настройки ресурсов на основе фактического использования:
# Install Goldilocks helm install goldilocks fairwinds-stable/goldilocks \ --namespace goldilocks \ --create-namespace # Enable monitoring for a namespace kubectl label ns your-namespace goldilocks.fairwinds.com/enabled=true
После нескольких дней сбора данных Goldilocks предоставляет рекомендации через панель управления. В нашем случае он выявил поды, которые запрашивали 4 ядра CPU, но фактически использовали 0,3.
Формула подбора оптимального размера:
- Установите количество запросов на уровне 95-го процентиля фактического использования.
- Установите лимиты памяти равными запросам на использование памяти (это предотвратит неожиданные ошибки нехватки памяти).
- Рассмотрите возможность полного снятия ограничений на использование ЦП, поскольку они часто приносят больше вреда, чем пользы, из-за чрезмерного снижения производительности.
Зачем снимать ограничения на использование CPU? CPU — это «сжимаемый» ресурс. Когда контейнер превышает свой лимит, его производительность снижается, а не завершается. Это звучит разумно, пока вы не поймете, что снижение производительности может привести к скачкам задержки, которые невероятно сложно отлаживать.
Если у вас нет особых причин ограничивать использование CPU, позволяйте контейнерам увеличивать свою производительность, когда появляется достаточно ресурсов.
Шаг 3: Внедрите автомасштабирование (правильным образом)
Большинство команд используют Horizontal Pod Autoscaler (HPA), но оставляют многое без внимания.
Настройте масштабирование автопарсинга по уровням:
- HPA масштабирует поды горизонтально на основе метрик
- VPA (Vertical Pod Autoscaler) автоматически корректирует запросы на ресурсы.
- Cluster Autoscaler или Karpenter регулируют количество узлов
Особого внимания заслуживает Karpenter. В отличие от Cluster Autoscaler, он выделяет узлы в режиме реального времени на основе ожидающих запросов на поды, автоматически выбирая наиболее экономически эффективные типы экземпляров:
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: default
spec:
requirements:
- key: "kubernetes.io/arch"
operator: In
values: ["amd64", "arm64"]
- key: "karpenter.sh/capacity-type"
operator: In
values: ["spot", "on-demand"]
limits:
resources:
cpu: 1000Обратите внимание на варианты ARM64 и Spot-экземпляров. Организации, использующие сочетание различных архитектур и Spot-экземпляров, отмечают среднюю экономию в 59%. Azure сообщает об экономии до 65% только за счет процессоров ARM.
Шаг 4: Автоматизируйте рутинные задачи
Вот где, на мой взгляд, большинство инициатив в сфере финансовых операций заходят в тупик: они генерируют отличные рекомендации, которые никто не принимает во внимание.
Традиционные инструменты часто предоставляют рекомендации без автоматизации, оставляя командам необходимость вручную корректировать настройки ресурсов. Это приводит к формированию списка задач, приоритеты в котором никогда не отдаются разработке новых функций.
Решение? Автономные платформы оптимизации.
Такие инструменты, как CAST AI и Sedai, не просто дают рекомендации, они действуют. Они непрерывно анализируют ваши нагрузки и вносят корректировки в реальном времени с соответствующими ограничениями:
- Автоматическая компоновка подов для максимального использования узлов
- Интеллектуальное планирование для предотвращения фрагментации
- Проактивное масштабирование на основе прогнозируемого (а не только текущего) спроса.
Для команд, которым некомфортно работать с полной автоматизацией, эти инструменты могут сначала работать в «режиме рекомендаций». Но настоящая экономия приходит при полном автономном режиме.
Шаг 5: Управление и обеспечение устойчивого развития
Оптимизация затрат — это не проект, а практика.
- Для всех производственных нагрузок необходимо запрашивать ресурсы (используйте OPA Gatekeeper или Kyverno).
- Установите квоты ресурсов на уровне пространства имен.
- Просматривайте панели мониторинга затрат на еженедельных совещаниях команды.
- Создавайте оповещения в Slack/Teams о нетипичных расходах.
# Example: Block deployments without resource requests
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-requests
spec:
validationFailureAction: Enforce
rules:
- name: validate-requests
match:
resources:
kinds:
- Pod
validate:
message: "CPU and memory requests are required"
pattern:
spec:
containers:
- resources:
requests:
memory: "?*"
cpu: "?*"Концепция FinOps Foundation (Информирование, Оптимизация, Эксплуатация) идеально подходит для Kubernetes. Начните с обеспечения прозрачности, применяйте целенаправленные исправления, а затем выстройте систему управления, чтобы экономия сохранялась.
Быстрые победы на этой неделе
Если вы хотите быстро увидеть результаты, сосредоточьтесь на этих эффективных действиях:
- Устраните «зомби-нагрузки» в непроизводственной среде: масштабируйте dev/staging до нуля вне рабочего времени.
- Объедините балансировщики нагрузки: каждый LoadBalancer создает облачные ресурсы; используйте Ingress
- Удалите неиспользуемые PVC: затраты на хранение данных накапливаются; найдите и удалите оставшиеся тома
- Проанализируйте телеметрию с высокой кардинальностью: затраты на наблюдаемость могут быть сопоставимы с вычислительными; оптимизируйте метрики.
Большинство команд добиваются ощутимого снижения показателей в течение двух недель, сосредоточившись на этих четырех областях.
Настоящий урок
Вот что я понял, взяв под контроль наши расходы: с технологиями никогда не было сложно.
Самым сложным было обеспечить прозрачность и подотчетность. Как только команды смогли видеть свои затраты и поняли, что за ними следят, поведение изменилось естественным образом. Инженеры начали спрашивать: «Нужно ли нам это?», прежде чем запускать ресурсы. Оптимизация ресурсов стала частью контрольного списка развертывания, а не второстепенным вопросом.
Статистика в 99,94% ужасает, но она также открывает возможности. В вашем кластере Kubernetes почти наверняка скрываются значительные потери. Инструменты для обнаружения и устранения этих потерь являются зрелыми, бесплатными или недорогими и проверенными на практике.
Вопрос лишь в том, собираетесь ли вы что-нибудь с этим предпринять.
Готовы начать? На этой неделе разверните OpenCost, включите функцию Goldilocks для одного пространства имен и проведите анализ затрат со своей командой. Гарантирую, вас ждут сюрпризы.
Эти кластеры, составляющие 0,06%, не возникли случайно. Они достигли этого, сделав повышение экономической эффективности частью своей деятельности. Вы тоже можете это сделать.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.