Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки
Назначение
Функциональность Биллинг и управление расходами отвечает на вопрос «сколько стоит использование инфраструктуры» и позволяет представить эту стоимость в виде, удобном для финансовой службы, руководителей подразделений и владельцев проектов.
Commander собирает фактические данные о потреблении ресурсов (CPU, память, хранилище) со всех управляемых кластеров, применяет к ним заданные администратором тарифы и показывает результат в трёх формах:
- интерактивный дашборд с разбивкой по рабочим пространствам, кластерам, проектам, неймспейсам, контроллерам, видам ресурсов и типам оборудования;
- отчёты — мгновенные (по запросу) и регулярные (по расписанию), с выгрузкой в CSV;
- единый список тарифов и тарифицируемых ресурсов с предупреждениями о непривязанных ресурсах и расхождениях с фактическим потреблением.
По умолчанию функциональность выключена. Порядок включения — в руководстве администратора.
Основные понятия
В биллинге участвуют три сущности: кластеры с вычислительными ресурсами, тарифы с ценами за эти ресурсы и тарифицируемые ресурсы, которые связывают первые со вторыми.
Тарифицируемый ресурс — связующее звено: с одной стороны он привязан к тарифу (это даёт цену), с другой — к кластеру (это даёт поток данных о потреблении). Как только связь установлена, Deckhouse Commander автоматически помечает узлы кластера служебными метками и начинает получать метрики. Дашборд и отчёты берут эти метрики, умножают на цены из тарифа и показывают стоимость.
Привязка к кластеру в большинстве случаев происходит автоматически — при подключении облачного кластера Deckhouse Commander сам создаёт классы и связывает их с группами узлов. Для статических кластеров привязку нужно выполнить вручную.
Для классов хранилища привязка работает строго по имени: если в кластере есть Kubernetes StorageClass с именем network-ssd, он автоматически сопоставляется с одноимённым классом хранилища в биллинге. Ручное переопределение привязки для классов хранилища пока не поддерживается. В действующем тарифе может быть несколько классов хранилища с разными ценами, однако цена задаётся на имя класса глобально: нельзя назначить разную стоимость для network-ssd в кластере на одной площадке и network-ssd в кластере на другой.
Подробнее о каждом термине:
- Тариф — прайс-лист: какие типы вычислительных ресурсов и хранилища сколько стоят за единицу в час. В один момент времени действует один тариф. Старые тарифы остаются в истории, чтобы не пересчитывать прошлые периоды.
- Вычислительный класс — именованный тип вычислительных ресурсов с собственной ценой. Аналог «размера виртуальной машины» в каталоге облачного провайдера: один класс объединяет узлы с одинаковыми характеристиками, для которых логично задать единую стоимость CPU и памяти. Примеры имён:
standard-v3-cf-100,m1.large,c4-16gb. - Класс хранилища — именованный тип хранилища с собственной ценой за гигабайт. Совпадает по имени с классом хранилища Kubernetes (
StorageClass), через который в кластере создаются тома. Примеры:network-ssd,linstor-thin-r2,ceph-block-gold. - Тарифицируемый ресурс — ресурс, для которого заданы цена в тарифе и фактические данные о потреблении. В текущем релизе это вычислительные классы и классы хранилища; в будущих релизах перечень может расшириться.
- Агент (
commander-agent) — компонент, который устанавливается в каждый управляемый кластер и связывает его с Deckhouse Commander. Для биллинга агент выполняет две задачи: сообщает Deckhouse Commander данные о группах узлов и классах хранилища этого кластера, а также добавляет на узлы служебную метку, по которой Deckhouse Commander определяет, к какому вычислительному классу относится каждый узел.
Как Commander считает расходы
Механизм расчёта намеренно сделан прозрачным и опирается на уже привычную для Kubernetes-администратора связку с Prometheus:
- В каждом управляемом кластере должен быть включён и работать штатный модуль prometheus Deckhouse — в Deckhouse Kubernetes Platform он включён по умолчанию. Prometheus собирает метрики потребления ресурсов (CPU, память, хранилище) — это стандартные данные, доступные в любом кластере с этим модулем.
- На каждый узел автоматически добавляется служебный лейбл
billing.commander.deckhouse.io/nameсо значением имени вычислительного класса. То же имя используется в действующем тарифе как ключ для поиска цены. - Для хранилища ключом выступает имя класса хранилища Kubernetes — оно уже присутствует в метриках по умолчанию.
- Метрики потребления передаются из Prometheus управляемого кластера в Prometheus управляющего кластера с помощью механизма
PrometheusRemoteWrite. Отдельная настройка не требуется: при включении биллинга Commander сам создаёт нужныйPrometheusRemoteWriteв прикладном кластере. Commander умножает полученные метрики на цены из действующего тарифа и строит ряды стоимости по времени. - Эти ряды используются дашбордом и отчётами: любая выборка сводится к сумме стоимости по выбранным срезам.
Никакие решения о цене не принимаются в момент построения отчёта — цена берётся из того тарифа, который действовал на каждый конкретный час периода.
Включение и предварительные шаги
Шаги, которые обычно выполняются один раз при запуске функциональности:
- Администратор включает биллинг в настройках модуля Commander.
- Агент (
commander-agent), уже работающий в каждом управляемом кластере, начинает дополнительно передавать в Deckhouse Commander информацию о группах узлов и классах хранилища. Одновременно Deckhouse Commander создаёт в управляемом кластере ресурсPrometheusRemoteWrite, направленный на Prometheus управляющего кластера, — через него поступают метрики потребления. Никаких ручных действий с конфигурацией Prometheus в прикладных кластерах не требуется. - Для облачных кластеров Commander автоматически создаёт вычислительные классы и классы хранилища на основе полученных данных.
- Для статических кластеров классы хранилища также создаются автоматически. Вычислительные классы в статическом кластере администратор создаёт самостоятельно либо заранее указывает в шаблоне группы узлов лейбл
billing.commander.deckhouse.io/name: <имя-класса>— тогда Commander предложит создать соответствующий класс, как только увидит этот лейбл на появившихся узлах. - Администратор создаёт тариф и задаёт цены для появившихся вычислительных классов и классов хранилища.
После этого дашборд и отчёты начинают показывать стоимость с момента начала действия тарифа.
Управление доступом
Доступ к функциональности настраивается в разделе «Пользователи и права». Биллинг разделён на четыре независимых ресурса, каждый из которых можно выдать отдельной роли:
billingdashboard— доступ к дашборду и аналитике.billingtariffs— управление тарифами (вкладка «Тарифы» в разделе «Тарификация»).billingresources— управление вычислительными классами, классами хранилища и их назначениями на ресурсы кластеров (вкладки «Вычислительные классы» и «Классы хранилища»).billingreports— управление отчётами.
В боковом меню отображаются только те разделы, к которым у пользователя есть доступ.
Вычислительные классы и классы хранилища
Зачем нужны классы
Для облачных кластеров вычислительные классы и классы хранилища создаются и привязываются автоматически — Deckhouse Commander определяет типы инстансов и классы хранилища по данным от агента. Ручная настройка не требуется, однако при необходимости можно скорректировать автоматически созданные классы и их привязки.
Для статических кластеров автоматическое определение вычислительных классов невозможно (нет метаданных облачного инстанса), поэтому их нужно создать и привязать вручную. Классы хранилища при этом всё равно определяются автоматически.
В предыдущих версиях администратор должен был вручную прописывать метку billing.commander.deckhouse.io/name на каждую группу узлов в каждом кластере — и в облачных, и в статических. Классы убирают эту ручную работу для облачных кластеров:
- Commander сам формирует имена классов из параметров облачного инстанса (или получает их из шаблона группы узлов), сам добавляет соответствующий лейбл на узлы через агента и сам поддерживает его при пересоздании узлов. Правка манифестов кластеров больше не нужна.
- У класса два атрибута: технический идентификатор и понятное имя. Идентификатор используется как значение лейбла
billing.commander.deckhouse.io/nameна узлах и как ссылка на класс из тарифа, поэтому он должен соответствовать требованиям Kubernetes к значению лейбла. Понятное имя отображается в интерфейсе и отчётах, его можно свободно редактировать, не меняя идентификатор: например, для идентификатораstandard-v3-cf-100задать имя «Стандартный (2 vCPU, 4 ГиБ)». - Класс — единая сущность, видимая в разделе биллинга: идентификатор, имя, описание, список кластеров, где он используется. Можно открыть класс и увидеть, какие группы узлов ему соответствуют.
- Один класс может использоваться сразу в нескольких кластерах (например, одинаковая конфигурация узлов в трёх кластерах одной площадки) и в нескольких тарифах.
- Цена задаётся один раз в тарифе на идентификатор класса.
Откуда берутся классы
В большинстве случаев классы создаются автоматически:
- Облачные кластеры. Как только в кластере появляется группа узлов с облачным типом (
CloudEphemeral,CloudPermanent), Commander получает от агента описание используемогоInstanceClass, вычисляет по нему имя вычислительного класса по правилам провайдера и создаёт класс, если такого ещё нет. Сразу после создания облачного кластера пользователь видит в разделе «Тарификация» полный набор классов, которыми пользуется этот кластер. - Классы хранилища создаются автоматически во всех кластерах — и в облачных, и в статических. Как только агент сообщает Commander, что в кластере появился класс хранилища Kubernetes с именем, для которого ещё нет биллингового класса хранилища, Commander создаёт его автоматически.
Для статических кластеров вычислительные классы автоматически не появляются (агент не может вывести их из конфигурации оборудования). У пользователя есть два способа:
- Создать вычислительные классы вручную в разделе «Тарификация → Вычислительные классы».
- Заранее указать в шаблоне группы узлов лейбл
billing.commander.deckhouse.io/name: <имя-класса>. Когда агент увидит этот лейбл на появившихся узлах, Commander предложит создать соответствующий вычислительный класс — принять предложение можно в один клик.
Автоматически сгенерированные имена классов
Имя вычислительного класса не случайное — оно формируется из характеристик инстанса, которые влияют на цену. Так администратор сразу видит, о каком типе ресурса идёт речь, а Commander гарантирует, что узлы с одинаковой конфигурацией попадут в один класс.
| Провайдер | Правило формирования имени | Пример |
|---|---|---|
| Yandex Cloud | {platformID}-cf-{coreFraction} |
standard-v3-cf-100 |
| AWS | {instanceType} |
m5.xlarge |
| GCP | {machineType} |
n1-standard-4 |
| Azure | {machineSize} |
standard-f4 |
| OpenStack | {flavorName} |
m1.large |
| vSphere / zVirt / Dynamix | {numCPUs}c-{memory}m |
4c-8192m |
| VMware Cloud Director | {sizingPolicy} |
4cpu-8mem |
| Huawei Cloud | {flavorName} |
s6.xlarge.2 |
| DVP (Deckhouse Virtualization Platform) | {virtualMachineClassName}-cf-{coreFraction} |
generic-cf-100 |
Если созданное автоматически имя не устраивает, его можно изменить в момент принятия предложения Commander. После того как класс уже связан с кластером, имя становится защищённым от редактирования — оно используется как ключ в метриках Prometheus, и переименование разорвёт связь с историческими данными о потреблении.
Приоритет ручных назначений
Если администратор вручную изменил соответствие «группа узлов ↔ класс» (например, решил перевести одну группу узлов из класса standard-v3-cf-100 в отдельный класс gpu-enabled), автоматическое сопоставление не вернёт назначение обратно. Ручные назначения всегда имеют приоритет над автоматическими.
Раздел «Тарификация»
Раздел «Тарификация» в боковом меню содержит три вкладки:
- Вычислительные классы — список классов, действия создания, редактирования и удаления, переход на детальную страницу класса.
- Классы хранилища — список классов, действия создания, редактирования и удаления, детальная страница класса в режиме просмотра.
- Тарифы — список тарифов, создание и редактирование тарифов.
Если на какой-то из вкладок есть расхождение (группы узлов без класса, метрики в Prometheus без соответствующего класса, ресурсы без цены в тарифе и т.п.), на заголовке вкладки появляется оранжевый индикатор, а внутри — предупреждение с описанием проблемы и подсказками по её устранению.
Вычислительные классы
На вкладке отображается таблица: имя класса, описание и перечень кластеров, где класс используется. По имени класса открывается детальная страница со списком групп узлов во всех связанных кластерах. Там же можно:
- вручную назначить класс на дополнительную группу узлов (например, в статическом кластере);
- снять назначение, если класс был выставлен автоматически, но не подходит для этого конкретного кластера;
- увидеть, какие назначения выставлены вручную (имеют приоритет), а какие — автоматически.
На этой же вкладке отображаются предложения Commander:
- «Создать вычислительный класс для такой-то группы узлов» — если Commander увидел в кластере тип инстанса, для которого класс ещё не создан;
- «Класс для лейбла из Prometheus» — если в исторических метриках есть значения лейбла
billing.commander.deckhouse.io/name, которым сейчас не соответствует ни один класс (типичная ситуация после миграции с предыдущих версий).
Принятие предложения создаёт класс автоматически; при желании перед принятием можно изменить сгенерированное имя.
Классы хранилища
Устройство вкладки аналогично. Отличие одно: назначение классов хранилища на кластеры происходит полностью автоматически по совпадению имён с классами хранилища Kubernetes. Детальная страница класса хранилища в этой версии Commander работает в режиме просмотра: список кластеров, где найден класс хранилища Kubernetes с таким именем, обновляется сам. Ручное назначение для классов хранилища не предусмотрено.
Это техническое ограничение текущего релиза: метрики потребления хранилища привязаны к имени класса хранилища Kubernetes, а способа пометить сам StorageClass произвольным лейблом (по аналогии с лейблом billing.commander.deckhouse.io/name на узлах) пока нет. Поэтому, если нужно выделить отдельный прайс для конкретного кластера, создайте в этом кластере класс хранилища Kubernetes с отдельным именем — он автоматически появится в биллинге как отдельный класс.
Тарифы
На вкладке отображается список тарифов: имя, модель расчёта, дата начала действия, статус. По кнопке Создать тариф открывается форма, в которой:
- в блоке «Вычислительные ресурсы» добавляются строки вида «вычислительный класс + цена CPU + цена памяти» — класс выбирается из выпадающего списка уже существующих классов;
- в блоке «Хранилище» добавляются строки вида «класс хранилища + цена за гигабайт» — аналогично, класс выбирается из списка;
- задаются модель расчёта, модель агрегации и дата начала действия тарифа.
В один момент времени действует только один тариф — тот, у которого самая поздняя дата начала действия среди уже наступивших. Все остальные тарифы из списка хранятся как история цен: они применяются к тем часам прошедших периодов, на которые приходились их даты действия. Чтобы «обновить цены», не правьте действующий тариф — создайте новый тариф с более поздней датой начала, и он автоматически станет действующим.
Если какие-то вычислительные классы или классы хранилища существуют в системе, но не упомянуты в текущем тарифе, на вкладке отображается предупреждение, чтобы администратор не забыл задать для них цену.
Создание тарифа
Создание тарифа сводится к одному большому решению — «какую цену считать справедливой» — и нескольким механическим шагам. Примеры ниже иллюстрируют типичные ситуации.
Общие шаги
- Откройте Тарификация → Тарифы и нажмите Создать тариф.
- Введите имя тарифа (например, «Yandex Cloud — 2026» или «Внутренний прайс R&D, I квартал»).
- Выберите модель расчёта и модель агрегации.
- Задайте дату начала действия тарифа (по умолчанию — сегодня).
- В блоке Вычислительные ресурсы последовательно добавьте все вычислительные классы и для каждого укажите стоимость CPU и памяти.
- В блоке Хранилище добавьте классы хранилища и стоимость за гигабайт.
- Сохраните тариф.
Дашборд и отчёты начнут использовать тариф с даты начала действия; задним числом можно как вводить, так и отменять тарифы.
Пример: Yandex Cloud (или другой публичный провайдер)
Цены берутся из прайс-листа провайдера и делятся на час.
| Вычислительный класс | CPU, ₽/ядро·час | Память, ₽/ГиБ·час |
|---|---|---|
standard-v3-cf-100 |
1.50 | 0.40 |
standard-v3-cf-50 |
0.75 | 0.40 |
| Класс хранилища | ₽/ГиБ·час |
|---|---|
network-ssd |
0.02 |
network-hdd |
0.005 |
Ставки приведены условно; для публичного облака их удобно поддерживать в такт с официальным прайс-листом провайдера.
Пример: частное облако (vSphere, OpenStack)
В частном облаке «цены» у внешнего поставщика нет — инфраструктурой владеет сама организация. Типовой подход: составить внутренний прайс-лист (chargeback), основанный на:
- амортизации серверов и систем хранения за ожидаемый срок эксплуатации (обычно 3–5 лет);
- стоимости электроэнергии, охлаждения и размещения в ЦОД;
- стоимости лицензий гипервизора, СХД и сопутствующего ПО;
- ставках труда команды эксплуатации (пропорционально);
- коэффициенте на простой и резерв.
Полученная стоимость часа CPU и гигабайта памяти фиксируется в тарифе, который прикладывается к классам частного облака так же, как к публичному.
Пример (OpenStack):
| Вычислительный класс | CPU, ₽/ядро·час | Память, ₽/ГиБ·час |
|---|---|---|
m1.large |
0.80 | 0.25 |
m1.xlarge |
0.80 | 0.25 |
c4.large (вычислительный флейвор) |
1.00 | 0.25 |
Пример (vSphere, имена классов формируются как {cpu}c-{memory}m):
| Вычислительный класс | CPU, ₽/ядро·час | Память, ₽/ГиБ·час |
|---|---|---|
4c-8192m |
0.70 | 0.20 |
8c-16384m |
0.70 | 0.20 |
16c-32768m |
0.70 | 0.20 |
Для частного облака ставки в тарифе не обязаны совпадать с рыночными. Важно, чтобы сумма по тарифу за период отражала те средства, которые организация рассчитывает перевыставить подразделениям-потребителям.
Для хранилища частного облака в тариф обычно заносятся:
- отдельно — «быстрое» хранилище (NVMe, SSD) с более высокой ставкой;
- отдельно — «массовое» хранилище (HDD, object storage) с более низкой ставкой;
- при необходимости — отдельная ставка за реплицированные или зашифрованные классы.
Если оборудование формально принадлежит другому юридическому лицу (материнской компании, сервисной компании группы), роль тарифа — зафиксировать трансфертную цену: она согласуется с финансовой службой и не обязана совпадать ни с рыночной, ни с внутренней себестоимостью.
Пример: статический кластер (bare-metal)
Для статического кластера Commander сам вычислительные классы не создаёт. Порядок действий:
- В Тарификация → Вычислительные классы создайте классы, отражающие реальные типы узлов (например,
bm-cpu-2x32,bm-gpu-a100). - Дополнительно можно в шаблоне группы узлов указать лейбл
billing.commander.deckhouse.io/nameс тем же именем класса — тогда Commander автоматически привяжет класс к группе узлов при появлении узлов в кластере. - Перейдите на детальную страницу класса и вручную назначьте его на соответствующие группы узлов кластера.
- Для классов хранилища никаких действий не требуется — они создаются автоматически по именам классов хранилища Kubernetes.
- Создайте тариф и задайте цены.
Методика ценообразования в статическом кластере, как правило, такая же, как в частном облаке: амортизация оборудования, электроэнергия, лицензии, обслуживание — разделённые на прогнозируемый совокупный объём потребления.
Модели расчёта и агрегации
Модель расчёта определяет, какое значение потребления умножается на цену:
- По запросам (requests) — учитываются значения
resources.requests, указанные в подах. Подходит, если организации важнее планируемая нагрузка, чем фактическая. Условие корректного расчёта: во всех подах, стоимость которых должна попасть в отчёт, должны быть указаныresources.requestsдля CPU и памяти. Поды безrequestsв этой модели учитываются как нулевое потребление, и их ресурсы не тарифицируются. - По реальному использованию — учитывается фактическое потребление CPU и памяти подами. Ближе к модели публичного облака; наличие
requestsдля расчёта не требуется.
Модель агрегации определяет, как часовое значение потребления получается из более частых измерений:
- По среднему — среднее за час;
- 95-й процентиль — агрегация «по пиковой загрузке», сглаживающая редкие выбросы.
Минимальная единица тарификации — один час.
Раздел «Дашборд»
Дашборд предназначен для анализа расходов в реальном времени.
Дашборд и отчёты отображают только те ресурсы, по которым фактически поступают метрики. Если ресурс создан, но данные по нему ещё не поступили в Prometheus — он не появится в фильтрах и таблицах. Это не ошибка: система показывает реальную картину потребления, а не декларативное состояние конфигурации. Типичные причины задержки:
- агент ещё не передал информацию о нод-группе;
- метка
billing.commander.deckhouse.io/nameещё не проставлена на узлы (класс не привязан к тарифу); - Prometheus ещё не собрал первый scrape с новым значением метки;
- интервал remote write ещё не наступил.
Как правило, данные появляются в течение нескольких минут после настройки привязок.
Доступные срезы и фильтры:
- рабочее пространство;
- кластер;
- проект (для рабочих пространств с включёнными проектами);
- неймспейс;
- контроллер (Deployment, StatefulSet, DaemonSet и т.п.);
- вид ресурса — CPU, память, хранилище;
- вычислительный класс;
- класс хранилища.
Для выбранного фильтра дашборд показывает графики и таблицы стоимости с группировкой по дням, неделям или месяцам, а также итоговую сумму за период. Значения всех фильтров формируются только из ресурсов, к которым у текущего пользователя есть доступ.
Раздел «Отчёты»
Раздел используется для генерации аналитических отчётов по запросу и по расписанию.
Основные элементы:
- вкладка Все отчёты — список уже сформированных отчётов, доступных для скачивания;
- вкладка Управление регулярными отчётами — список расписаний, по которым формируются периодические отчёты.
Создание мгновенного отчёта
- Нажмите Создать.
- Укажите имя отчёта.
- Выберите тип Мгновенный.
- Укажите период.
- Выберите вложенные колонки для детализации (например: рабочее пространство, проект, кластер, неймспейс).
- Для разделения стоимости по типу ресурса включите Детализировать по ресурсам.
- Нажмите Сохранить. Отчёт появится в списке и начнёт формироваться.
- Готовый отчёт доступен для скачивания в формате CSV (разделитель — запятая, первая строка содержит имена колонок).
Создание регулярного отчёта
- Нажмите Создать.
- Укажите имя отчёта.
- Выберите тип Регулярный.
- Задайте дату начала и периодичность.
- Выберите колонки для детализации и при необходимости включите Детализировать по ресурсам.
- Нажмите Сохранить. Расписание появится на вкладке Управление регулярными отчётами.
Отчёты формируются автоматически по расписанию и попадают на вкладку Все отчёты.
Миграция с предыдущих версий
Если биллинг в вашей установке настраивался до появления вычислительных классов и классов хранилища как отдельных сущностей (например, вы вручную добавляли метку billing.commander.deckhouse.io/name на группы узлов и задавали имена в тарифе), после обновления ничего не ломается — биллинг продолжает работать без перерыва. Никаких действий не требуется. Исторические данные дашборда и отчётов сохраняются полностью.
Что происходит автоматически
- Миграция данных: для каждого имени метки, которое было задано в тарифе, создаётся вычислительный класс с тем же именем и сохраняется его связь с тарифом (цена).
- Обнаружение ресурсов: при формировании вычислительного класса для облачной нод-группы автоматика проверяет, есть ли на нод-группе уже проставленная метка
billing.commander.deckhouse.io/name. Если метка есть — создаётся класс с тем же именем. Таким образом автоматически созданный класс совпадает с тем, что уже используется, и конфликтов не возникает. - Классы хранилища создаются сразу по данным от агента.
После обновления метку billing.commander.deckhouse.io/name можно убрать из шаблонов групп узлов (spec.nodeTemplate.labels). Теперь за проставление метки на узлы отвечает агент, и ручная метка в шаблоне больше не нужна. Если оставить — метка просто дублируется без негативных эффектов.