Щоб скористатися цією функцією, вам (або адміністратору кластера) потрібно увімкнути функціональну можливість PodLevelResourceManagers для всіх відповідних компонентів у вашому кластері.
Перегляньте Увімкнення або вимкнення функціональних можливостей для отримання додаткової інформації.
Підтримка ресурсів на рівні Podʼів для наявних менеджерів ресурсів (Topology, CPU та Memory) розширює їх для роботи зі специфікаціями ресурсів на рівні Podʼів. Коли цю функцію увімкнено (через функціональні можливості PodLevelResources та PodLevelResourceManagers), менеджери ресурсів можуть використовувати .spec.resources безпосередньо як основу для своїх рішень щодо виділення, еволюціонуючи від суто поконтейнерної моделі виділення до Pod-центричної. Ця схема розділення впроваджує більш гнучку та потужну модель керування ресурсами, особливо для чутливих до продуктивності робочих навантажень. Вона дозволяє визначати гібридні моделі виділення, у яких деякі контейнери в Podʼі отримують ексклюзивні, вирівняні за NUMA ресурси, тоді як інші спільно використовують решту ресурсів зі спільного пулу на рівні Podʼа.
Щоб попрактикуватися в налаштуванні менеджерів ресурсів kubelet з ресурсами на рівні Podʼів і на власні очі спостерігати за поведінкою виділення, ознайомтесь з навчальним посібником Використання ресурсів на рівні Podʼів з менеджерами ресурсів kubelet.
Щоб зрозуміти менеджерів ресурсів на рівні 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-контейнерів проти постійних резервувань для сайдкарів).
.spec.resources, який визначає сукупні запити та ліміти для всього Podʼа.kubelet, це робить контейнер придатним для ексклюзивного виділення ресурсів менеджерами ресурсів.Менеджери ресурсів CPU та Memory працюють по-різному залежно від налаштованої області дії менеджера топології.
pod менеджера топології та ресурси на рівні PodʼівКоли область дії менеджера топології встановлено в pod, kubelet виконує єдине вирівнювання за NUMA для всього Podʼа на основі бюджету ресурсів, визначеного в .spec.resources.
Отриманий вирівняний за NUMA пул ресурсів потім розділяється:
Зверніть увагу, що коли стандартні init-контейнери завершують виконання, їхні ресурси переходять у повторно використовуваний набір для Podʼа, а не повертаються до пулу ресурсів вузла. Оскільки вони виконуються послідовно, наступні контейнери застосунку можуть повторно використовувати ці ресурси (або для власних ексклюзивних часток, або для спільного пулу).
Це дозволяє розміщувати разом контейнери, які потребують ексклюзивних ресурсів (наприклад, високопродуктивний основний застосунок), з тими, які цього не потребують (наприклад, sidecars для журналювання або моніторингу), — все в межах одного вирівняного за NUMA Podʼа.
Розглянемо контейнери в наступній специфікації Podʼа, де область дії менеджера топології — pod, а Pod має загальний бюджет у 4 CPU. main-app запитує ексклюзивну частку у 2 CPU, тоді як сайдкари спільно використовують решту 2 CPU у спільному пулі Podʼа:
apiVersion: v1
kind: Pod
metadata:
name: pod-scope-mixed
annotations:
kubernetes.io/description: "A pod demonstrating pod-level scope where one container gets exclusive resources and others share the remaining pod resources in a shared pool."
spec:
# На рівні Podʼа, Pod має запит на CPU, рівний лімітам, і запит на памʼять також
# рівний лімітам памʼяті. Контейнер main-app відповідає вимогам для класу QoS
# Guaranteed на рівні контейнера, а sidecar контейнери не вказують жодного
# запиту на ресурси. У межах масштабу Podʼа kubelet може статично призначити
# 4 CPU для всього Podʼа, з яких 2 призначені ексклюзивно для контейнера
# main-app, а решта 2 спільно використовуються sidecar контейнерами.
resources:
requests:
cpu: "4"
memory: "4Gi"
limits:
cpu: "4"
memory: "4Gi"
initContainers:
- name: metrics-sidecar
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не
# справжнім допоміжним елементом метрик.
image: registry.k8s.io/pause:3.9
restartPolicy: Always
- name: logging-sidecar
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не
# справжнім агентом ведення журналів.
image: registry.k8s.io/pause:3.9
restartPolicy: Always
containers:
- name: main-app
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей.
image: registry.k8s.io/pause:3.9
resources:
requests:
cpu: "2"
memory: "2Gi"
limits:
cpu: "2"
memory: "2Gi"
Важливі міркування:
Під час використання ресурсів на рівні Podʼів з областю дії pod менеджера топології є кілька важливих міркувань:
Обмеження порожнього спільного пулу: Ця конфігурація не дозволяє специфікації Podʼа, які призвели б до порожнього спільного пулу Podʼа, якщо є контейнери, які потребують такого пулу. Якщо сума запитів ресурсів усіх контейнерів, які є Guaranteed, точно дорівнює загальному бюджету ресурсів, і є принаймні один інший контейнер, який потребує спільного пулу, kubelet відхиляє Pod під час допуску.
Наприклад, наступний Pod запитує бюджет на рівні Podʼа у 4 CPU. main-app потребує ексклюзивних 3 CPU, а metrics-sidecar потребує ексклюзивний 1 CPU. Оскільки у спільному пулі для logging-sidecar не залишається жодного CPU, kubelet відхиляє цей Pod (та сама перевірка застосовується для памʼяті):
Втрачені ресурси: Будь-які ресурси, надмірно виділені під час використання області дії pod (сума запитів контейнерів менша за бюджет на рівні Podʼа, і немає контейнерів спільного пулу, або контейнери спільного пулу не повністю використовують решту), залишаються призначеними та зарезервованими для Podʼа, фактично марнуючись протягом усього виконання Podʼа.
Постійний пул: Загальний пул ресурсів Podʼа (вирівнювання за NUMA та загальна зарезервована ємність) є постійним. Якщо контейнер спільного пулу аварійно завершується та перезапускається, загальне резервування ресурсів Podʼа залишається надійно закріпленим на вузлі. Вузол повертає ресурси до свого загального пулу лише тоді, коли завершується весь Pod.
container менеджера топології та ресурси на рівні PodʼівКоли область дії менеджера топології встановлено в container, kubelet оцінює кожен контейнер окремо для ексклюзивного виділення.
Якщо весь Pod досягає класу QoS клас QoS Guaranteed (шляхом зазначення відповідних значень у .spec.resources на рівні Podʼа), ви можете змішувати та поєднувати контейнери:
.spec.resources Podʼа.Ця область дії корисна, коли у вас є інфраструктурний sidecar, який має бути вирівняний за конкретним вузлом NUMA для доступу до пристроїв, тоді як основне робоче навантаження може працювати в загальному спільному пулі вузла.
Розглянемо контейнери в наступній специфікації Podʼа, де область дії менеджера топології — container, а Pod представляє робоче навантаження з інфраструктурним sidecar і двома робочими процесами застосунку, із загальним бюджетом у 4 CPU. infrastructure-sidecar отримує ексклюзивну, вирівняну за NUMA частку у 2 CPU. Два робочі процеси застосунку (worker-1 та worker-2) працюють у загальному спільному пулі вузла:
apiVersion: v1
kind: Pod
metadata:
name: container-scope-mixed
annotations:
kubernetes.io/description: "A pod demonstrating container-level scope where one container gets exclusive resources and others run in the node's shared pool."
spec:
# На рівні Podʼа, Pod має запит на CPU, рівний лімітам, і запит на памʼять також
# рівний лімітам памʼяті. Контейнер infrastructure-sidecar відповідає вимогам для
# класу QoS Guaranteed на рівні контейнера, а робочі контейнери не вказують
# жодного запиту на ресурси. У межах контейнерного масштабу kubelet оцінює
# контейнери індивідуально для ексклюзивного виділення. Це означає, що
# infrastructure-sidecar отримує ексклюзивний фрагмент CPU на 2 ядра, тоді як
# робочі контейнери працюють у загальному пулі вузла, все це обмежено загальними
# лімітами Podʼа.
resources:
requests:
cpu: "4"
memory: "4Gi"
limits:
cpu: "4"
memory: "4Gi"
initContainers:
- name: infrastructure-sidecar
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей, а не
# справжнім допоміжним елементом інфраструктури.
image: registry.k8s.io/pause:3.9
restartPolicy: Always
resources:
requests:
cpu: "2"
memory: "2Gi"
limits:
cpu: "2"
memory: "2Gi"
containers:
- name: worker-1
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей.
image: registry.k8s.io/pause:3.9
- name: worker-2
# Примітка: Тут поле image є заповнювачем для демонстраційних цілей.
image: registry.k8s.io/pause:3.9
Під час виконання змішаних робочих навантажень у межах Podʼа kubelet забезпечує ізоляцію по-різному залежно від виділення:
Загальний пул ресурсів Podʼа (вирівнювання за NUMA та загальна зарезервована ємність) є постійним. Якщо контейнер у спільному пулі Podʼа аварійно завершується та перезапускається, загальне резервування ресурсів Podʼа залишається надійно закріпленим на вузлі. Вузол повертає ресурси до свого загального пулу лише тоді, коли завершується весь Pod.
kubelet та контрольні точки стануУ 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ʼів.
Ви можете контролювати поведінку та справність менеджерів ресурсів як для виділень на рівні контейнерів, так і на рівні 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ʼа.У Kubernetes 1.37 локальний для вузла gRPC API PodResources kubelet включає виділення ресурсів на рівні Podʼів, коли увімкнено PodLevelResourceManagers. Локальні для вузла агенти моніторингу та втулки пристроїв можуть запитувати призначення верхнього рівня для Podʼів (cpu_ids та memory), уникаючи подвійного підрахунку виділень на рівні контейнерів.
Повні схеми API, маски полів і таблиці звітування за областями дії див. у Довідці менеджерів ресурсів на рівні Podʼів.
static менеджера CPU та політики Static менеджера памʼяті. Зверніть увагу, що політика BestEffort не підтримується для менеджера памʼяті.kubelet.