Kubecost: руководство по установке и первичной настройке

    Команда Simple-Server
    03.06.2026
    13 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

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

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

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

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

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

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

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

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

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

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

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

    Хранилище Local Path Provisioner

    Удобно использовать в тестовых и локальных средах, когда достаточного одного узла и небольшой отказоустойчивости. Но в случае активного тестирования в кластере с несколькими узлами его может не хватить, так как он ограничен локальными дисками.

    Подробно рассмотрим, как установить этот тип через готовый манифест от Rancher:

    Примерный ожидаемый вывод:

    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:

    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 от Simple-Server. Установить его просто, а подробно об этом мы писали в документации.

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

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

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

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

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

    Пролистайте страницу настроек до раздела «Pricing», далее активируйте переключатель в блоке «Enable Custom Pricing». Приложение предложит ввести стоимость ресурсов самостоятельно.

    При использовании Simple-Server эту информацию можно посмотреть на странице создания нового кластера или при расчете стоимости инфраструктуры. В разделе «3. Конфигурация воркер нод» перейдите на вкладку «Произвольная». Вы увидите слайдеры, которые показывают стоимость выбранной конфигурации.

    Обратите внимание, что в Simple-Server при использовании воркер нод фиксированной конфигурации стоимость ниже аналогичной, собранной в произвольном режиме.

    Суммы можно указывать в российских рублях, но интерфейс всё равно будет показывать метку $ вместо ₽. Или можно самостоятельно конвертировать стоимость из панели в доллары США.

    ПолеПримерное значение (в российских рублях)Обоснование
    Monthly CPU Price210Цена за 1 vCPU
    Monthly Spot CPU Price*0Цена за 1 vCPU Spot
    Monthly RAM Price120Цена за 1 ГБ RAM
    Monthly Spot RAM Price*0Цена за 1 ГБ RAM Spot
    Monthly GPU Price*0Цена за 1 GPU
    Monthly Storage Price12Цена за 1 ГБ хранилища
    • — не используется в Simple-Server.

    Установка собственных лейблов

    Лейблы используются для идентификации, группировки и детализации затрат, связанных с использованием ресурсов 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—

    Указывает владельца ресурса (например, пользователь или команда)*

    Определяет команду, использующую ресурс*

    Связывает ресурс с отделом или центром затрат*

    Указывает приложение или продукт, для которого используется ресурс*

    Обозначает среду (например, dev, prod, staging), в которой используется ресурс

    Имя лейбла на уровне узла Kubernetes, обозначающее тип GPU

    Значение лейбла, указывающее, что узел содержит GPU

    • — поддерживает формат CSV.

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

    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Бюджет для расходов в облаке. Уведомляет, если расходы превышают установленный лимит.

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

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

    Allocation Recurring Update

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

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

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

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

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

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

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

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

    helm uninstall kubecost -n kubecost kubectl delete ns kubecost

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

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

    ОшибкаХарактерные признаки ошибкиВозможное решение
    Нехватка оперативной памятиOOMKilled (OutOfMemory)
    Лог может содержать данные: State: Waiting
    Reason: CrashLoopBackOff
    Last State: Terminated
    Reason: OOMKilledДобавление новых воркер-нод в панели Simple-Server (вкладка «Ресурсы» на странице кластера). В этом случае 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)

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

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

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

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

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

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

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

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

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

    или ошибки о невозможности записать 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)


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны