• Русский
  • Как определить пользовательскую модель стоимости

    В этом руководстве показано, как добавить новые элементы выставления счетов, определив пользовательскую модель стоимости. Рабочий процесс состоит из четырёх частей:

    • Подготовка метрик использования
    • Подготовка метрик меток
    • Добавление конфигурации сбора для 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 локально перед развертыванием; контролируйте первые запуски для проверки корректности данных.
    • Начинайте с малого (несколько кластеров/элементов), затем масштабируйте после валидации.