<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Публичное облако на базе VMware с управлением через vCloud Director

Как установить Kubecost: полное руководство

Роман Панков
Роман Панков
Технический писатель
29 января 2025 г.
56
13 минут чтения
Средний рейтинг статьи: 5

Kubecost — это инструмент для отслеживания и оптимизации затрат в Kubernetes. Он помогает в реальном времени понимать, сколько ресурсов (CPU, RAM, хранилище и пр.) потребляет каждый компонент (под, сервис, namespace, deployment), и как это соотносится с деньгами. В основном его используют для мониторинга затрат в разрезе отдельных сервисов и для оптимизации ресурсов.

Kubecost делает расходы прозрачными, позволяя видеть, сколько стоит каждое приложение или пространство имен. Неиспользуемые ресурсы выявляются автоматически.

Приложение полезно DevOps-инженерам для управления ресурсами и их оптимизации, финансовым аналитикам для отслеживания расходов на инфраструктуру и менеджерам проектов для распределения затрат между командами и проектами.

В этой статье мы рассмотрим установку, интеграцию и первичную настройку Kubecost. 

Установка Kubecost

Рассмотрим процесс установки Kubecost пошагово.

Шаг нулевой. Создание кластера Kubernetes и подключение

Для работы с Kubecost понадобятся:

  • Кластер Kubernetes с поддерживаемой версией (1.16 и выше).
  • Достаточное количество ресурсов в кластере (рекомендуется минимум 2 CPU и 4 ГБ оперативной памяти для подов Kubecost).
  • Инструмент для управления кластером — kubectl.

Облачная инфраструктура Timeweb Cloud предоставляет возможность создать кластер Kubernetes с рекомендуемой конфигурацией (CPU 2 x 3.3 ГГЦ, RAM 4 Гб, NVMe 60 Гб) стоимостью от 1090 рублей в месяц. 

О том, как создать кластер, мы рассказывали в документации. Для более комфортного мониторинга можете дополнительно установить Kubernetes Dashboard всего одной кнопкой. 

Когда кластер создан, нужно к нему подключиться — рекомендуем через Lens. Процесс подключения подробно описали в статье

Для работы потребуется терминал с контекстом нашего кластера. Для этого перейдем во вкладку «Overview» (1), а далее внизу нажмем на кнопку «Terminal» (2).

Image3

Вся работа с консольными командами будет происходить здесь. 

k8s

Шаг первый. Выбор типа хранилища

Kubernetes для правильной работы требует обособленное хранилище. Для разработки хорошо подойдет Local Path Provisioner, а для продакшен-сред рекомендуем внешнее отказоустойчивое хранилище.

Хранилище 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

Добавим репозиторий Kubecost и обновим его:

helm repo add kubecost https://kubecost.github.io/cost-analyzer/
helm repo update

Далее используйте одну из двух консольных команд:

Если в кластере обозначен StorageClass, используемый по умолчанию:

helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost --create-namespace

Если в кластере отсутствует StorageClass по умолчанию: 

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. Он показан на скриншоте, с метриками пустого кластера.

Image5

Как настроить Kubecost?

Обратите внимание, что пользовательский интерфейс приложения может изменяться от версии к версии: меняется текст на кнопках, показатели и др.

Для первичной настройки приложения перейдите во вкладку «Settings». Вкладки расположены слева и могут быть скрыты.

Image4

Настройка модели затрат (Cost model)

Рекомендуется заполнить для корректного подсчета затрат кластера. 

Пролистайте страницу настроек до раздела «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.

Проверка работы Prometheus

Kubecost получает метрики из Prometheus.

Пролистайте настройки до раздела «Prometheus Status» — он почти в самом низу страницы. Вы должны увидеть зеленые галочки напротив каждой метрики, как показано на скриншоте:

Image1

Если показатели отсутствуют, Kubecost может работать не так, как ожидалось. Полную диагностику работы приложения можно посмотреть на странице http://localhost:9090/diagnostics

Настройка уведомлений

Kubecost умеет предупреждать пользователей о непредвиденных ситуациях. Уведомления могут приходить по Email, в Slack, в сторонние сервисы через вебхуки или Microsoft Teams.

Перейдите во вкладку «Alerts» (1). Далее впишите нужные значения в полях ввода каналов получения информации в разделе «Global Recipients» (2): отправка уведомлений таким получателям будет производиться для всех настроенных оповещений. 

Image2

Чуть ниже в этой же вкладке можно добавить условия уведомлений и получателей только для выбранного типа. Описание каждого типа доступно ниже:

Название

Описание

Allocation Budget

Бюджет для распределения расходов на уровне namespace, команды или проекта. Уведомляет о превышении.

Allocation Efficiency

Эффективность использования ресурсов (например, CPU, RAM) в рамках заданного бюджета или namespace.

Allocation Recurring Update

Регулярное обновление данных о распределении ресурсов и их стоимости.

Allocation Spend Change

Уведомления об изменениях в расходах на распределение ресурсов (например, значительное увеличение).

Asset Budget

Бюджет для физических или виртуальных ресурсов (узлы, GPU, диски). Уведомляет о превышении.

Asset Recurring Update

Регулярное обновление данных об использовании физических или виртуальных ресурсов.

Cloud Cost Budget

Бюджет для расходов в облаке. Уведомляет, если расходы превышают установленный лимит.

Удаление и переустановка Kubecost

Иногда может потребоваться полностью удалить Kubecost с кластера для устранения ошибок. Например, если StorageClass до установки не был указан по умолчанию и не прописан явно в команде.

Для полного удаления используется команда:

helm uninstall kubecost -n kubecost
kubectl delete ns kubecost

Для повторной установки выполните действия, описанные во втором шаге.

Возможные ошибки

В таблице приведены возможные ошибки и способы их решения.

Ошибка

Характерные признаки ошибки

Возможное решение

Нехватка оперативной памяти

OOMKilled (OutOfMemory)
Лог может содержать данные:

State:      Waiting
  Reason:   CrashLoopBackOff
Last State: Terminated
  Reason:   OOMKilled

Добавление новых воркер-нод в панели Timeweb Cloud (вкладка «Ресурсы» на странице кластера). В этом случае Kubernetes автоматически проверит, где лучше запланировать под, если текущая нода перегружена. 

Нехватка мощностей CPU или дискового пространства

Поды не успевают корректно запуститься и входят в цикл CrashLoopBackOff.

Kubecost иногда не сможет собирать полные метрики из Prometheus — пользователь не увидит корректные данные о затратах.

Нехватка дискового пространства

Prometheus не записывает историю. Лог содержит сообщения вида:

level=warn ts=... caller=head.go:xxx msg="Storage retention limit reached"

или ошибки о невозможности записать WAL (Write Ahead Log).

Действия будут зависеть от типа хранилища PersistentVolumeClaim. 

Внешнее хранилище: увеличьте объем диска через панель управления провайдера. После увеличения объема убедитесь, что операционная система распознала новое пространство и, при необходимости, расширьте файловую систему.

Локальное хранилище: добавьте новый диск к серверу и перенесите данные Prometheus на новый объем.

Замедление ответа/проблемы с графиками

У Kubecost заметно дольше прогружаются панели и графики, наблюдаются таймауты на уровне UI.

Проверьте использование ресурсов подами Kubecost и Prometheus, увеличьте их requests и limits, если они перегружены. Оптимизируйте конфигурацию Prometheus: уменьшите время хранения данных (--storage.tsdb.retention.time), включите предварительное агрегирование метрик с помощью recording rules, и увеличьте тайм-аут запросов (--query.timeout). 

Если используется внешняя база данных, проверьте ее производительность. Перезапустите деплойменты 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» (зависший том)

При выполнении kubectl get pvc -n kubecost видим статус Pending

В описании PVC (kubectl describe pvc) нет PV или ошибка «no storageclass found»

Ошибки метрик Prometheus (недоступны)

В панели Kubecost нет данных по расходам/графики пустые

В логах Kubecost «Unable to query Prometheus»

В логах Prometheus ошибки чтения данных

Убедитесь, что Prometheus запущен (kubectl get pods -n kubecost, где он установлен)

Исправить проблемы хранения (достаточно ли места PV?).

«Helm release failed» при установке Kubecost

Команда helm install или helm upgrade падает с ошибками, например «chart not found» или «failed to create resource»

Вернитесь ко второму шагу.

Убедитесь, что у вас достаточные права (RBAC) и создаётся namespace kubecost, если он не существует.

Недоступен UI Kubecost (нет доступа по порту)

kubectl port-forward запущен, но страница по http://<node_ip>:9090 не открывается

При обращении к внешнему IP вы видите, что подключение сбрасывается или «Connection Refused»

Используйте http://localhost:9090, если проброс портов запущен локально на вашей машине

Настроить сервис типа NodePort или LoadBalancer, чтобы открыть доступ снаружи

Убедитесь, что firewall/политики безопасности разрешают доступ к нужному порту.

Отсутствие реальных тарифов (стоимость по нулям)

В разделе «Cost Allocation» всё показывает по 0 $ или близко к тому

Нет реальной разбивки по ресурсам

В вкладке «Settings» укажите реальную модель затрат вручную (On-Prem) 

Выгодные тарифы на облако в Timeweb Cloud

Заключение

Kubecost — мощный инструмент для мониторинга и оптимизации затрат в Kubernetes, который позволяет сделать расходы на инфраструктуру прозрачными и управляемыми. В статье подробно разобрали процесс установки и настройки Kubecost, включая подготовку кластера, выбор хранилища, установку через Helm, настройку модели затрат и интеграцию с Prometheus.

Эффективное использование Kubecost помогает не только сократить издержки, но и улучшить управление ресурсами на уровне команд, проектов и приложений. Следуя инструкции, вы сможете развернуть решение и адаптировать его под потребности вашей инфраструктуры.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
29 января 2025 г.
56
13 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев