Kubecost — это инструмент для отслеживания и оптимизации затрат в Kubernetes. Он помогает в реальном времени понимать, сколько ресурсов (CPU, RAM, хранилище и пр.) потребляет каждый компонент (под, сервис, namespace, deployment), и как это соотносится с деньгами. В основном его используют для мониторинга затрат в разрезе отдельных сервисов и для оптимизации ресурсов.
Kubecost делает расходы прозрачными, позволяя видеть, сколько стоит каждое приложение или пространство имен. Неиспользуемые ресурсы выявляются автоматически.
Приложение полезно DevOps-инженерам для управления ресурсами и их оптимизации, финансовым аналитикам для отслеживания расходов на инфраструктуру и менеджерам проектов для распределения затрат между командами и проектами.
В этой статье мы рассмотрим установку, интеграцию и первичную настройку Kubecost.
Рассмотрим процесс установки Kubecost пошагово.
Для работы с Kubecost понадобятся:
kubectl
.Облачная инфраструктура Timeweb Cloud предоставляет возможность создать кластер Kubernetes с рекомендуемой конфигурацией (CPU 2 x 3.3 ГГЦ, RAM 4 Гб, NVMe 60 Гб) стоимостью от 1090 рублей в месяц.
О том, как создать кластер, мы рассказывали в документации. Для более комфортного мониторинга можете дополнительно установить Kubernetes Dashboard всего одной кнопкой.
Когда кластер создан, нужно к нему подключиться — рекомендуем через Lens. Процесс подключения подробно описали в статье.
Для работы потребуется терминал с контекстом нашего кластера. Для этого перейдем во вкладку «Overview» (1), а далее внизу нажмем на кнопку «Terminal» (2).
Вся работа с консольными командами будет происходить здесь.
k8s
Kubernetes для правильной работы требует обособленное хранилище. Для разработки хорошо подойдет Local Path Provisioner, а для продакшен-сред рекомендуем внешнее отказоустойчивое хранилище.
Удобно использовать в тестовых и локальных средах, когда достаточного одного узла и небольшой отказоустойчивости. Но в случае активного тестирования в кластере с несколькими узлами его может не хватить, так как он ограничен локальными дисками.
Подробно рассмотрим, как установить этот тип через готовый манифест от Rancher:
curl -s https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml | \
sed 's|rancher/|dockerhub.timeweb.cloud/rancher/|g' | \
kubectl apply -f -
Примерный ожидаемый вывод:
namespace/local-path-storage created
serviceaccount/local-path-provisioner-service-account created
role.rbac.authorization.k8s.io/local-path-provisioner-role created
clusterrole.rbac.authorization.k8s.io/local-path-provisioner-role created
rolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
clusterrolebinding.rbac.authorization.k8s.io/local-path-provisioner-bind created
deployment.apps/local-path-provisioner created
storageclass.storage.k8s.io/local-path created
configmap/local-path-config created
Убедимся, что под запустился:
kubectl get pods -n local-path-storage
Ожидаемый вывод:
NAME READY STATUS RESTARTS AGE
local-path-provisioner-xxx 1/1 Running 0 68s
После установки должен появиться StorageClass с именем local-path
:
kubectl get sc
Ожидаемый вывод:
NAME PROVISIONER … VOLUMEBINDINGMODE AGE
local-path rancher.io/local-path … WaitForFirstConsumer 5s
Если необходимо, можете установить созданный local-path
как класс по умолчанию:
kubectl patch storageclass local-path \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Ожидаемый вывод:
storageclass.storage.k8s.io/local-path patched
В боевой эксплуатации, где важны высокодоступные тома и автоматический реплейсмент при сбоях узлов, предпочтительнее использовать более надежные решения, чем Local Path Provisioner. Таким может стать хранилище S3 от Timeweb Cloud. Установить его просто, а подробно об этом мы писали в документации.
Добавим репозиторий Kubecost и обновим его:
helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update
Далее используйте одну из двух консольных команд:
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost --create-namespace
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost --create-namespace \
--set global.storageClass=<STORAGECLASS>
Ожидаемый вывод:
Kubecost 2.x.x has been successfully installed.
Проверим, что созданные Kubecost объекты PVC установлены правильно и находятся в состоянии Bound.
kubectl get pvc -n kubecost
Ожидаемый вывод (ответ усечен):
NAME STATUS
kubecost-cost-analyzer Bound
kubecost-prometheus-server Bound
Обратите внимание, что каждый из PVC должен иметь статус Bound
.
Теперь сделаем заключительную проверку: удостоверимся, что все поды запущены и не возникает ошибок.
kubectl get pod -n kubecost
Ожидаемый вывод:
NAME READY STATUS RESTARTS
kubecost-cost-analyzer-xxx 4/4 Running 0
kubecost-forecasting-xxx 1/1 Running 0
kubecost-grafana-xxx 2/2 Running 0
kubecost-prometheus-server-xxx 1/1 Running 0
Если вы видите такое сообщение, то Kubecost установлен верно.
Чтобы управлять Kubecost и смотреть его метрики, нужно пробросить порт на локальную машину. Сперва узнаем название сервиса, используемого Kubecost:
kubectl get svc -n kubecost
Ожидаемый вывод (ответ усечен):
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT
kubecost-aggregator ClusterIP 10.110.58.101 <none> 9004/TCP
kubecost-cloud-cost ClusterIP 10.97.42.22 <none> 9005/TCP
kubecost-cost-analyzer ClusterIP 10.111.138.113 <none> 9090/TCP
kubecost-forecasting ClusterIP 10.109.77.33 <none> 5000/TCP
kubecost-grafana ClusterIP 10.107.201.48 <none> 80/TCP
kubecost-prometheus-s... ClusterIP 10.101.199.115 <none> 80/TCP
Нужный сервис обычно называется kubecost-cost–analyzer
. Ему соответствует порт 9090 — именно его нужно пробросить.
kubectl port-forward -n kubecost service/kubecost-cost-analyzer 9090:9090
Ожидаемый вывод:
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090
Теперь мы можем продолжить работу с Kubecost в веб-интерфейсе по адресу http://localhost:9090
. Он показан на скриншоте, с метриками пустого кластера.
Обратите внимание, что пользовательский интерфейс приложения может изменяться от версии к версии: меняется текст на кнопках, показатели и др.
Для первичной настройки приложения перейдите во вкладку «Settings». Вкладки расположены слева и могут быть скрыты.
Рекомендуется заполнить для корректного подсчета затрат кластера.
Пролистайте страницу настроек до раздела «Pricing», далее активируйте переключатель в блоке «Enable Custom Pricing». Приложение предложит ввести стоимость ресурсов самостоятельно.
При использовании Timeweb Cloud эту информацию можно посмотреть на странице создания нового кластера или при расчете стоимости инфраструктуры. В разделе «3. Конфигурация воркер нод» перейдите на вкладку «Произвольная». Вы увидите слайдеры, которые показывают стоимость выбранной конфигурации.
Обратите внимание, что в Timeweb Cloud при использовании воркер нод фиксированной конфигурации стоимость ниже аналогичной, собранной в произвольном режиме.
Суммы можно указывать в российских рублях, но интерфейс всё равно будет показывать метку $ вместо ₽. Или можно самостоятельно конвертировать стоимость из панели в доллары США.
Пример заполнения полей:
Поле |
Примерное значение (в российских рублях) |
Обоснование |
Monthly CPU Price |
210 |
Цена за 1 vCPU |
Monthly Spot CPU Price* |
0 |
Цена за 1 vCPU Spot |
Monthly RAM Price |
120 |
Цена за 1 ГБ RAM |
Monthly Spot RAM Price* |
0 |
Цена за 1 ГБ RAM Spot |
Monthly GPU Price* |
0 |
Цена за 1 GPU |
Monthly Storage Price |
12 |
Цена за 1 ГБ хранилища |
* — не используется в Timeweb Cloud.
Лейблы используются для идентификации, группировки и детализации затрат, связанных с использованием ресурсов Kubernetes.
Пролистайте страницу настроек до раздела «Labels». Меню лейблов схоже с настройкой модели затрат. Описание полей приведено в таблице:
Название |
Описание |
Значение по умолчанию |
Owner Label / Annotation |
Указывает владельца ресурса (например, пользователь или команда)* |
owner |
Team Label |
Определяет команду, использующую ресурс* |
team |
Department Label |
Связывает ресурс с отделом или центром затрат* |
department |
Product Label |
Указывает приложение или продукт, для которого используется ресурс* |
app |
Environment Label |
Обозначает среду (например, dev, prod, staging), в которой используется ресурс |
env |
GPU Label |
Имя лейбла на уровне узла Kubernetes, обозначающее тип GPU |
— |
GPU Label Value |
Значение лейбла, указывающее, что узел содержит GPU |
— |
* — поддерживает формат CSV.
Kubecost получает метрики из Prometheus.
Пролистайте настройки до раздела «Prometheus Status» — он почти в самом низу страницы. Вы должны увидеть зеленые галочки напротив каждой метрики, как показано на скриншоте:
Если показатели отсутствуют, Kubecost может работать не так, как ожидалось. Полную диагностику работы приложения можно посмотреть на странице http://localhost:9090/diagnostics
.
Kubecost умеет предупреждать пользователей о непредвиденных ситуациях. Уведомления могут приходить по Email, в Slack, в сторонние сервисы через вебхуки или Microsoft Teams.
Перейдите во вкладку «Alerts» (1). Далее впишите нужные значения в полях ввода каналов получения информации в разделе «Global Recipients» (2): отправка уведомлений таким получателям будет производиться для всех настроенных оповещений.
Чуть ниже в этой же вкладке можно добавить условия уведомлений и получателей только для выбранного типа. Описание каждого типа доступно ниже:
Название |
Описание |
Allocation Budget |
Бюджет для распределения расходов на уровне namespace, команды или проекта. Уведомляет о превышении. |
Allocation Efficiency |
Эффективность использования ресурсов (например, CPU, RAM) в рамках заданного бюджета или namespace. |
Allocation Recurring Update |
Регулярное обновление данных о распределении ресурсов и их стоимости. |
Allocation Spend Change |
Уведомления об изменениях в расходах на распределение ресурсов (например, значительное увеличение). |
Asset Budget |
Бюджет для физических или виртуальных ресурсов (узлы, GPU, диски). Уведомляет о превышении. |
Asset Recurring Update |
Регулярное обновление данных об использовании физических или виртуальных ресурсов. |
Cloud Cost Budget |
Бюджет для расходов в облаке. Уведомляет, если расходы превышают установленный лимит. |
Иногда может потребоваться полностью удалить Kubecost с кластера для устранения ошибок. Например, если StorageClass до установки не был указан по умолчанию и не прописан явно в команде.
Для полного удаления используется команда:
helm uninstall kubecost -n kubecost
kubectl delete ns kubecost
Для повторной установки выполните действия, описанные во втором шаге.
В таблице приведены возможные ошибки и способы их решения.
Ошибка |
Характерные признаки ошибки |
Возможное решение |
Нехватка оперативной памяти |
OOMKilled (OutOfMemory)
|
Добавление новых воркер-нод в панели Timeweb Cloud (вкладка «Ресурсы» на странице кластера). В этом случае Kubernetes автоматически проверит, где лучше запланировать под, если текущая нода перегружена. |
Нехватка мощностей CPU или дискового пространства |
Поды не успевают корректно запуститься и входят в цикл CrashLoopBackOff. Kubecost иногда не сможет собирать полные метрики из Prometheus — пользователь не увидит корректные данные о затратах. |
|
Нехватка дискового пространства |
Prometheus не записывает историю. Лог содержит сообщения вида:
или ошибки о невозможности записать WAL (Write Ahead Log). |
Действия будут зависеть от типа хранилища PersistentVolumeClaim. Внешнее хранилище: увеличьте объем диска через панель управления провайдера. После увеличения объема убедитесь, что операционная система распознала новое пространство и, при необходимости, расширьте файловую систему. Локальное хранилище: добавьте новый диск к серверу и перенесите данные Prometheus на новый объем. |
Замедление ответа/проблемы с графиками |
У Kubecost заметно дольше прогружаются панели и графики, наблюдаются таймауты на уровне UI. |
Проверьте использование ресурсов подами Kubecost и Prometheus, увеличьте их requests и limits, если они перегружены. Оптимизируйте конфигурацию Prometheus: уменьшите время хранения данных ( Если используется внешняя база данных, проверьте ее производительность. Перезапустите деплойменты Kubecost и Prometheus после внесения изменений, чтобы применить настройки. |
Ни один из двух доступных узлов не может найти подходящий объект PersistentVolume для связывания с PersistentVolumeClaim |
Ошибка в логе или в Kubernetes Dashboard 0/2 nodes are available: 2 node(s) didn't find available persistent volumes to bind. |
Обратитесь к первому шагу инструкции и переустановите Kubecost. |
PVC «Pending» (зависший том) |
При выполнении В описании PVC ( |
|
Ошибки метрик Prometheus (недоступны) |
В панели Kubecost нет данных по расходам/графики пустые В логах Kubecost «Unable to query Prometheus» В логах Prometheus ошибки чтения данных |
Убедитесь, что Prometheus запущен ( Исправить проблемы хранения (достаточно ли места PV?). |
«Helm release failed» при установке Kubecost |
Команда helm install или helm upgrade падает с ошибками, например «chart not found» или «failed to create resource» |
Вернитесь ко второму шагу. Убедитесь, что у вас достаточные права (RBAC) и создаётся namespace kubecost, если он не существует. |
Недоступен UI Kubecost (нет доступа по порту) |
При обращении к внешнему IP вы видите, что подключение сбрасывается или «Connection Refused» |
Используйте Настроить сервис типа NodePort или LoadBalancer, чтобы открыть доступ снаружи Убедитесь, что firewall/политики безопасности разрешают доступ к нужному порту. |
Отсутствие реальных тарифов (стоимость по нулям) |
В разделе «Cost Allocation» всё показывает по 0 $ или близко к тому Нет реальной разбивки по ресурсам |
В вкладке «Settings» укажите реальную модель затрат вручную (On-Prem) |
Выгодные тарифы на облако в Timeweb Cloud
Kubecost — мощный инструмент для мониторинга и оптимизации затрат в Kubernetes, который позволяет сделать расходы на инфраструктуру прозрачными и управляемыми. В статье подробно разобрали процесс установки и настройки Kubecost, включая подготовку кластера, выбор хранилища, установку через Helm, настройку модели затрат и интеграцию с Prometheus.
Эффективное использование Kubecost помогает не только сократить издержки, но и улучшить управление ресурсами на уровне команд, проектов и приложений. Следуя инструкции, вы сможете развернуть решение и адаптировать его под потребности вашей инфраструктуры.