Призначення пристроїв робочим навантаженням за допомогою DRA
Kubernetes v1.34 [stable] (стандартно увімкнено: true)На цій сторінці показано, як призначати пристрої для ваших Podʼів за допомогою динамічного розподілу ресурсів (DRA). Ці інструкції призначені для операторів робочих навантажень. Перед прочитанням цієї сторінки ознайомтеся з принципами роботи DRA та термінами, такими як ResourceClaims і ResourceClaimTemplates. Докладніше дивіться у розділі Динамічний розподіл ресурсів (DRA).
Про призначення пристроїв з DRA
Як оператор робочих навантажень, ви можете запитувати пристрої для своїх навантажень, створюючи ResourceClaims або ResourceClaimTemplates. Під час розгортання навантаження Kubernetes і драйвери пристроїв знаходять доступні пристрої, призначають їх вашим Podʼам і розміщують Podʼи на вузлах, які мають доступ до цих пристроїв.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути v1.34.Для перевірки версії введіть kubectl version.
- Переконайтеся, що адміністратор вашого кластера налаштував DRA, підключив пристрої та встановив драйвери. Докладніше дивіться у розділі Налаштування DRA у кластері.
Визначення пристроїв для подання заявок на них
Адміністратор вашого кластера або драйвери пристроїв створюють DeviceClasses, які визначають категорії пристроїв. Ви можете отримувати пристрої, використовуючи Загальна мова виразів для фільтрації за конкретними властивостями пристроїв.
Отримайте список DeviceClasses у кластері:
kubectl get deviceclasses
Вивід буде схожим на наступний:
NAME AGE
driver.example.com 16m
Якщо ви отримали помилку доступу, можливо, у вас немає прав для перегляду DeviceClasses. Зверніться до адміністратора кластера або постачальника драйверів щодо доступних властивостей пристроїв.
Запитування ресурсів
Ви можете запитувати ресурси з DeviceClass за допомогою ResourceClaims. Щоб створити ResourceClaim, виконайте одну з наступних дій:
- Створіть ResourceClaim вручну, якщо ви хочете, щоб декілька Podʼів мали спільний доступ до одних і тих самих пристроїв, або якщо ви хочете, щоб claim існував довше, ніж Pod.
- Використовуйте ResourceClaimTemplate, щоб Kubernetes генерував і керував ResourceClaims для кожного Podʼа. Створіть ResourceClaimTemplate, якщо ви хочете, щоб кожен Pod мав доступ до окремих пристроїв із подібними конфігураціями. Наприклад, це може знадобитися для одночасного доступу до пристроїв у Pod для Job, який використовує паралельне виконання.
Якщо ви безпосередньо посилаєтеся на конкретний ResourceClaim у Pod, цей ResourceClaim вже має існувати у кластері. Якщо зазначений ResourceClaim не існує, Pod залишатиметься у стані очікування, доки ResourceClaim не буде створено. Ви можете посилатися на автоматично створений ResourceClaim у Podʼі, але це не рекомендується, оскільки такі ResourceClaim прив'язані до часу життя Pod, який їх створив.
Щоб створити робоче навантаження, яке отримує ресурси, виберіть одну з наступних опцій:
Ознайомтеся з наступним прикладом маніфесту:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: example-resource-claim-template
spec:
spec:
devices:
requests:
- name: gpu-claim
exactly:
deviceClassName: example-device-class
selectors:
- cel:
expression: |-
device.attributes["driver.example.com"].type == "gpu" &&
device.capacity["driver.example.com"].memory == quantity("64Gi")
Цей маніфест створює ResourceClaimTemplate, який запитує пристрої у DeviceClass example-device-class, що відповідають обом наступним параметрам:
- Пристрої, які мають атрибут
driver.example.com/typeзі значеннямgpu. - Пристрої, які мають ємність
64Gi.
Щоб створити ResourceClaimTemplate, виконайте наступну команду:
kubectl apply -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
Ознайомтеся з наступним прикладом маніфесту:
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: example-resource-claim
spec:
devices:
requests:
- name: single-gpu-claim
exactly:
deviceClassName: example-device-class
allocationMode: All
selectors:
- cel:
expression: |-
device.attributes["driver.example.com"].type == "gpu" &&
device.capacity["driver.example.com"].memory == quantity("64Gi")
Цей маніфест створює ResourceClaim, який запитує пристрої у DeviceClass example-device-class, що відповідають обом наступним параметрам:
- Пристрої, які мають атрибут
driver.example.com/typeзі значеннямgpu. - Пристрої, які мають ємність
64Gi.
Щоб створити ResourceClaim, виконайте наступну команду:
kubectl apply -f https://k8s.io/examples/dra/resourceclaim.yaml
Запит пристроїв у робочих навантаженнях за допомогою DRA
Щоб запросити пристрій, вкажіть ResourceClaim або ResourceClaimTemplate у полі resourceClaims специфікації Podʼа. Потім запросіть конкретний claim за назвою у полі resources.claims контейнера цього Podʼа. Ви можете вказати декілька записів у полі resourceClaims та використовувати конкретні claims у різних контейнерах.
Ознайомтеся з наступним прикладом Job:
apiVersion: batch/v1 kind: Job metadata: name: example-dra-job spec: completions: 10 parallelism: 2 template: spec: restartPolicy: Never containers: - name: container0 image: ubuntu:24.04 command: ["sleep", "9999"] resources: claims: - name: separate-gpu-claim - name: container1 image: ubuntu:24.04 command: ["sleep", "9999"] resources: claims: - name: shared-gpu-claim - name: container2 image: ubuntu:24.04 command: ["sleep", "9999"] resources: claims: - name: shared-gpu-claim resourceClaims: - name: separate-gpu-claim resourceClaimTemplateName: example-resource-claim-template - name: shared-gpu-claim resourceClaimName: example-resource-claimКожен Pod у цьому Job має наступні властивості:
- Робить доступними для контейнерів ResourceClaimTemplate з назвою
separate-gpu-claimта ResourceClaim з назвоюshared-gpu-claim. - Запускає наступні контейнери:
container0запитує пристрої з ResourceClaimTemplateseparate-gpu-claim.container1таcontainer2мають спільний доступ до пристроїв з ResourceClaimshared-gpu-claim.
- Робить доступними для контейнерів ResourceClaimTemplate з назвою
Створіть Job:
kubectl apply -f https://k8s.io/examples/dra/dra-example-job.yaml
Спробуйте наступні кроки для усунення неполадок:
- Коли робоче навантаження не запускається, як очікувалося, перевірте обʼєкти на кожному рівні з
kubectl describe, щоб дізнатися, чи є якісь поля статусу або події, які можуть пояснити, чому робоче навантаження не запускається. - Коли створення Pod не вдається з
must specify one of: resourceClaimName, resourceClaimTemplateName, перевірте, що всі записи вpod.spec.resourceClaimsмають точно одне з цих полів. Якщо так, то можливо, що в кластері встановлено модифікуючий веб-хук Podʼа, який був створений для API Kubernetes < 1.32. Попросіть адміністратора кластера перевірити це.
Очищення
Щоб видалити обʼєкти Kubernetes, створені у цьому завданні, виконайте наступні кроки:
Видаліть приклад Job:
kubectl delete -f https://k8s.io/examples/dra/dra-example-job.yamlЩоб видалити свої claims ресурсів, виконайте одну з наступних команд:
Видаліть ResourceClaimTemplate:
kubectl delete -f https://k8s.io/examples/dra/resourceclaimtemplate.yamlВидаліть ResourceClaim:
kubectl delete -f https://k8s.io/examples/dra/resourceclaim.yaml