# Керування ресурсами на рівні Podʼів

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

---

<!-- overview -->















            

            
              
            <div class="feature-state-notice feature-beta" title="Функціональна можливість: PodLevelResourceManagers">
              <span class="feature-state-name">Стан функціоналу:</span>
              <span class="feature-state-details">
               
                 <span class='feature-state-stage'>Beta</span> починаючи з Kubernetes v1.37; стандартно вимкнено
               </span>
            </div>

            
            <div class="feature-beta">
              
              
                <details>
                <summary>Докладніше про цей функціонал</summary>
                <p>Щоб скористатися цією функцією, вам (або адміністратору кластера) потрібно увімкнути функціональну можливість <a href="/uk/docs/reference/command-line-tools-reference/feature-gates/#PodLevelResourceManagers"><tt>PodLevelResourceManagers</tt></a> для всіх відповідних компонентів у вашому кластері.</p>
<p>Перегляньте <a href="/uk/docs/tasks/administer-cluster/configure-feature-gates/">Увімкнення або вимкнення функціональних можливостей</a> для отримання додаткової інформації.</p>

                </details>
                </div>


Підтримка ресурсів на рівні Podʼів для наявних менеджерів ресурсів (Topology, CPU та Memory) розширює їх для роботи зі специфікаціями ресурсів на рівні Podʼів. Коли цю функцію увімкнено (через функціональні можливості `PodLevelResources` та `PodLevelResourceManagers`), менеджери ресурсів можуть використовувати `.spec.resources` безпосередньо як основу для своїх рішень щодо виділення, еволюціонуючи від суто поконтейнерної моделі виділення до <a class='glossary-tooltip' title='Pod є групою контейнерів, що запущені у вашому кластері.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/pods/' target='_blank' aria-label='Pod'>Pod</a>-центричної. Ця схема розділення впроваджує більш гнучку та потужну модель керування ресурсами, особливо для чутливих до продуктивності робочих навантажень. Вона дозволяє визначати гібридні моделі виділення, у яких деякі контейнери в Podʼі отримують ексклюзивні, вирівняні за NUMA ресурси, тоді як інші спільно використовують решту ресурсів зі спільного пулу на рівні Podʼа.

Щоб попрактикуватися в налаштуванні менеджерів ресурсів `kubelet` з ресурсами на рівні Podʼів і на власні очі спостерігати за поведінкою виділення, ознайомтесь з навчальним посібником [Використання ресурсів на рівні Podʼів з менеджерами ресурсів `kubelet`](/docs/tutorials/cluster-management/use-pod-level-resource-managers/).

<!-- body -->

Щоб зрозуміти менеджерів ресурсів на рівні Podʼів, корисно порівняти їх із традиційною моделлю, орієнтованою на контейнери. Раніше виділення ресурсів `kubelet` було суто "все або нічого": щоб отримати ексклюзивні, вирівняні за NUMA ресурси для вашого робочого навантаження, кожен контейнер у Podʼі мав бути Guaranteed (із зазначенням запитів, рівних лімітам, як для CPU, так і для памʼяті).

Менеджери ресурсів на рівні Podʼів використовують `.spec.resources`, щоб увімкнути гнучке розділення на основі налаштованої області дії менеджера топології:

- **Область дії `pod`:** `kubelet` виділяє та вирівнює за NUMA єдину «бульбашку» Pod для всього Podʼа на основі `.spec.resources`. Контейнери, які запитують ексклюзивні виділення, виділяють собі окремі сегменти всередині цієї «бульбашки» Pod, тоді як усі інші контейнери спільно використовують решту ємності «бульбашки» у загальному пулі, ізольованому на рівні Pod.
- **Область дії `container`:** вмикає гібридну модель виділення. `kubelet` дозволяє окремим контейнерам отримувати ексклюзивні, вирівняні за NUMA ресурси безпосередньо з пулу, доступного для виділення на вузлі, використовуючи стелю `.spec.resources` Podʼа для обмеження сукупного споживання — що дозволяє sidecars працювати в загальному спільному пулі вузла без необхідності, щоб кожен контейнер у Podʼі був Guaranteed.

Як стандартні init-контейнери, так і init-контейнери з можливістю перезапуску (sidecar) повністю підтримуються. Вони можуть отримувати ексклюзивні частки ресурсів або використовувати спільний пул Podʼа, а менеджери ресурсів на рівні Podʼів дотримуються їхніх правил життєвого циклу (наприклад, повторно використовувані ресурси для стандартних init-контейнерів проти постійних резервувань для сайдкарів).

## Глосарій {#glossary}

Специфікація ресурсів на рівні Podʼа
: Бюджет ресурсів, визначений на рівні Podʼа в `.spec.resources`, який визначає сукупні запити та ліміти для всього Podʼа.

Контейнер Guaranteed
: Контейнер, який визначає запити ресурсів, рівні його лімітам, як для CPU (ексклюзивне виділення CPU вимагає додатного цілого значення), так і для памʼяті. Відповідно до наявної поведінки `kubelet`, це робить контейнер придатним для ексклюзивного виділення ресурсів менеджерами ресурсів.

Ексклюзивна частка
: Виділена частина ресурсів (наприклад, конкретні CPU або сторінки памʼяті), призначена виключно одному контейнеру, що забезпечує ізоляцію від інших контейнерів.

Спільний пул Podʼа
: Підмножина виділених ресурсів Podʼа, яка залишається після резервування всіх ексклюзивних часток. Ці ресурси спільно використовуються всіма контейнерами в Podʼі, які не отримують ексклюзивного виділення. Хоча контейнери в цьому пулі спільно використовують ресурси один з одним, вони суворо ізольовані від ексклюзивних часток і загального спільного пулу вузла.

## Як працюють менеджери ресурсів на рівні Podʼів {#how-pod-level-resource-managers-work}

Менеджери ресурсів CPU та Memory працюють по-різному залежно від налаштованої області дії менеджера топології.

### Область дії `pod` менеджера топології та ресурси на рівні Podʼів {#topology-managers-pod-scope-and-pod-level-resources}

Коли область дії менеджера топології встановлено в `pod`, `kubelet` виконує єдине вирівнювання за NUMA для всього Podʼа на основі бюджету ресурсів, визначеного в `.spec.resources`.

Отриманий вирівняний за NUMA пул ресурсів потім розділяється:

1. **Ексклюзивні частки:** Контейнери, які визначають ресурси Guaranteed (запити, рівні лімітам, як для CPU, так і для памʼяті, а запит CPU є додатним цілим числом), отримують ексклюзивні частки із загального виділення Podʼа.
2. **Спільний пул Podʼа:** Решта ресурсів утворює спільний пул для всіх інших контейнерів у Podʼі, які не отримують ексклюзивного виділення. Хоча контейнери в цьому пулі спільно використовують ресурси один з одним, вони суворо ізольовані від ексклюзивних часток і загального спільного пулу вузла.

Зверніть увагу, що коли стандартні init-контейнери завершують виконання, їхні ресурси переходять у повторно використовуваний набір для Podʼа, а не повертаються до пулу ресурсів вузла. Оскільки вони виконуються послідовно, наступні контейнери застосунку можуть повторно використовувати ці ресурси (або для власних ексклюзивних часток, або для спільного пулу).

Це дозволяє розміщувати разом контейнери, які потребують ексклюзивних ресурсів (наприклад, високопродуктивний основний застосунок), з тими, які цього не потребують (наприклад, sidecars для журналювання або моніторингу), — все в межах одного вирівняного за NUMA Podʼа.

Розглянемо контейнери в наступній специфікації Podʼа, де область дії менеджера топології — `pod`, а Pod має загальний бюджет у 4 CPU. `main-app` запитує ексклюзивну частку у 2 CPU, тоді як сайдкари спільно використовують решту 2 CPU у спільному пулі Podʼа:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/resource/pod-level-resource-managers-pod-scope-mixed.yaml" download="pods/resource/pod-level-resource-managers-pod-scope-mixed.yaml"><code>pods/resource/pod-level-resource-managers-pod-scope-mixed.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-resource-pod-level-resource-managers-pod-scope-mixed-yaml')" title="Копіювати pods/resource/pod-level-resource-managers-pod-scope-mixed.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-resource-pod-level-resource-managers-pod-scope-mixed-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">pod-scope-mixed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;A pod demonstrating pod-level scope where one container gets exclusive resources and others share the remaining pod resources in a shared pool.&#34;</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="c"># На рівні Podʼа, Pod має запит на CPU, рівний лімітам, і запит на памʼять також</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># рівний лімітам памʼяті. Контейнер main-app відповідає вимогам для класу QoS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Guaranteed на рівні контейнера, а sidecar контейнери не вказують жодного</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># запиту на ресурси. У межах масштабу Podʼа kubelet може статично призначити</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># 4 CPU для всього Podʼа, з яких 2 призначені ексклюзивно для контейнера</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># main-app, а решта 2 спільно використовуються sidecar контейнерами.</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">initContainers</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">metrics-sidecar</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не</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">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Always</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">logging-sidecar</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не</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">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Always</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">main-app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей.</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/pause:3.9</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2Gi&#34;</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

**Важливі міркування:**

Під час використання ресурсів на рівні Podʼів з областю дії `pod` менеджера топології є кілька важливих міркувань:

- **Обмеження порожнього спільного пулу:** Ця конфігурація не дозволяє специфікації Podʼа, які призвели б до порожнього спільного пулу Podʼа, якщо є контейнери, які потребують такого пулу. Якщо сума запитів ресурсів усіх контейнерів, які є Guaranteed, точно дорівнює загальному бюджету ресурсів, і є принаймні один інший контейнер, який потребує спільного пулу, `kubelet` відхиляє Pod під час допуску.

    Наприклад, наступний Pod запитує бюджет на рівні Podʼа у 4 CPU. `main-app` потребує ексклюзивних 3 CPU, а `metrics-sidecar` потребує ексклюзивний 1 CPU. Оскільки у спільному пулі для `logging-sidecar` не залишається жодного CPU, `kubelet` відхиляє цей Pod (та сама перевірка застосовується для памʼяті):

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <div class="highlight code-sample">
        <div class="copy-code-icon">
        <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/resource/pod-level-resource-managers-empty-shared-pool.yaml" download="pods/resource/pod-level-resource-managers-empty-shared-pool.yaml"><code>pods/resource/pod-level-resource-managers-empty-shared-pool.yaml</code>
        </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-resource-pod-level-resource-managers-empty-shared-pool-yaml')" title="Копіювати pods/resource/pod-level-resource-managers-empty-shared-pool.yaml до буферу обміну"></img></div>
        <div class="includecode" id="pods-resource-pod-level-resource-managers-empty-shared-pool-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">empty-shared-pool</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;A pod demonstrating a configuration that is rejected because exclusive containers consume the entire pod resource budget, leaving no resources for the remaining container in the shared pool.&#34;</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="c"># На рівні Podʼа, Pod має запит на CPU, рівний лімітам, і запит на памʼять також</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># рівний лімітам памʼяті. Контейнер main-app і metrics-sidecar відповідають вимогам для</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># класу QoS Guaranteed на рівні контейнера, а контейнер logging-sidecar не вказує</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># жодного запиту на ресурси. Оскільки контейнери Guaranteed споживають весь ресурсний</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># бюджет Podʼа, залишаючи 0 CPU для спільного пулу, необхідного для logging-sidecar,</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># цей Pod буде відхилено при допуску.</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">limits</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">initContainers</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">metrics-sidecar</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не</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">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.9</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Always</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1Gi&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">limits</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1Gi&#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">logging-sidecar</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не</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">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.9</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Always</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">main-app</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей.</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/pause:3.9</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3Gi&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">limits</span><span class="p">:</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3&#34;</span><span class="w">
    </span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;3Gi&#34;</span><span class="w">
    </span></span></span></code></pre></div></div>
    </div>

- **Втрачені ресурси:** Будь-які ресурси, надмірно виділені під час використання області дії `pod` (сума запитів контейнерів менша за бюджет на рівні Podʼа, і немає контейнерів спільного пулу, або контейнери спільного пулу не повністю використовують решту), залишаються призначеними та зарезервованими для Podʼа, фактично марнуючись протягом усього виконання Podʼа.

- **Постійний пул:** Загальний пул ресурсів Podʼа (вирівнювання за NUMA та загальна зарезервована ємність) є постійним. Якщо контейнер спільного пулу аварійно завершується та перезапускається, загальне резервування ресурсів Podʼа залишається надійно закріпленим на вузлі. Вузол повертає ресурси до свого загального пулу лише тоді, коли завершується весь Pod.

### Область дії `container` менеджера топології та ресурси на рівні Podʼів {#topology-manager-s-container-scope-and-pod-level-resources}

Коли область дії менеджера топології встановлено в `container`, `kubelet` оцінює кожен контейнер окремо для ексклюзивного виділення.

Якщо весь Pod досягає класу QoS <a class='glossary-tooltip' title='Клас обслуговування QoS (Quality of Service Class) надає можливість Kubernetes класифікувати Podʼи в кластері в декілька класів і приймати рішення щодо їх планування та видалення.' data-bs-toggle='tooltip' data-bs-placement='top' href='/uk/docs/concepts/workloads/pods/pod-qos/' target='_blank' aria-label='клас QoS'>клас QoS</a> Guaranteed (шляхом зазначення відповідних значень у `.spec.resources` на рівні Podʼа), ви можете змішувати та поєднувати контейнери:

- Контейнери з власними запитами Guaranteed отримують ексклюзивні, вирівняні за NUMA ресурси.
- Інші контейнери в Podʼі, які не визначають запити Guaranteed, працюють у спільному пулі вузла.
- Сукупне споживання ресурсів усіма контейнерами все одно обмежується лімітами `.spec.resources` Podʼа.

Ця область дії корисна, коли у вас є інфраструктурний sidecar, який має бути вирівняний за конкретним вузлом NUMA для доступу до пристроїв, тоді як основне робоче навантаження може працювати в загальному спільному пулі вузла.

Розглянемо контейнери в наступній специфікації Podʼа, де область дії менеджера топології — `container`, а Pod представляє робоче навантаження з інфраструктурним sidecar і двома робочими процесами застосунку, із загальним бюджетом у 4 CPU. `infrastructure-sidecar` отримує ексклюзивну, вирівняну за NUMA частку у 2 CPU. Два робочі процеси застосунку (`worker-1` та `worker-2`) працюють у загальному спільному пулі вузла:


















<div class="highlight code-sample">
    <div class="copy-code-icon">
    <a href="https://raw.githubusercontent.com/kubernetes/website/main/content/uk/examples/pods/resource/pod-level-resource-managers-container-scope-mixed.yaml" download="pods/resource/pod-level-resource-managers-container-scope-mixed.yaml"><code>pods/resource/pod-level-resource-managers-container-scope-mixed.yaml</code>
    </a><img src="/images/copycode.svg" class="icon-copycode" onclick="copyCode('pods-resource-pod-level-resource-managers-container-scope-mixed-yaml')" title="Копіювати pods/resource/pod-level-resource-managers-container-scope-mixed.yaml до буферу обміну"></img></div>
    <div class="includecode" id="pods-resource-pod-level-resource-managers-container-scope-mixed-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">container-scope-mixed</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">kubernetes.io/description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;A pod demonstrating container-level scope where one container gets exclusive resources and others run in the node&#39;s shared pool.&#34;</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="c"># На рівні Podʼа, Pod має запит на CPU, рівний лімітам, і запит на памʼять також</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># рівний лімітам памʼяті. Контейнер infrastructure-sidecar відповідає вимогам для</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># класу QoS Guaranteed на рівні контейнера, а робочі контейнери не вказують</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># жодного запиту на ресурси. У межах контейнерного масштабу kubelet оцінює</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"># infrastructure-sidecar отримує ексклюзивний фрагмент CPU на 2 ядра, тоді як</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"># лімітами Podʼа.</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;4Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">initContainers</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">infrastructure-sidecar</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не</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">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.k8s.io/pause:3.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restartPolicy</span><span class="p">:</span><span class="w"> </span><span class="l">Always</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">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">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2Gi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;2Gi&#34;</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">worker-1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей.</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/pause:3.9</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">worker-2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># Примітка: Тут поле image є заповнювачем для демонстраційних цілей.</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/pause:3.9</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

### Квота CPU (CFS) {#cpu-quota-cfs}

Під час виконання змішаних робочих навантажень у межах Podʼа `kubelet` забезпечує ізоляцію по-різному залежно від виділення:

- **Ексклюзивні контейнери:** Контейнери з ексклюзивними частками CPU мають вимкнене застосування квоти CFS CPU, що дозволяє їм працювати без обмеження планувальником Linux.
- **Контейнери спільного пулу Podʼа:** Контейнери у спільному пулі Podʼа мають увімкнені квоти CFS CPU, що гарантує, що вони не споживають більше, ніж залишковий бюджет Podʼа, і запобігає їхньому втручанню в роботу ексклюзивних контейнерів.

### Постійний пул і перезапуски {#persistent-pool-and-restarts}

Загальний пул ресурсів Podʼа (вирівнювання за NUMA та загальна зарезервована ємність) є постійним. Якщо контейнер у спільному пулі Podʼа аварійно завершується та перезапускається, загальне резервування ресурсів Podʼа залишається надійно закріпленим на вузлі. Вузол повертає ресурси до свого загального пулу лише тоді, коли завершується весь Pod.

### Пониження версії `kubelet` та контрольні точки стану {#kubelet-downgrades-and-state-checkpoints}

У Kubernetes 1.36 увімкнення `PodLevelResourceManagers` оновило внутрішні файли контрольних точок стану `kubelet` (`cpu_manager_state` та `memory_manager_state`) до формату, який старіші версії `kubelet` не можуть завантажити. Якщо ви понизите версію `kubelet` 1.36 після активного використання, старіший `kubelet` не зможе запуститися; ви маєте очистити вузол, видалити ці файли контрольних точок і перезапустити `kubelet`.

У Kubernetes 1.37 файли контрольних точок використовують формат, сумісний із майбутніми версіями, щоб запобігти збоям під час запуску при пониженні версії, хоча версії `kubelet` 1.36 не відновлюють активні призначення ресурсів на рівні Podʼів. Повні деталі про формати контрольних точок і відновлення див. у [Довідці менеджерів ресурсів на рівні Podʼів](/docs/reference/node/pod-level-resource-managers/#state-checkpoints).

## Спостережуваність і метрики {#observability-and-metrics}

Ви можете контролювати поведінку та справність менеджерів ресурсів як для виділень на рівні контейнерів, так і на рівні Podʼів, використовуючи наступні метрики `kubelet` (увімкнені через функціональну можливість `PodLevelResourceManagers`):

- `resource_manager_allocations_total`: підраховує загальну кількість ексклюзивних виділень ресурсів, виконаних менеджером. Мітка `source` ("pod" або "node") розрізняє виділення з пулу на рівні вузла та попередньо виділеного пулу на рівні Podʼа.
- `resource_manager_allocation_errors_total`: підраховує помилки, що виникають під час ексклюзивного виділення ресурсів, розрізняючи їх за передбачуваним джерелом `source` виділення ("pod" або "node").
- `resource_manager_container_assignments`: відстежує сукупну кількість контейнерів, яким буде надано конкретний тип призначення ресурсів. Мітка `assignment_type` ("node_exclusive", "pod_exclusive", "pod_shared") забезпечує видимість того, скільки контейнерів працюють з ексклюзивними ресурсами (з пулу вузла або Podʼа) порівняно зі спільним пулом на рівні Podʼа.

### PodResources API {#podresources-api}

У Kubernetes 1.37 локальний для вузла gRPC API `PodResources` `kubelet` включає виділення ресурсів на рівні Podʼів, коли увімкнено `PodLevelResourceManagers`. Локальні для вузла агенти моніторингу та втулки пристроїв можуть запитувати призначення верхнього рівня для Podʼів (`cpu_ids` та `memory`), уникаючи подвійного підрахунку виділень на рівні контейнерів.

Повні схеми API, маски полів і таблиці звітування за областями дії див. у [Довідці менеджерів ресурсів на рівні Podʼів](/docs/reference/node/pod-level-resource-managers/#podresources-api).

## Обмеження та застереження {#limitations-and-caveats}

- Функціональність реалізована лише для політики `static` менеджера CPU та політики `Static` менеджера памʼяті. Зверніть увагу, що політика `BestEffort` не підтримується для менеджера памʼяті.
- Ця функція підтримується лише на вузлах Linux. На вузлах Windows менеджери ресурсів діятимуть як no-op для виділень на рівні Podʼів.

## Що далі

- Дізнайтеся, як [надавати ресурси CPU та памʼяті на рівні Podʼів](/docs/tasks/configure-pod-container/assign-pod-level-resources/).
- Пройдіть навчальний посібник [Використання ресурсів на рівні Podʼів з менеджерами ресурсів `kubelet`](/docs/tutorials/cluster-management/use-pod-level-resource-managers/).
- Дізнайтеся про [Менеджер ресурсів вузла](/docs/concepts/policy/node-resource-managers/).
