# Встановлення драйверів та виділення пристроїв з DRA

LLMS index: [llms.txt](/llms.txt)

---

<!-- МАЙБУТНІМ СУПРОВОДЖУВАЧАМ:
Початкова мета цього документа полягала в тому, щоб люди (в основному адміністратори кластера) зрозуміли важливість драйвера DRA та його взаємодію з API DRA. В результаті цього для цього навчального посібника було вимогою не використовувати Helm і бути більш прямолінійним з усіма процедурами встановлення компонентів. Хоча багато з цього вмісту також корисно для авторів робочих навантажень, я бачу основну аудиторію _цього_ посібника як адміністраторів кластера, які, на мою думку, також повинні розуміти, як API DRA взаємодіють з драйвером для їх належного обслуговування. Якби мені довелося вибирати, на якій аудиторії зосередитися в цьому документі, я б вибрав адміністраторів кластера. Якщо текст стає занадто заплутаним через врахування обох аудиторій, я б краще створив другий посібник для авторів робочих навантажень, який взагалі не зачіпає драйвер (оскільки, на мою думку, це більше відповідає тому, яким ми думаємо має бути їхній досвід) і також потенційно розглядає більш детальні/ ✨ цікаві ✨ випадки використання.
-->








  <div class="feature-state-notice feature-stable" title="Функціональна можливість: DynamicResourceAllocation">
              <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span> 
              <code>Kubernetes v1.35 [stable]</code>(стандартно увімкнено)</div>


<!-- overview -->
Цей посібник показує, як встановити драйвери <a class='glossary-tooltip' title='Функція Kubernetes для запиту та спільного використання ресурсів, таких як апаратні прискорювачі, між Podʼами.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/' target='_blank' aria-label='Динамічного виділення ресурсів (DRA)'>Динамічного виділення ресурсів (DRA)</a> у вашому кластері та як використовувати їх разом з API DRA для виділення <a class='glossary-tooltip' title='Будь-який ресурс, який безпосередньо або опосередковано підключений до вузлів вашого кластера, наприклад, GPU або інші плати.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/glossary/?all=true#term-device' target='_blank' aria-label='пристроїв'>пристроїв</a> для Pod. Ця сторінка призначена для адміністраторів кластерів.

<a class='glossary-tooltip' title='Функція Kubernetes для запиту та спільного використання ресурсів, таких як апаратні прискорювачі, між Podʼами.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/' target='_blank' aria-label='Динамічне виділення ресурсів (DRA)'>Динамічне виділення ресурсів (DRA)</a> дозволяє кластеру керувати доступністю та виділенням апаратних ресурсів для задоволення вимог Podʼів до апаратних ресурсів та налаштувань. Щоб підтримати це, суміш вбудованих компонентів Kubernetes (таких як планувальник Kubernetes, kubelet і kube-controller-manager) та сторонніх драйверів від власників пристроїв (які називаються драйверами DRA) спільно відповідають за оголошення, виділення, підготовку, монтування, перевірку стану, скасування підготовки та очищення ресурсів протягом усього життєвого циклу Podʼа. Ці компоненти обмінюються інформацією через серію специфічних для DRA API в групі API `resource.k8s.io`, включаючи <a class='glossary-tooltip' title='Категорія пристроїв у кластері. Користувачі можуть запитувати певні пристрої з класу DeviceClass.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#deviceclass' target='_blank' aria-label='DeviceClasses'>DeviceClasses</a>, <a class='glossary-tooltip' title='Представляє один або кілька ресурсів інфраструктури, наприклад, пристроїв, у пулі подібних ресурсів.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/kubernetes-api/workload-resources/resource-slice-v1beta1/' target='_blank' aria-label='ResourceSlices'>ResourceSlices</a>, <a class='glossary-tooltip' title='Описує ресурси, які потрібні робочому навантаженню, наприклад, пристрої. ResourceClaims можуть запитувати пристрої з DeviceClasses.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaims-templates' target='_blank' aria-label='ResourceClaims'>ResourceClaims</a>, а також нові поля в самій специфікації Pod.

<!-- objectives -->

### Цілі

* Розгорнути приклад драйвера DRA
* Розгорнути Pod, що виконує заявку на апаратні ресурси за допомогою API DRA
* Видалити Pod, який має заявку

<!-- prerequisites -->
## Перш ніж ви розпочнете

Ваш кластер повинен підтримувати [RBAC](/docs/reference/access-authn-authz/rbac/). Ви можете спробувати цей посібник з кластером, який використовує механізм авторизації, відмінний від RBAC, але в цьому випадку вам доведеться адаптувати кроки щодо визначення ролей і дозволів.

<p>Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою <a href="https://minikube.sigs.k8s.io/docs/tutorials/multi_node/">minikube</a> або використовувати одну з цих пісочниць:</p>
<ul>
<li><a href="https://labs.iximiuz.com/playgrounds?category=kubernetes&filter=all">iximiuz Labs</a></li>
<li><a href="https://killercoda.com/playgrounds/scenario/kubernetes">Killercoda</a></li>
<li><a href="https://kodekloud.com/public-playgrounds">KodeKloud</a></li>
</ul>


Цей посібник був протестований з вузлами Linux, хоча він також може працювати з іншими типами вузлів.

 
 
 Версія вашого Kubernetes сервера має бути не старішою ніж v1.34.
  <p>Для перевірки версії введіть  <code>kubectl version</code>.</p>


Якщо ваш кластер наразі не працює під управлінням Kubernetes 1.36, перегляньте документацію щодо версії Kubernetes, яку ви плануєте використовувати.

<!-- lessoncontent -->

## Дослідження початкового стану кластера {#explore-initial-state}

Ви можете витратити деякий час, щоб спостерігати за початковим станом кластера з увімкненим DRA, особливо якщо ви не використовували ці API раніше. Якщо ви налаштували новий кластер для цього посібника, без встановленого драйвера та ще не задоволених заявок Pod, вивід цих команд не покаже жодних ресурсів.

1.  Отримайте список <a class='glossary-tooltip' title='Категорія пристроїв у кластері. Користувачі можуть запитувати певні пристрої з класу DeviceClass.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#deviceclass' target='_blank' aria-label='DeviceClasses'>DeviceClasses</a>:

    ```shell
    kubectl get deviceclasses
    ```

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

    ```text
    No resources found
    ```

1.  Отримайте список <a class='glossary-tooltip' title='Представляє один або кілька ресурсів інфраструктури, наприклад, пристроїв, у пулі подібних ресурсів.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/reference/kubernetes-api/workload-resources/resource-slice-v1beta1/' target='_blank' aria-label='ResourceSlices'>ResourceSlices</a>:

    ```shell
    kubectl get resourceslices
    ```

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

    ```text
    No resources found
    ```

1.  Отримайте список <a class='glossary-tooltip' title='Описує ресурси, які потрібні робочому навантаженню, наприклад, пристрої. ResourceClaims можуть запитувати пристрої з DeviceClasses.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaims-templates' target='_blank' aria-label='ResourceClaims'>ResourceClaims</a> та <a class='glossary-tooltip' title='Визначає шаблон для Kubernetes для створення ResourceClaims. Використовується для забезпечення доступу до окремих схожих ресурсів на кожному Podʼі або PodGroup.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/dynamic-resource-allocation/#resourceclaims-templates' target='_blank' aria-label='ResourceClaimTemplates'>ResourceClaimTemplates</a>

    ```shell
    kubectl get resourceclaims -A
    kubectl get resourceclaimtemplates -A
    ```

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

    ```text
    No resources found
    No resources found
    ```

На даний момент ви підтвердили, що DRA увімкнено та налаштовано правильно в кластері, і що жоден драйвер DRA ще не оголосив жодних ресурсів API DRA.

## Встановлення демонстраційного драйвера DRA {#install-example-driver}

Драйвери DRA — це сторонні програми, які працюють на кожному вузлі вашого кластера, щоб взаємодіяти з апаратним забезпеченням цього вузла та вбудованими компонентами DRA Kubernetes. Процедура встановлення залежить від вибраного вами драйвера, але, ймовірно, розгортається як <a class='glossary-tooltip' title='Забезпечує запуск копії обʼєкта Pod на певному наборі вузлів у кластері.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/controllers/daemonset' target='_blank' aria-label='DaemonSet'>DaemonSet</a> на всіх або вибраних вузлах (з використанням <a class='glossary-tooltip' title='Дозволяє користувачам фільтрувати ресурси за мітками.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/overview/working-with-objects/labels/' target='_blank' aria-label='selectors'>selectors</a> або подібних механізмів) у вашому кластері.

Перевірте документацію вашого драйвера на наявність конкретних інструкцій щодо встановлення, які можуть включати чарт Helm, набір маніфестів або інші інструменти розгортання.

Цей посібник використовує приклад драйвера, який можна знайти в репозиторії [kubernetes-sigs/dra-example-driver](https://github.com/kubernetes-sigs/dra-example-driver), щоб продемонструвати встановлення драйвера. Цей приклад драйвера оголошує симульовані GPU для Kubernetes, з якими можуть взаємодіяти ваші Podʼи.

### Підготовка кластера до встановлення драйвера {#prepare-cluster-driver}

Щоб спростити очищення, створіть простір імен з назвою dra-tutorial:

1.  Створіть простір імен:

    ```shell
    kubectl create namespace dra-tutorial
    ```

У промисловому середовищі ви, напевно, використовували б раніше випущений або кваліфікований образ від постачальника драйвера або вашої організації, і ваші вузли повинні мати доступ до реєстру образів, де зберігається образ драйвера. У цьому навчальному посібнику ви будете використовувати публічно випущений образ dra-example-driver, щоб змоделювати доступ до образу драйвера DRA.

1.  Підтвердіть, що ваші вузли мають доступ до образу, виконавши наступну команду зсередини одного з вузлів вашого кластера:

    ```shell
    docker pull registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0
    ```

### Розгортання компонентів драйвера DRA {#deploy-the-dra-driver-components}

Для цього навчального посібника ви встановите критично важливі компоненти демонстраційного драйвера ресурсів окремо за допомогою `kubectl`.

1.  Створіть DeviceClass, що представляє типи пристроїв, які підтримує цей драйвер DRA:

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="highlight code-sample">
        <div class="copy-code-icon">
        <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/deviceclass.yaml" download="dra/driver-install/deviceclass.yaml"><code>dra/driver-install/deviceclass.yaml</code>
        </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-deviceclass-yaml')" title="Копіювати dra/driver-install/deviceclass.yaml до буферу обміну"></img></div>
        <div class="includecode" id="dra-driver-install-deviceclass-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">resource.k8s.io/v1</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">DeviceClass</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">gpu.example.com</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selectors</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">cel</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;device.driver == &#39;gpu.example.com&#39;&#34;</span><span class="w">
    </span></span></span></code></pre></div></div>
    </div>

    ```shell
    kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/deviceclass.yaml
    ```

1.  Створіть службовий обліковий запис, кластерну роль і привʼязку кластерної ролі, які будуть використовуватися драйвером для отримання дозволів на взаємодію з Kubernetes API в цьому кластері:

      1.  Створіть Service Account:

          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          <div class="highlight code-sample">
              <div class="copy-code-icon">
              <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/serviceaccount.yaml" download="dra/driver-install/serviceaccount.yaml"><code>dra/driver-install/serviceaccount.yaml</code>
              </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-serviceaccount-yaml')" title="Копіювати dra/driver-install/serviceaccount.yaml до буферу обміну"></img></div>
              <div class="includecode" id="dra-driver-install-serviceaccount-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ServiceAccount</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-service-account</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app.kubernetes.io/instance</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver</span></span></span></code></pre></div></div>
          </div>

          ```shell
          kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/serviceaccount.yaml
          ```

      1.  Створіть ClusterRole:

          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          <div class="highlight code-sample">
              <div class="copy-code-icon">
              <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/clusterrole.yaml" download="dra/driver-install/clusterrole.yaml"><code>dra/driver-install/clusterrole.yaml</code>
              </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-clusterrole-yaml')" title="Копіювати dra/driver-install/clusterrole.yaml до буферу обміну"></img></div>
              <div class="includecode" id="dra-driver-install-clusterrole-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io/v1</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ClusterRole</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-role</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">rules</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl">- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;resource.k8s.io&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;resourceclaims&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;get&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl">- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;nodes&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;get&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl">- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;resource.k8s.io&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;resourceslices&#34;</span><span class="p">]</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;get&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;list&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;watch&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;create&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;update&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;patch&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;delete&#34;</span><span class="p">]</span></span></span></code></pre></div></div>
          </div>

          ```shell
          kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrole.yaml
          ```

      1.  Створіть ClusterRoleBinding:

          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          
          <div class="highlight code-sample">
              <div class="copy-code-icon">
              <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/clusterrolebinding.yaml" download="dra/driver-install/clusterrolebinding.yaml"><code>dra/driver-install/clusterrolebinding.yaml</code>
              </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-clusterrolebinding-yaml')" title="Копіювати dra/driver-install/clusterrolebinding.yaml до буферу обміну"></img></div>
              <div class="includecode" id="dra-driver-install-clusterrolebinding-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io/v1</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ClusterRoleBinding</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-role-binding</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">subjects</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl">- <span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ServiceAccount</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-service-account</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="nt">roleRef</span><span class="p">:</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ClusterRole</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-role</span><span class="w">
          </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">apiGroup</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io</span></span></span></code></pre></div></div>
          </div>

          ```shell
          kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/clusterrolebinding.yaml
          ```

1.  Створіть <a class='glossary-tooltip' title='Зіставлення імені класу з пріоритетом планування, який повинен мати Pod.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/scheduling-eviction/pod-priority-preemption/#priorityclass' target='_blank' aria-label='PriorityClass'>PriorityClass</a> для DRA
    драйвера. PriorityClass запобігає витісненню компонента драйвера DRA, який відповідає за важливі операції життєвого циклу для Podʼів з заявками. Дізнайтеся більше про [пріоритет Podʼів та виселення тут](/docs/concepts/scheduling-eviction/pod-priority-preemption/).

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="highlight code-sample">
        <div class="copy-code-icon">
        <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/priorityclass.yaml" download="dra/driver-install/priorityclass.yaml"><code>dra/driver-install/priorityclass.yaml</code>
        </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-priorityclass-yaml')" title="Копіювати dra/driver-install/priorityclass.yaml до буферу обміну"></img></div>
        <div class="includecode" id="dra-driver-install-priorityclass-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">scheduling.k8s.io/v1</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">PriorityClass</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-driver-high-priority</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="m">1000000</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">globalDefault</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;This priority class should be used for DRA driver pods only.&#34;</span></span></span></code></pre></div></div>
    </div>

    ```shell
    kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/priorityclass.yaml
    ```

1.  Розгорніть фактичний драйвер DRA як DaemonSet, налаштований на запуск прикладу двійкового файлу драйвера з вищезазначеними дозволами.

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="highlight code-sample">
        <div class="copy-code-icon">
        <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/daemonset.yaml" download="dra/driver-install/daemonset.yaml"><code>dra/driver-install/daemonset.yaml</code>
        </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-daemonset-yaml')" title="Копіювати dra/driver-install/daemonset.yaml до буферу обміну"></img></div>
        <div class="includecode" id="dra-driver-install-daemonset-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">apps/v1</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">DaemonSet</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-kubeletplugin</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">selector</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">matchLabels</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">updateStrategy</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">RollingUpdate</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">template</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">metadata</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">labels</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">app.kubernetes.io/name</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">spec</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">priorityClassName</span><span class="p">:</span><span class="w"> </span><span class="l">dra-driver-high-priority</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">serviceAccountName</span><span class="p">:</span><span class="w"> </span><span class="l">dra-example-driver-service-account</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>{}<span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">containers</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">plugin</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">privileged</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/dra-example-driver/dra-example-driver:v0.2.0</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">imagePullPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">IfNotPresent</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;dra-example-kubeletplugin&#34;</span><span class="p">]</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">resources</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span>{}<span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># Драйвери для промислового використання повинні завжди надавати пробу життєздатності</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># Для цього прикладу ми просто пропускаємо її.</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># livenessProbe:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#   grpc:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#     port: 51515</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#     service: liveness</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#   failureThreshold: 3</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c">#   periodSeconds: 10</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">env</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">CDI_ROOT</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="l">/var/run/cdi</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">KUBELET_REGISTRAR_DIRECTORY_PATH</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins_registry&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">KUBELET_PLUGINS_DIRECTORY_PATH</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">NODE_NAME</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">fieldRef</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">fieldPath</span><span class="p">:</span><span class="w"> </span><span class="l">spec.nodeName</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">NAMESPACE</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">valueFrom</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">fieldRef</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">fieldPath</span><span class="p">:</span><span class="w"> </span><span class="l">metadata.namespace</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c"># Кількість пристроїв, які демонстраційний драйвер буде імітувати.</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">NUM_DEVICES</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;9&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">HEALTHCHECK_PORT</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">value</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;51515&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">volumeMounts</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">plugins-registry</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins_registry&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">plugins</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cdi</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">mountPath</span><span class="p">:</span><span class="w"> </span><span class="l">/var/run/cdi</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">plugins-registry</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">hostPath</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins_registry&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">plugins</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">hostPath</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;/var/lib/kubelet/plugins&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">cdi</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">hostPath</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/var/run/cdi</span><span class="w">
    </span></span></span></code></pre></div></div>
    </div>

    ```shell
    kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/daemonset.yaml
    ```
    DaemonSet налаштовано з точками монтування томів, необхідними для взаємодії з підлягаючим текою Container Device Interface (CDI), і для відкриття його сокета для `kubelet` через теку `kubelet/plugins`.

### Перевірка встановлення драйвера DRA {#verify-driver-install}

1.  Отримайте список Podʼів DaemonSet драйвера DRA на всіх робочих вузлах:

    ```shell
    kubectl get pod -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial
    ```

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

    ```text
    NAME                                     READY   STATUS    RESTARTS   AGE
    dra-example-driver-kubeletplugin-4sk2x   1/1     Running   0          13s
    dra-example-driver-kubeletplugin-cttr2   1/1     Running   0          13s
    ```

1.  Початкова відповідальність локального драйвера DRA кожного вузла полягає в оновленні відомостей кластера про те, які пристрої доступні для Podʼів на цьому вузлі, публікуючи його метадані в API ResourceSlices. Ви можете перевірити цей API, щоб побачити, що кожен вузол з драйвером оголошує клас пристрою, який він представляє.

    Перевірте наявність доступних ResourceSlices:

    ```shell
    kubectl get resourceslices
    ```

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

    ```text
    NAME                                 NODE           DRIVER            POOL           AGE
    kind-worker-gpu.example.com-k69gd    kind-worker    gpu.example.com   kind-worker    19s
    kind-worker2-gpu.example.com-qdgpn   kind-worker2   gpu.example.com   kind-worker2   19s
    ```

На даний момент ви успішно встановили приклад драйвера DRA та підтвердили його початкову конфігурацію. Тепер ви готові використовувати DRA для планування Podʼів.

## Запит ресурсів та розгортання Podʼа {#claim-resources-pod}

Щоб запитати ресурси за допомогою DRA, ви створюєте ResourceClaims або ResourceClaimTemplates, які визначають ресурси, які потрібні вашим Podʼам. У демонстраційному драйвері для симульованих пристроїв GPU доступний атрибут ємності памʼяті. Цей розділ показує, як використовувати <a class='glossary-tooltip' title='Мова виразів, яка розроблена для безпечного виконання коду користувача.' data-bs-toggle='tooltip' data-bs-placement='top' href='https://cel.dev' target='_blank' aria-label='Загальна мова виразів'>Загальна мова виразів</a> для
зазначення ваших вимог у ResourceClaim, вибору цього ResourceClaim у специфікації Podʼа та спостереження за виділенням ресурсів.

Цей посібник демонструє лише один базовий приклад ResourceClaim DRA. Читайте [Динамічне виділення ресурсів](/docs/concepts/scheduling-eviction/dynamic-resource-allocation/), щоб дізнатися більше про ResourceClaims.

### Створення ResourceClaim {#create-resourceclaim}

У цьому розділі ви створюєте ResourceClaim і посилаєтеся на нього в Pod. Яким би не був запит, поле `deviceClassName` є обовʼязковим, звужуючи обсяг запиту до конкретного класу пристрою. Сам запит може включати вираз <a class='glossary-tooltip' title='Мова виразів, яка розроблена для безпечного виконання коду користувача.' data-bs-toggle='tooltip' data-bs-placement='top' href='https://cel.dev' target='_blank' aria-label='Загальна мова виразів'>Загальна мова виразів</a>, який посилається на атрибути, які можуть бути оголошені драйвером, що керує цим класом пристроїв.

У цьому прикладі ви створите запит на будь-який GPU, що оголошує понад 10Gi ємності памʼяті. Атрибут, що експонує ємність від прикладного драйвера, має форму `device.capacity['gpu.example.com'].memory`. Зверніть увагу, що імʼя запиту встановлено на `some-gpu`.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/example/resourceclaim.yaml" download="dra/driver-install/example/resourceclaim.yaml"><code>dra/driver-install/example/resourceclaim.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-example-resourceclaim-yaml')" title="Копіювати dra/driver-install/example/resourceclaim.yaml до буферу обміну"></img></div>
    <div class="includecode" id="dra-driver-install-example-resourceclaim-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">resource.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ResourceClaim</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">   </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span><span class="nt">requests</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">     </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">       </span><span class="nt">exactly</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">deviceClassName</span><span class="p">:</span><span class="w"> </span><span class="l">gpu.example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span><span class="nt">selectors</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">         </span>- <span class="nt">cel</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">             </span><span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;device.capacity[&#39;gpu.example.com&#39;].memory.compareTo(quantity(&#39;10Gi&#39;)) &gt;= 0&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

```shell
kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/resourceclaim.yaml
```

### Створення Pod, який посилається на цей ResourceClaim {#create-the-pod-that-references-that-resourceclaim}

Нижче наведено маніфест Pod, що посилається на ResourceClaim, який ви щойно створили, `some-gpu`, у полі `spec.resourceClaims.resourceClaimName`. Локальне імʼя для цього запиту, `gpu`, потім використовується в полі `spec.containers.resources.claims.name`, щоб виділити запит для підлеглого контейнера Pod.


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/dra/driver-install/example/pod.yaml" download="dra/driver-install/example/pod.yaml"><code>dra/driver-install/example/pod.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('dra-driver-install-example-pod-yaml')" title="Копіювати dra/driver-install/example/pod.yaml до буферу обміну"></img></div>
    <div class="includecode" id="dra-driver-install-example-pod-yaml"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">pod0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">ctr0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">ubuntu:24.04</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">command</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;bash&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;-c&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">args</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;export; trap &#39;exit 0&#39; TERM; sleep 9999 &amp; wait&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">claims</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resourceClaims</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">gpu</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">resourceClaimName</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span></span></span></code></pre></div></div>
</div>

```shell
kubectl apply --server-side -f http://k8s.io/examples/dra/driver-install/example/pod.yaml
```

1.  Підтвердіть, що pod розгорнуто:

    ```shell
    kubectl get pod pod0 -n dra-tutorial
    ```

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

    ```text
    NAME   READY   STATUS    RESTARTS   AGE
    pod0   1/1     Running   0          9s
    ```

### Дослідження стану DRA {#explore-the-dra-state}

Після створення Podʼа кластер намагається запланювати цей Pod на вузол, де Kubernetes може задовольнити ResourceClaim. У цьому навчальному посібнику драйвер DRA розгорнуто на всіх вузлах і оголошено симульовані GPU на всіх вузлах, всі з яких мають достатню оголошену ємність для задоволення заявки Podʼа, тому Kubernetes може планувати цей Pod на будь-якому вузлі та може виділити будь-який з симульованих GPU на цьому вузлі.

Коли Kubernetes виділяє симульований GPU для Pod, демонстраційний драйвер додає змінні середовища в кожен контейнер, до якого він виділений, щоб вказати, які GPU _мали б_ бути впроваджені в них реальним драйвером ресурсів і як вони мали б бути налаштовані, тому ви можете перевірити ці змінні середовища, щоб побачити, як Podʼи оброблялися системою.

1.  Перевірте логи Pod, які повідомляють імʼя симульованого GPU, що був виділений:

    ```shell
    kubectl logs pod0 -c ctr0 -n dra-tutorial | grep -E "GPU_DEVICE_[0-9]+=" | grep -v "RESOURCE_CLAIM"
    ```

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

    ```text
    declare -x GPU_DEVICE_0="gpu-0"
    ```

1.  Перевірте стан обʼєкта ResourceClaim:

    ```shell
    kubectl get resourceclaims -n dra-tutorial
    ```

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

    ```text
    NAME       STATE                AGE
    some-gpu   allocated,reserved   34s
    ```

    У цьому виводі стовпець `STATE` показує, що ResourceClaim виділено та зарезервовано.

1.  Перевірте деталі ResourceClaim `some-gpu`. Вираз `status` в ResourceClaim містить інформацію про виділений пристрій і Pod, для якого він був зарезервований:

    ```shell
    kubectl get resourceclaim some-gpu -n dra-tutorial -o yaml
    ```

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

    <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">resource.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">ResourceClaim</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">    </span><span class="nt">creationTimestamp</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2025-08-20T18:17:31Z&#34;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">    </span><span class="nt">finalizers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">    </span>- <span class="l">resource.kubernetes.io/delete-protection</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">    </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">    </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">dra-tutorial</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">    </span><span class="nt">resourceVersion</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2326&#34;</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">    </span><span class="nt">uid</span><span class="p">:</span><span class="w"> </span><span class="l">d3e48dbf-40da-47c3-a7b9-f7d54d1051c3</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">    </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">        </span><span class="nt">requests</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">        </span>- <span class="nt">exactly</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">            </span><span class="nt">allocationMode</span><span class="p">:</span><span class="w"> </span><span class="l">ExactCount</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">            </span><span class="nt">count</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">            </span><span class="nt">deviceClassName</span><span class="p">:</span><span class="w"> </span><span class="l">gpu.example.com</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">            </span><span class="nt">selectors</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">            </span>- <span class="nt">cel</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">                </span><span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="l">device.capacity[&#39;gpu.example.com&#39;].memory.compareTo(quantity(&#39;10Gi&#39;))</span><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">                </span><span class="l">&gt;= 0</span><span class="w">
</span></span></span><span class="line"><span class="ln">22</span><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span><span class="w">
</span></span></span><span class="line"><span class="ln">23</span><span class="cl"><span class="nt">status</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">24</span><span class="cl"><span class="w">    </span><span class="nt">allocation</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">25</span><span class="cl"><span class="w">        </span><span class="nt">devices</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">26</span><span class="cl"><span class="w">        </span><span class="nt">results</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">27</span><span class="cl"><span class="w">        </span>- <span class="nt">device</span><span class="p">:</span><span class="w"> </span><span class="l">gpu-0</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">28</span><span class="cl"><span class="w">            </span><span class="nt">driver</span><span class="p">:</span><span class="w"> </span><span class="l">gpu.example.com</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">29</span><span class="cl"><span class="w">            </span><span class="nt">pool</span><span class="p">:</span><span class="w"> </span><span class="l">kind-worker</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">30</span><span class="cl"><span class="w">            </span><span class="nt">request</span><span class="p">:</span><span class="w"> </span><span class="l">some-gpu</span><span class="w">
</span></span></span><span class="line"><span class="ln">31</span><span class="cl"><span class="w">        </span><span class="nt">nodeSelector</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">32</span><span class="cl"><span class="w">        </span><span class="nt">nodeSelectorTerms</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">33</span><span class="cl"><span class="w">        </span>- <span class="nt">matchFields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">34</span><span class="cl"><span class="w">            </span>- <span class="nt">key</span><span class="p">:</span><span class="w"> </span><span class="l">metadata.name</span><span class="w">
</span></span></span><span class="line"><span class="ln">35</span><span class="cl"><span class="w">            </span><span class="nt">operator</span><span class="p">:</span><span class="w"> </span><span class="l">In</span><span class="w">
</span></span></span><span class="line"><span class="ln">36</span><span class="cl"><span class="w">            </span><span class="nt">values</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="ln">37</span><span class="cl"><span class="w">            </span>- <span class="l">kind-worker</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">38</span><span class="cl"><span class="w">    </span><span class="nt">reservedFor</span><span class="p">:</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">39</span><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">pod0</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">40</span><span class="cl"><span class="w">        </span><span class="nt">resource</span><span class="p">:</span><span class="w"> </span><span class="l">pods</span><span class="w">
</span></span></span><span class="line hl"><span class="ln">41</span><span class="cl"><span class="w">        </span><span class="nt">uid</span><span class="p">:</span><span class="w"> </span><span class="l">c4dadf20-392a-474d-a47b-ab82080c8bd7</span></span></span></code></pre></div>

1.  Щоб перевірити, як драйвер обробив виділення пристрою, отримайте журнали для Podʼів DaemonSet драйвера:

    ```shell
    kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial
    ```

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

    ```log
    I0729 05:11:52.679057       1 driver.go:84] NodePrepareResource is called: number of claims: 1
    I0729 05:11:52.684450       1 driver.go:112] Returning newly prepared devices for claim '79e1e8d8-7e53-4362-aad1-eca97678339e': [&Device{RequestNames:[some-gpu],PoolName:kind-worker,DeviceName:gpu-4,CDIDeviceIDs:[k8s.gpu.example.com/gpu=common k8s.gpu.example.com/gpu=79e1e8d8-7e53-4362-aad1-eca97678339e-gpu-4],}]
    ```

Тепер ви успішно розгорнули Pod, який запитує пристрої за допомогою DRA, перевірили, що Pod було заплановано на відповідний вузол, і побачили, що повʼязані види API DRA були оновлені зі статусом виділення.

## Видалення Podʼа, що має заявку {#delete-pod-claim}

Коли Pod з заявкою видаляється, драйвер DRA деалокує ресурс, щоб він був доступний для майбутнього планування. Щоб перевірити цю поведінку, видаліть Pod, який ви створили на попередніх кроках, і спостерігайте за відповідними змінами в ResourceClaim та драйвері.

1.  Видаліть Pod `pod0`:

    ```shell
    kubectl delete pod pod0 -n dra-tutorial
    ```

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

    ```text
    pod "pod0" deleted
    ```

### Спостереження за станом DRA {#observe-the-dra-state}

Коли Pod видаляється, драйвер деалокує пристрій з ResourceClaim і оновлює ресурс ResourceClaim в API Kubernetes. ResourceClaim має стан `pending`, поки він не буде згаданий у новому Pod.

1.  Перевірте стан ResourceClaim `some-gpu`:

    ```shell
    kubectl get resourceclaims -n dra-tutorial
    ```

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

    ```text
    NAME       STATE     AGE
    some-gpu   pending   76s
    ```

1.  Перевірте, що драйвер обробив скасування підготовки пристрою для цього запиту, перевіривши журнали драйвера:

    ```shell
    kubectl logs -l app.kubernetes.io/name=dra-example-driver -n dra-tutorial
    ```

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

    ```log
    I0820 18:22:15.629376       1 driver.go:138] UnprepareResourceClaims is called: number of claims: 1
    ```

Тепер ви видалили Pod, який мав заявку, і спостерігали, що драйвер вживав заходів для скасування підготовки підлягаючого апаратного ресурсу та оновлення API DRA, щоб відобразити, що ресурс знову доступний для майбутнього планування.

## Очищення

Щоб очистити ресурси, які ви створили в цьому навчальному посібнику, виконайте ці кроки:

```shell
kubectl delete namespace dra-tutorial
kubectl delete deviceclass gpu.example.com
kubectl delete clusterrole dra-example-driver-role
kubectl delete clusterrolebinding dra-example-driver-role-binding
kubectl delete priorityclass dra-driver-high-priority
```

## Що далі

* [Дізнайтеся більше про DRA](/docs/concepts/scheduling-eviction/dynamic-resource-allocation)
* [Виділення пристроїв робочим навантаженням за допомогою DRA](/docs/tasks/configure-pod-container/assign-resources/allocate-devices-dra)
