Как определить пользовательскую модель стоимости
В этом руководстве показано, как добавить новые элементы выставления счетов, определив пользовательскую модель стоимости. Рабочий процесс состоит из четырёх частей:
- Подготовка метрик использования
- Подготовка метрик меток
- Добавление конфигурации сбора для Cost Management Agent
- Добавление конфигурации отображения для Cost Management Server
В качестве конкретного примера мы добавим два элемента выставления счетов для GPU: GPU Compute (ядра) и GPU Memory, а также включим ценообразование по меткам.
Подготовка метрик использования
Метрики использования представляют потребление, которое подлежит оплате. Предоставьте PromQL-запрос, который агрегирует использование за шаг (например, 5 минут). Каждый шаг даёт одну точку данных, представляющую использование за предшествующий интервал; итоговое использование — это сумма за выбранный временной диапазон.
Типы метрик Prometheus включают Counter, Gauge, Summary и Histogram. Для использования применяйте Counter или Gauge. Примеры:
# Пример Counter (например, время использования ядер GPU):
vgpu_core_usage_seconds_total{"containeridx":"0","deviceuuid":"GPU-2eec4202-80dc-870f-3ca5-25879d96eca7","endpoint":"monitor","instance":"10.3.0.130:9395","ip":"192.168.131.32","job":"hami-scheduler","namespace":"kube-system","node_name":"192.168.131.32","nodename":"192.168.133.48","pod":"hami-scheduler-86b7ff47c6-sp7kb","podname":"pytorch-cuda12-1-57d9ff4544-bqkvg","podnamespace":"yulin-2","service":"hami-scheduler","zone":"vGPU"}
# Соответствующий запрос использования (шаг = 5м):
sum by (deviceuuid, podnamespace) (rate(vgpu_core_usage_seconds_total{}[5m]))
# Пример Gauge (например, использование памяти GPU в байтах):
vgpu_memory_usage_bytes{"containeridx":"0","deviceuuid":"GPU-2eec4202-80dc-870f-3ca5-25879d96eca7","endpoint":"monitor","instance":"10.3.0.130:9395","ip":"192.168.131.32","job":"hami-scheduler","namespace":"kube-system","node_name":"192.168.131.32","nodename":"192.168.133.48","pod":"hami-scheduler-86b7ff47c6-sp7kb","podname":"pytorch-cuda12-1-57d9ff4544-bqkvg","podnamespace":"yulin-2","service":"hami-scheduler","zone":"vGPU"}
# Соответствующий запрос использования (шаг = 5м):
sum by (deviceuuid, podnamespace) (avg_over_time(vgpu_memory_usage_bytes{}[5m]))
Подготовка метрик меток
Метрики меток прикрепляют атрибуты к использованию, чтобы можно было устанавливать цены по меткам. Они должны быть соединяемы с метриками использования — иметь хотя бы одну общую метку (например, deviceuuid), чтобы система могла обогащать использование этими атрибутами.
Для метрик меток используйте Gauge. Пример:
# Метрики меток (поля меток начинаются с label_ в этом примере):
vgpu_device_labels{"deviceuuid":"GPU-2eec4202-80dc-870f-3ca5-25879d96eca7","label_device":"nvidia","label_modelName":"Tesla T4","podnamespace":"yulin-1"}
# Запрос для метрик меток:
vgpu_device_labels{}
# Как связаны запросы использования и меток (пример для ядер и памяти GPU):
# 1) Запрос использования группирует по (deviceuuid, podnamespace), каждая серия содержит deviceuuid
# 2) Запрос меток группирует по своим меткам, каждая серия содержит deviceuuid
# 3) Поскольку обе содержат уникальный deviceuuid, метки из запроса меток могут быть присоединены к использованию
Добавление конфигурации сбора (Cost Management Agent)
Создайте ConfigMap в каждом кластере, где работает Cost Management Agent, чтобы объявить, что собирать.
Типичная собранная запись (ядра/память GPU) сопоставляется с полями конфигурации следующим образом:
{
"id": "cab9881e380fcf72726ccf45565ffc2d", # Автоматически сгенерировано из согласованных полей
"kind": "Vgpu", # Совпадает с kind в конфигурации
"name": "GPU-2eec4202-80dc-870f-3ca5-25879d96eca7", # Из usage.mappers.name
"namespace": "cpaas-system", # Из usage.mappers.namespace
"cluster": "default-cluster", # Кластер, где работает агент
"project": "cpaas-system", # Выведено из namespace
"labels": { # Из labels.query, если настроено
"key1": "val1",
"key2": "val2"
},
"date": "2024-04-29T00:00:00Z", # Начало дня
"period": "hourly", # Совпадает с period в конфигурации
"start": "2024-04-29T00:05:00Z", # Начало периода
"end": "2024-04-29T00:59:59Z", # Конец периода
"category": "VgpuCore", # Совпадает с category в конфигурации
"item": "VgpuCoreUsed", # Совпадает с item в конфигурации
"usage": 200 # Из результата запроса использования
}
Теперь создайте ConfigMap для агента (ядра и память GPU):
apiVersion: v1
data:
config: |
- kind: Vgpu # Обязательно; должно совпадать с конфигурацией сервера
category: VgpuCore # Обязательно; должно совпадать с конфигурацией сервера
item: VgpuCoreUsed # Обязательно и уникально; должно совпадать с конфигурацией сервера
period: Hourly # Обязательно; Hourly или Daily; предпочтительно Hourly
labels: # Опционально; обогащение использования метками из этого запроса
query: "vgpu_core_labels{}" # Например, добавить модель GPU, производителя в метки
mappers:
name: deviceuuid # Отобразить deviceuuid как name
namespace: podnamespace # Отобразить podnamespace как namespace
cluster: "" # Оставить пустым для автозаполнения текущим кластером
project: "" # Оставить пустым для автозаполнения проекта из namespace
usage: # Обязательно; запрос использования (группировка по deviceuuid,podnamespace)
query: "sum by (deviceuuid, podnamespace) (rate(vgpu_core_usage_seconds_total{}[5m]))"
step: 5m # Обязательно; шаг выборки точек
mappers:
name: deviceuuid # Отобразить deviceuuid в name
namespace: podnamespace # Отобразить podnamespace в namespace
cluster: "" # Автозаполнение, если пусто
project: "" # Автозаполнение, если пусто
- kind: Vgpu # Второй элемент выставления счетов
category: VgpuMemory # Должно совпадать с конфигурацией сервера
item: VgpuMemoryUsed # Уникальное имя элемента
period: Hourly
labels:
query: "vgpu_core_labels{}"
mappers:
name: deviceuuid
namespace: podnamespace
cluster: ""
project: ""
usage:
query: "sum by (deviceuuid, podnamespace) (avg_over_time(vgpu_memory_usage_bytes{}[5m]))"
step: 5m
mappers:
name: deviceuuid
namespace: podnamespace
cluster: ""
project: ""
kind: ConfigMap
metadata:
labels:
cpaas.io/slark.collection.config: "true" # Обязательно; включает конфигурацию сбора
name: slark-agent-project-config-vgpu
namespace: cpaas-system # Обязательно;
После добавления yaml необходимо перезапустить Pod агента, чтобы перезагрузить конфигурации.
kubectl delete pods -n cpaas-system -l service_name=slark-agent
Добавление конфигурации отображения/хранения (Cost Management Server)
Создайте ConfigMap в кластере, где работает Cost Management Server, чтобы объявить элементы выставления счетов, методы, единицы и отображаемые имена. Это сообщает серверу, что и как выставлять счет.
apiVersion: v1
data:
config: |
- name: VgpuCore # Имя элемента выставления счетов; должно совпадать с category выше
displayname:
zh: "Vgpu"
en: "Vgpu"
methods: # Список методов выставления счетов (уникальные имена)
- name: Usage # Имя метода
displayname:
zh: "使用量"
en: "Used Usage"
item: VgpuCoreUsed # Должно совпадать с item в конфигурации агента
divisor: 1000 # Конверсия единиц (например, mCPU в ядра)
unit:
zh: "core-hours"
en: "core-hours"
- name: VgpuMemory # Второй элемент выставления счетов
displayname:
zh: "Vgpu 显存"
en: "VgpuMemory"
methods:
- name: Used
displayname:
zh: "使用量"
en: "Used Usage"
item: VgpuMemoryUsed
divisor: 1073741824 # байты -> Gi
unit:
zh: "Gi-hours"
en: "Gi-hours"
kind: ConfigMap
metadata:
labels:
cpaas.io/slark.display.config: "true" # Обязательно; включает конфигурацию отображения/хранения
name: slark-display-config-for-vgpu
namespace: kube-public # Обязательно;
После добавления yaml необходимо перезапустить Pod сервера, чтобы перезагрузить конфигурации.
kubectl delete pods -n cpaas-system -l service_name=slark-server
Примечания и рекомендации
- Соблюдайте согласованность имён между конфигурациями агента и сервера:
kind, category и item должны совпадать.
- Предпочитайте Hourly для более точной детализации и быстрого отклика.
- Убедитесь, что метрики меток можно соединить с использованием через общую метку (например,
deviceuuid).
- Проверяйте PromQL локально перед развертыванием; контролируйте первые запуски для проверки корректности данных.
- Начинайте с малого (несколько кластеров/элементов), затем масштабируйте после валидации.