Готовність планування Pod
Kubernetes v1.30 [stable]
Podʼи вважалися готовими до планування відразу після створення. Планувальник Kubernetes виконує всі необхідні дії для знаходження вузлів для розміщення всіх Podʼів, що очікують. Однак на практиці деякі Podʼи можуть перебувати в стані "відсутні ресурси" ("miss-essential-resources") протягом тривалого періоду. Ці Podʼи фактично спричиняють зайве навантаження на планувальник (та інтегратори, по ходу далі, такі як Cluster AutoScaler), що є непотрібним.
Шляхом вказання/видалення поля .spec.schedulingGates
для Podʼа ви можете контролювати, коли Pod готовий до розгляду для планування.
Налаштування schedulingGates
Podʼа
Поле schedulingGates
містить список рядків, і кожний рядок сприймається як критерій, який повинен бути задоволений перед тим, як Pod буде вважатися придатним для планування. Це поле можна ініціалізувати лише при створенні Podʼа (або клієнтом, або під час змін під час допуску). Після створення кожен schedulingGate
можна видалити у довільному порядку, але додавання нового scheduling gate
заборонено.
Приклад використання
Щоб позначити Pod як не готовий до планування, ви можете створити його з одним або кількома шлюзами планування так:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
schedulingGates:
- name: example.com/foo
- name: example.com/bar
containers:
- name: pause
image: registry.k8s.io/pause:3.6
Після створення Podʼа ви можете перевірити його стан за допомогою:
kubectl get pod test-pod
Вивід показує, що він знаходиться в стані SchedulingGated
:
NAME READY STATUS RESTARTS AGE
test-pod 0/1 SchedulingGated 0 7s
Ви також можете перевірити його поле schedulingGates
, запустивши:
kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'
Вивід:
[{"name":"example.com/foo"},{"name":"example.com/bar"}]
Щоб повідомити планувальник, що цей Pod готовий до планування, ви можете повністю видалити його schedulingGates
шляхом повторного застосування зміненого маніфесту:
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- name: pause
image: registry.k8s.io/pause:3.6
Ви можете перевірити, чи очищено schedulingGates
, виконавши:
kubectl get pod test-pod -o jsonpath='{.spec.schedulingGates}'
Очікується, що вивід буде порожнім. І ви можете перевірити його останній стан, запустивши:
kubectl get pod test-pod -o wide
Враховуючи те, що test-pod не запитує жодних ресурсів CPU/памʼяті, очікується, що стан цього Podʼа перейде з попереднього SchedulingGated
в Running
:
NAME READY STATUS RESTARTS AGE IP NODE
test-pod 1/1 Running 0 15s 10.0.0.4 node-2
Спостережуваність
Метрика scheduler_pending_pods
має нову мітку "gated"
, щоб відрізняти, чи були спроби планувати Podʼа, але він був визначений як непридатний для планування, чи він явно позначений як не готовий для планування. Ви можете використовувати scheduler_pending_pods{queue="gated"}
для перевірки результату метрики.
Змінні директиви планування Podʼа
Ви можете змінювати директиви планування Podʼа, коли вони мають шлюзи планування, з певними обмеженнями. Узагальнено, ви можете тільки робити директиви планування Podʼа жорсткішими. Іншими словами, оновлені директиви призведуть до можливості розміщення Podʼів тільки на підмножині вузлів, з якими вони раніше мали збіг. Конкретніше, правила для оновлення директив планування Podʼа такі:
Для
.spec.nodeSelector
дозволяються лише додавання. Якщо відсутнє, його можна встановити.Для
spec.affinity.nodeAffinity
, якщо nil, тоді дозволяється встановлення будь-чого.Якщо
NodeSelectorTerms
був пустим, дозволено встановлення. Якщо не пустий, тоді дозволяються лише додаванняNodeSelectorRequirements
доmatchExpressions
абоfieldExpressions
, а зміни наявнихmatchExpressions
іfieldExpressions
не будуть дозволені. Це через те, що терміни в.requiredDuringSchedulingIgnoredDuringExecution.NodeSelectorTerms
, оцінюються через OR тоді як вирази вnodeSelectorTerms[].matchExpressions
таnodeSelectorTerms[].fieldExpressions
оцінюються через AND.Для
.preferredDuringSchedulingIgnoredDuringExecution
всі оновлення дозволені. Це повʼязано з тим, що бажані умови не є авторитетними, і тому контролери політики не підтверджують ці умови.
Що далі
- Прочитайте PodSchedulingReadiness KEP для отримання більш детальної інформації