# Менеджери ресурсів

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

---

<!-- overview -->

Для забезпечення роботи робочих навантажень, для яких критично важлива низька затримка та висока пропускна здатність, Kubernetes пропонує набір менеджерів ресурсів. Ці менеджери призначені для координації та оптимізації розподілу ресурсів вузлів між подами, налаштованими з конкретними вимогами до ресурсів CPU, пристроїв та памʼяті (hugepages).

<!-- body -->

## Менеджер топології {#topology-manager}








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


*Менеджер топології* — це компонент kubelet, який координує набір компонентів, відповідальних за ці оптимізації. Щоб дізнатися більше, прочитайте [Керування політиками топології на вузлі](/docs/tasks/administer-cluster/topology-manager/).

## Менеджер CPU {#cpu-manager}








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


*Менеджер CPU* — це компонент kubelet, який забезпечує ексклюзивне виділення ресурсів для CPU. Він консультується з Менеджером топології для прийняття рішень щодо призначення ресурсів. Щоб дізнатися більше, прочитайте [Керування політиками управління CPU на вузлі](/docs/tasks/administer-cluster/cpu-management-policies/).

### Політики призначення CPU подам {#policies-for-assigning-cpus-to-pods}

Після привʼязки Podʼа до вузла kubelet на цьому вузлі може потребувати або мультиплексування наявного апаратного забезпечення (наприклад, спільного використання CPU між кількома Podʼами), або виділення апаратного забезпечення шляхом резервування певних ресурсів (наприклад, виділення одного або кількох CPU для виключного використання одним Podʼом).

Зазвичай kubelet використовує [CFS quota](https://en.wikipedia.org/wiki/Completely_Fair_Scheduler) для забезпечення обмежень на використання CPU подами. Коли на вузлі працює багато подів, що завантажують CPU, робоче навантаження може переміщуватися між різними ядрами CPU залежно від того, чи обмежується под, і які ядра CPU доступні на момент планування. Багато робочих навантажень не чутливі до цього переміщення і тому працюють нормально без будь-якого втручання.

Однак у робочих навантаженнях, де спорідненість кешу CPU та затримка планування значно впливають на продуктивність, kubelet дозволяє використовувати альтернативні політики управління CPU для визначення деяких переваг розміщення на вузлі. Це реалізовано за допомогою *Менеджера CPU* та його політики. Існують дві доступні політики:

- `none`: політика `none` явно включає наявну стандартну схему спорідненості CPU, не забезпечуючи спорідненості понад те, що автоматично робить планувальник ОС. Обмеження на використання CPU для [подів Guaranteed](/docs/concepts/workloads/pods/pod-qos/) та [подів Burstable](/docs/concepts/workloads/pods/pod-qos/) забезпечуються за допомогою CFS quota.
- `static`: політика `static` дозволяє контейнерам у подах Guaranteed з цілими запитами CPU отримувати доступ до ексклюзивних CPU на вузлі. Ця ексклюзивність забезпечується за допомогою [cpuset cgroup controller](https://www.kernel.org/doc/Documentation/cgroup-v2.txt).


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Системні служби, такі як середовище виконання контейнерів та сам kubelet, можуть і надалі працювати на цих виділених процесорах. Виключність поширюється лише на інші поди.</div>


Менеджер CPU не підтримує відключення та підключення CPU під час виконання.

#### Політика static {#static-policy}

Політика static дозволяє більш детально керувати CPU та забезпечує ексклюзивне призначення CPU. Ця політика керує спільним пулом CPU, який спочатку містить усі CPU на вузлі. Кількість CPU, доступних для ексклюзивного призначення, дорівнює загальній кількості CPU на вузлі за винятком будь-яких резервувань CPU, встановлених у конфігурації kubelet. CPU, зарезервовані цими параметрами, беруться цілими числами з початкового спільного пулу у порядку зростання за фізичним ідентифікатором ядра. Цей спільний пул є набором CPU, на яких працюють будь-які контейнери в подах `BestEffort` та `Burstable`. Контейнери в подах `Guaranteed` з дробовими запитами CPU також працюють на CPU зі спільного пулу. Лише контейнери, які є частиною пода `Guaranteed` і мають цілі запити CPU, отримують ексклюзивні CPU.


<div class="alert alert-info" role="note"><h4 class="alert-heading">Примітка:</h4>Kubelet вимагає резервування CPU більше за нуль, коли політика static увімкнена. Це тому, що нульове резервування CPU дозволило б спільному пулу стати порожнім.</div>


Коли поди `Guaranteed`, контейнери яких відповідають вимогам для статичного призначення, плануються на вузлі, CPU видаляються зі спільного пулу та розміщуються в cpuset для контейнера. CFS quota не використовується для обмеження використання CPU цими контейнерами, оскільки їхнє використання обмежується самим доменом планування. Іншими словами, кількість CPU в cpuset контейнера дорівнює цілому числу CPU `limit`, зазначеному в специфікації пода. Це статичне призначення підвищує спорідненість CPU та зменшує перемикання контексту через обмеження для навантаження, що залежить від CPU.

Розглянемо контейнери в наступних специфікаціях пода:

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
```

Под вище працює в класі QoS `BestEffort`, оскільки не вказано жодних ресурсних `requests` або `limits`. Він працює в спільному пулі.

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
```

Под вище працює в класі QoS `Burstable`, оскільки ресурсні `requests` не дорівнюють `limits`, а кількість `cpu` не вказана. Він працює в спільному пулі.

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
      requests:
        memory: "100Mi"
        cpu: "1"
```

Под вище працює в класі QoS `Burstable`, оскільки ресурсні `requests` не дорівнюють `limits`. Він працює в спільному пулі.

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
      requests:
        memory: "200Mi"
        cpu: "2"
```

Под вище працює в класі QoS `Guaranteed`, оскільки `requests` дорівнюють `limits`. І обмеження ресурсу CPU для контейнера є цілим числом, більшим або рівним одиниці. Контейнер `nginx` отримує 2 ексклюзивні CPU.

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "1.5"
      requests:
        memory: "200Mi"
        cpu: "1.5"
```

Под вище працює в класі QoS `Guaranteed`, оскільки `requests` дорівнюють `limits`. Але обмеження ресурсу CPU для контейнера є дробовим числом. Він працює в спільному пулі.

```yaml
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
```

Под вище працює в класі QoS `Guaranteed`, оскільки вказано лише `limits`, а `requests` прирівнюються до `limits`, коли їх не вказано явно. І обмеження ресурсу CPU для контейнера є цілим числом, більшим або рівним одиниці. Контейнер `nginx` отримує 2 ексклюзивні CPU.

##### Параметри політики Static {#cpu-policy-static--options}

Ось доступні параметри політики static управління CPU, перераховані в алфавітному порядку:

`align-by-socket` (alpha, зазвичай приховано)
: Вирівнювання CPU за фізичним пакетом / сокетом, а не за логічними межами NUMA (доступно з Kubernetes v1.25)

`distribute-cpus-across-cores` (alpha, зазвичай приховано)
: Розподіл віртуальних ядер, іноді званих апаратними потоками, по різних фізичних ядрах (доступно з Kubernetes v1.31)

`distribute-cpus-across-numa` (beta, зазвичай видно)
: Розподіл CPU по різних доменах NUMA, з метою досягнення рівномірного балансу між обраними доменами (доступно з Kubernetes v1.23)

`full-pcpus-only` (GA, зазвичай видно)
: Завжди виділяти повні фізичні ядра (доступно з Kubernetes v1.22, GA з Kubernetes v1.33)

`strict-cpu-reservation` (GA, зазвичай видно)
: Запобігання запуску всіх подів незалежно від їх класу якості обслуговування на зарезервованих CPU (доступно з Kubernetes v1.32, GA з Kubernetes v1.35)

`prefer-align-cpus-by-uncorecache` (GA, зазвичай видно)
: Вирівнювання CPU за межами кешу uncore (Last-Level) на основі найкращих зусиль (доступно з Kubernetes v1.32)

Ви можете вмикати або вимикати групи параметрів залежно від їх рівня зрілості, використовуючи наступні функціональні ворота:

- `CPUManagerPolicyBetaOptions` (стандартно увімкнено). Вимкніть, щоб приховати параметри рівня beta.
- `CPUManagerPolicyAlphaOptions` (стандартно вимкнено). Увімкніть, щоб показати параметри рівня alpha.

Вам все одно доведеться увімкнути кожен параметр, використовуючи поле `cpuManagerPolicyOptions` у файлі конфігурації kubelet.

Щоб дізнатися більше про окремі параметри, які можна налаштувати, читайте далі.

###### `full-pcpus-only`

Якщо вказано параметр  `full-pcpus-only` політики, політика static завжди виділятиме повні фізичні ядра. Зазвичай, без цього параметра, політика static виділяє CPU, використовуючи топологічно-орієнтоване найкраще підходяще розміщення. На системах з увімкненим SMT політика може виділяти окремі віртуальні ядра, які відповідають апаратним потокам. Це може призвести до того, що різні контейнери будуть використовувати одні й ті ж фізичні ядра; така поведінка, у свою чергу, сприяє проблемі [шумних сусідів](https://en.wikipedia.org/wiki/Cloud_computing_issues#Performance_interference_and_noisy_neighbors). З увімкненим параметром, под буде прийнято kubelet лише в тому випадку, якщо запит CPU всіх його контейнерів може бути виконаний шляхом виділення повних фізичних ядер. Якщо под не отримує допуск, він буде переведений у стан Failed з повідомленням `SMTAlignmentError`.

###### `distribute-cpus-across-numa`

Якщо вказано параметр `distribute-cpus-across-numa`, політика static рівномірно розподіляє CPU між NUMA-вузлами у випадках, коли для задоволення виділення потрібно більше одного NUMA-вузла. Стандартно, `CPUManager` розміщує CPU на одному NUMA-вузлі, поки він не заповниться, а залишкові CPU просто переходять до наступного NUMA-вузла. Це може спричинити небажані вузькі місця в паралельному коді, що використовує барʼєри (та подібні примітиви синхронізації), оскільки такий код зазвичай працює лише так швидко, як його найповільніший працівник (який сповільнюється через те, що на принаймні одному NUMA-вузлі доступно менше CPU). Розподіляючи CPU рівномірно між NUMA-вузлами, розробники застосунків можуть легше забезпечити, щоб жоден працівник не страждав від ефектів NUMA більше, ніж інші, покращуючи загальну продуктивність таких застосунків.

###### `align-by-socket`

Якщо вказано параметр `align-by-socket`, CPU будуть вважатися вирівняними на межі сокета при прийнятті рішення про виділення CPU контейнеру. Стандартно, `CPUManager` вирівнює виділення CPU на межі NUMA, що може призвести до зниження продуктивності, якщо для задоволення виділення потрібно більше одного NUMA-вузла. Хоча він намагається забезпечити виділення всіх CPU з *мінімальної* кількості NUMA-вузлів, немає гарантії, що ці NUMA-вузли будуть на одному сокеті. Направляючи `CPUManager` явно вирівнювати CPU на межі сокета замість межі NUMA, ми можемо уникнути таких проблем. Зверніть увагу, що цей параметр політики не сумісний з політикою `single-numa-node` `TopologyManager` і не застосовується до апаратного забезпечення, де кількість сокетів перевищує кількість NUMA-вузлів.

###### `distribute-cpus-across-cores`

Якщо вказано параметр `distribute-cpus-across-cores`, політика static намагатиметься виділяти віртуальні ядра (апаратні потоки) на різних фізичних ядрах. Стандартно, `CPUManager` намагається розміщувати CPU на якомога меншій кількості фізичних ядер, що може призвести до конкуренції між CPU на одному фізичному ядрі та спричинити вузькі місця у продуктивності. Увімкнувши параметр `distribute-cpus-across-cores`, політика static забезпечує розподіл CPU на якомога більшій кількості фізичних ядер, зменшуючи конкуренцію на одному фізичному ядрі та покращуючи загальну продуктивність. Однак важливо зазначити, що ця стратегія може бути менш ефективною при високому навантаженні системи. У таких умовах користь від зменшення конкуренції зменшується. Навпаки, стандартна поведінка може допомогти зменшити накладні витрати на міжядерну комунікацію, потенційно забезпечуючи кращу продуктивність при високому навантаженні.

###### `strict-cpu-reservation`

Параметр `reservedSystemCPUs` у [KubeletConfiguration](/docs/reference/config-api/kubelet-config.v1beta1/), або застаріла опція командного рядка kubelet `--reserved-cpus`, визначає явний набір CPU для системних демонів ОС та демонів Kubernetes. Більше деталей про цей параметр можна знайти на сторінці [Явно зарезервований список CPU](/docs/tasks/administer-cluster/reserve-compute-resources/#explicitly-reserved-cpu-list). Стандартно, ця ізоляція реалізується лише для гарантованих подів з цілими запитами CPU, а не для подів з можливістю перевантаження та подів з найкращим зусиллям (та гарантованих подів з дробовими запитами CPU). Допуск здійснюється лише шляхом порівняння запитів CPU з доступними CPU. Оскільки ліміт CPU вищий за запит, стандартна поведінка дозволяє подам з можливістю перевантаження та подам з найкращим зусиллям використовувати всю ємність `reservedSystemCPUs` і спричиняти нестачу ресурсів для служб ОС у реальних розгортаннях. Якщо параметр політики `strict-cpu-reservation` увімкнено, політика static не дозволить жодному робочому навантаженню використовувати ядра CPU, зазначені в `reservedSystemCPUs`.

###### `prefer-align-cpus-by-uncorecache`

Якщо вказано параметр `prefer-align-cpus-by-uncorecache`, політика static виділятиме ресурси CPU для окремих контейнерів таким чином, щоб усі CPU, призначені контейнеру, використовували один і той же блок кешу uncore (також відомий як кеш останнього рівня або LLC). Зазвичай `CPUManager` щільно розподіляє призначення CPU, що може призвести до того, що контейнери отримують CPU з кількох кешів uncore. Ця опція дозволяє `CPUManager` виділяти CPU таким чином, щоб максимально ефективно використовувати кеш uncore. Виділення здійснюється на основі найкращих зусиль, намагаючись призначити якомога більше CPU в межах одного кешу uncore. Якщо вимога контейнера щодо CPU перевищує ємність одного кешу uncore, `CPUManager` мінімізує кількість використаних кешів uncore, щоб підтримувати оптимальне вирівнювання кешу uncore. Конкретні робочі навантаження можуть отримати вигоду у продуктивності від зменшення затримки між кешами та шумних сусідів на рівні кешу. Якщо `CPUManager` не може оптимально вирівняти CPU при наявності достатніх ресурсів на вузлі, контейнер все одно буде прийнято з використанням стандартного щільного розподілу.

## Менеджер памʼяті {#memory-manager}








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


*Memory Manager* є компонентом kubelet, який забезпечує ексклюзивне виділення ресурсів памʼяті. Він консультується з *Topology Manager* для прийняття рішень щодо призначення ресурсів. Щоб дізнатися більше, прочитайте [Керування політиками управління памʼяттю на вузлі](/docs/tasks/administer-cluster/memory-manager/).

### Політики призначення памʼяті для подів {#memory-management-policies}

В Kubernetes *Memory Manager* виділяє ресурси оперативної памʼяті (RAM, а також за потреби великі сторінки Linux) для подів у <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 class'>QoS class</a> `Guaranteed` .

*Memory Manager* використовує протокол генерації підказок для визначення найбільш підходящої NUMA-спорідненості для пода. *Memory Manager* передає ці підказки центральному менеджеру (*Topology Manager*). На основі як підказок, так і політики *Topology Manager*, под приймається або відхиляється на вузлі.

Більше того, *Memory Manager* забезпечує, щоб памʼять, яку запитує под, виділялася з мінімальної кількості NUMA-вузлів.

Щоб дізнатися більше, прочитайте [Керування політиками управління памʼяттю на вузлі](/docs/tasks/administer-cluster/memory-manager/).

## Менеджер пристроїв {#device-manager}








  <div class="feature-state-notice feature-stable">
      <span class="feature-state-name">СТАН ФУНКЦІОНАЛУ:</span>
      <code>Kubernetes v1.26 [stable]</code>
    </div>
  



*Device Manager* є компонентом kubelet, який виділяє апаратні пристрої для подів за допомогою API втулків пристроїв. Він консультується з *Topology Manager*, використовуючи інформацію про топологію, надану втулками пристроїв, для прийняття рішень щодо призначення ресурсів. Щоб дізнатися більше, прочитайте [Інтеграція втулків пристроїв з Topology Manager](/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/#device-plugin-integration-with-the-topology-manager).

## Менеджер ресурсів на рівні подів {#pod-level-resource-managers}








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


Підтримка ресурсів на рівні подів для наявних менеджерів ресурсів (Topology, CPU та Memory) розширює їх для обробки специфікацій ресурсів на рівні подів. Коли ця функція увімкнена (через прапори функцій `PodLevelResources` та `PodLevelResourceManagers`), менеджери ресурсів можуть використовувати `.spec.resources` безпосередньо як основу для своїх рішень щодо виділення ресурсів, переходячи від суворо контейнерної моделі до моделі, орієнтованої на поди. Ця схема розподілу вводить більш гнучку та потужну модель управління ресурсами, особливо для робочих навантажень, чутливих до продуктивності. Вона дозволяє визначати гібридні моделі розподілу, де деякі контейнери в поді отримують ексклюзивні ресурси, вирівняні за NUMA, тоді як інші ділять залишкові ресурси з загального пулу на рівні пода.

Важливо розрізняти можливості, які пропонує кожна область дії Topology Manager, і як це змінює поведінку менеджерів ресурсів. Область дії `pod` дозволяє виділення на основі бюджету всього пода, створюючи спільний пул на рівні пода для контейнерів, які не мають статусу `Guaranteed`, поряд з ексклюзивними виділеннями. На відміну від цього, область дії `container` дозволяє гібридну модель виділення, де окремі контейнери можуть отримувати ексклюзивні ресурси, вирівняні за NUMA, тоді як інші працюють у спільному пулі вузла, без вирівнювання всього пода як єдиного блоку.

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

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

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

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

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

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

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

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

#### Область дії менеджера топології та ресурси на рівні подів {#how-pod-level-resource-managers-work}

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

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

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

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

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

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


















<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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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>

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

При використанні ресурсів на рівні пода з областю дії Topology Manager на рівні пода існують деякі важливі міркування:

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

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

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    <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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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` (загальна сума запитів контейнерів менша за бюджет на рівні пода і немає контейнерів у спільному пулі, або контейнери спільного пулу не повністю використовують залишкову кількість), будуть призначені та зарезервовані для пода, фактично марнуватись протягом усього виконання пода.

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

#### Область дії контейнера Topology Manager та ресурси на рівні пода {#topology-manager-s-container-scope-and-pod-level-resources}

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

Якщо загальний под досягає класу QoS `Guaranteed` (через наявність відповідних значень у ресурсах на рівні пода `.spec.resources`), ви можете комбінувати контейнери:

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

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

Розглянемо контейнери у наступній специфікації пода, де область дії Topology Manager встановлена на `container`, а под представляє робоче навантаження з інфраструктурним sidecar та двома виконавцями застосунків, з загальним бюджетом у 4 CPU. `infrastructure-sidecar` отримує ексклюзивний, вирівняний за NUMA, 2 CPU slice. Два виконавці застосунків (`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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</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="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">registry.example/example-image:v1</span><span class="w">
</span></span></span></code></pre></div></div>
</div>

#### CPU quota (CFS) {#cpu-quota-cfs}

Коли ви запускаєте змішані робочі навантаження в межах пода, ізоляція забезпечується по-різному залежно від виділення:

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

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

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

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

<div class="alert alert-caution" role="note"><h4 class="alert-heading">Увага:</h4><p>Увімкнення функції <code>PodLevelResourceManagers</code> вводить нові версії стану для менеджерів CPU та памʼяті.</p>
<p>Якщо ви понизите версію Kubelet до версії, яка не підтримує цю функцію, або якщо ви явно вимкнете ці функціональні можливості після їх активації, старіший Kubelet не зможе прочитати нові файли контрольних точок через цю несумісність версій. Щоб відновити роботу, адміністраторам потрібно буде відключити уражений вузол, вручну видалити <a href="/uk/docs/reference/node/kubelet-files/#resource-managers-state">внутрішні файли контрольних точок стану</a> (<code>cpu_manager_state</code> та <code>memory_manager_state</code>) і перезапустити Kubelet.</p>
</div>


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

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

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

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

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

## Що далі

За більш детальною інформацією про менеджери ресурсів на рівні вузла звертайтеся до наступних розділів:

- [Менеджери ресурсів вузла](/docs/concepts/policy/node-resource-managers/)

За більш детальною інформацією про налаштування та використання менеджерів ресурсів на рівні подів звертайтеся до наступних розділів:

- [Призначення ресурсів CPU та памʼяті на рівні подів](/docs/tasks/configure-pod-container/assign-pod-level-resources/)
