Материал подготовлен командой 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 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 ГБ хранилища |
- — не используется в 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.