Доступ до метаданих пристроїв DRA

Стан функціоналу: Beta починаючи з Kubernetes v1.37

Ця сторінка показує, як отримати доступ до метаданих пристроїв з контейнерів, які використовують динамічний розподіл ресурсів (DRA). Метадані пристроїв дозволяють робочим навантаженням дізнаватися інформацію про виділені пристрої, такі як атрибути пристроїв або деталі мережевого інтерфейсу, шляхом читання JSON-файлів за відомими шляхами всередині контейнера.

Перед тим як ознайомитися з цією сторінкою, перегляньте інформацію про Динамічний розподіл ресурсів (DRA) та про те, як виділяти пристрої для робочих навантажень.

Перш ніж ви розпочнете

Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:

Версія вашого Kubernetes сервера має бути v1.37.

Для перевірки версії введіть kubectl version.

  • Переконайтесь, що адміністратор вашого кластера налаштував DRA, підключив пристрої та встановив драйвери. Для отримання додаткової інформації дивіться Налаштування DRA в кластері.
  • Переконайтесь, що драйвер DRA, розгорнутий у вашому кластері, підтримує метадані пристроїв. Автори драйверів, які використовують втулок kubelet DRA, вмикають підтримку за допомогою EnableDeviceMetadata та повинні включити metadata.resource.k8s.io/v1beta1 у вибрані версії. Драйвер також може видавати v1alpha1 для сумісності зі старішими споживачами.

Доступ до метаданих ресурсів за допомогою ResourceClaim

Коли ви використовуєте безпосередньо вказаний ResourceClaim для виділення пристроїв, файли метаданих пристроїв зʼявляються всередині контейнера за адресою:

/var/run/kubernetes.io/dra-device-attributes/resourceclaims/<claimName>/<requestName>/<driverName>-metadata.json
  1. Перегляньте наступний приклад маніфесту:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaim
    metadata:
      name: gpu-claim
    spec:
      devices:
        requests:
        - name: gpu
          exactly:
            deviceClassName: gpu.example.com
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-metadata-reader
    spec:
      resourceClaims:
      - name: my-gpu
        resourceClaimName: gpu-claim
      containers:
      - name: workload
        image: ubuntu:24.04
        resources:
          claims:
          - name: my-gpu
            request: gpu
        command:
        - sh
        - -c
        - |
          echo "=== DRA device metadata ==="
          find /var/run/kubernetes.io/dra-device-attributes -name '*-metadata.json' -print -exec cat {} \;
          sleep 3600
      restartPolicy: Never
    

    Цей маніфест створює ResourceClaim з назвою gpu-claim, який запитує пристрій з DeviceClass gpu.example.com, та Pod, який читає метадані пристрою.

  2. Створіть ResourceClaim та Pod:

    kubectl apply -f https://k8s.io/examples/dra/dra-device-metadata-pod.yaml
    
  3. Після запуску Podʼа перегляньте журнали контейнера, щоб побачити метадані:

    kubectl logs gpu-metadata-reader
    

    Вивід буде схожий на:

    === DRA device metadata ===
    /var/run/kubernetes.io/dra-device-attributes/resourceclaims/gpu-claim/gpu/gpu.example.com-metadata.json
    {
      "kind": "DeviceMetadata",
      "apiVersion": "metadata.resource.k8s.io/v1beta1",
      ...
    }
    
  4. Щоб переглянути повний файл метаданих, виконайте команду exec у контейнері:

    kubectl exec gpu-metadata-reader -- \
      cat /var/run/kubernetes.io/dra-device-attributes/resourceclaims/gpu-claim/gpu/gpu.example.com-metadata.json
    

    Файл метаданих — це JSON-потік. Він містить один обʼєкт для кожної версії API, вибраної драйвером, у порядку, налаштованому драйвером. Драйвери повинні розміщувати найновішу версію першою. Обʼєкти містять еквівалентні метадані пристрою, тому команда може вивести більше ніж один JSON-обʼєкт.

    Вивід містить атрибути пристрою, такі як модель, версія драйвера та UUID пристрою. Ємності пристроїв не є частиною схеми метаданих. Дивіться схему метаданих для деталей структури JSON.

Доступ до метаданих ресурсів за допомогою ResourceClaimTemplate

Коли ви використовуєте ResourceClaimTemplate, Kubernetes генерує ResourceClaim для кожного Podʼа. Оскільки згенерована назва заявки непередбачувана, файли метаданих зʼявляються за шляхом, який використовує імʼя посилання на заявку Podʼа:

/var/run/kubernetes.io/dra-device-attributes/resourceclaimtemplates/<podClaimName>/<requestName>/<driverName>-metadata.json

Поле <podClaimName> відповідає полю name у записі spec.resourceClaims[] Podʼа. JSON-метадані також включають поле podClaimName, яке фіксує це зіставлення.

  1. Перегляньте наступний приклад маніфесту:

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: gpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: gpu
            exactly:
              deviceClassName: gpu.example.com
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-metadata-template-reader
    spec:
      resourceClaims:
      - name: my-gpu
        resourceClaimTemplateName: gpu-claim-template
      containers:
      - name: workload
        image: ubuntu:24.04
        resources:
          claims:
          - name: my-gpu
            request: gpu
        command:
        - sh
        - -c
        - |
          echo "=== DRA device metadata (from template) ==="
          find /var/run/kubernetes.io/dra-device-attributes -name '*-metadata.json' -print -exec cat {} \;
          sleep 3600
      restartPolicy: Never
    

    Цей маніфест створює ResourceClaimTemplate та Pod. Кожен Pod отримує власний згенерований ResourceClaim. Шлях до метаданих використовує імʼя посилання на заявку Podʼа my-gpu.

  2. Створіть ResourceClaimTemplate та Pod:

    kubectl apply -f https://k8s.io/examples/dra/dra-device-metadata-template-pod.yaml
    
  3. Після запуску Podʼа перегляньте метадані:

    kubectl exec gpu-metadata-template-reader -- \
      cat /var/run/kubernetes.io/dra-device-attributes/resourceclaimtemplates/my-gpu/gpu/gpu.example.com-metadata.json
    

Читання метаданих у вашому застосунку

Go застосунки

Пакунок k8s.io/dynamic-resource-allocation/devicemetadata надає готові функції для читання файлів метаданих. Ці функції автоматично обробляють узгодження версій, декодують потік метаданих і перетворюють його на внутрішні типи, щоб ваш код працював з різними версіями схеми без ручної перевірки версій. Вони пропускають обʼєкти з невідомими версіями API та повертають перший сумісний обʼєкт.

Для безпосередньо вказаної ResourceClaim:

import "k8s.io/dynamic-resource-allocation/devicemetadata"

dm, err := devicemetadata.ReadResourceClaimMetadata("gpu-claim", "gpu")

Для заявки, створеної з шаблону, (використовуючи імʼя посилання на заявку Pod):

dm, err := devicemetadata.ReadResourceClaimTemplateMetadata("my-gpu", "gpu")

Якщо ви знаєте конкретне імʼя драйвера, ви можете прочитати файл метаданих одного драйвера:

dm, err := devicemetadata.ReadResourceClaimMetadataWithDriverName("gpu.example.com", "gpu-claim", "gpu")

Функції, які читають усі драйвери, повертають *metadata.DeviceMetadata з обʼєднаними запитами та атрибутами кожного пристрою. Функції, які приймають імʼя драйвера, повертають повний обʼєкт метаданих із файлу цього драйвера.

Допоміжні функції читання декодують метадані без перевірки. Щоб увімкнути перевірку, відкрийте файл і використайте DecodeMetadataFromStream:

import (
	"encoding/json"
	"os"

	"k8s.io/dynamic-resource-allocation/api/metadata"
	"k8s.io/dynamic-resource-allocation/devicemetadata"
)

func readMetadata(path string) (*metadata.DeviceMetadata, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var deviceMetadata metadata.DeviceMetadata
	var validationErr error
	err = devicemetadata.DecodeMetadataFromStream(
		json.NewDecoder(file),
		&deviceMetadata,
		devicemetadata.DecodeMetadataWithValidationResult(&validationErr),
	)
	if err != nil {
		return nil, err
	}
	if validationErr != nil {
		return nil, validationErr
	}
	return &deviceMetadata, nil
}

Декодування та перевірка мають окремі результати. Помилка перевірки не заважає декодеру заповнювати deviceMetadata. Перевірка корисна, коли метадані надходять від спеціального драйвера, оскільки втулок kubelet DRA не перевіряє обʼєкти перед їх записом.

Застосунки іншими мовами можуть декодувати JSON-потік по одному обʼєкту за раз, перевіряти кожен apiVersion, пропускати невідомі версії та використовувати першу версію, яку вони підтримують.

Очищення

Видаліть створені ресурси:

kubectl delete -f https://k8s.io/examples/dra/dra-device-metadata-pod.yaml
kubectl delete -f https://k8s.io/examples/dra/dra-device-metadata-template-pod.yaml

Що далі

Востаннє змінено September 03, 2026 at 5:28 PM PST: [uk] Ukrainian translation (all-in-one) (2fedabf8e5)