Обробка повторюваних і неповторюваних помилок Pod за допомогою політики збоїв Pod
Kubernetes v1.31 [stable] (стандартно увімкнено: true)Цей документ показує, як використовувати політику збоїв Pod, у поєднанні з типовою політикою відмови Podʼа, для покращення контролю над обробкою збоїв на рівні контейнера або Pod у Job.
Визначення політики збоїв Pod може допомогти вам:
- краще використовувати обчислювальні ресурси, уникаючи непотрібних повторних запусків Podʼів.
 - уникати збоїв Job через збої Pod (такі як випередження, виселення ініційоване API або виселення на основі taint).
 
Перш ніж ви розпочнете
Ви повинні вже бути знайомі з основним використанням Job.
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Версія вашого Kubernetes сервера має бути не старішою ніж v1.25.Для перевірки версії введіть kubectl version.
Сценарії використання
Розглянемо такі сценарії використання для Завдань, які визначають політику збоїв Pod:
- Уникнення непотрібних повторних спроб запуску Podʼів
 - Ігнорування розладів у роботі Podʼів
 - Уникнення непотрібних повторних спроб запуску Podʼів на основі власних станів Podʼів
 - Уникнення непотрібних повторних спроб запуску Podʼів за індексами
 
Використання політики збоїв Pod для уникнення непотрібних повторних запусків Podʼів
В наступному прикладі ви можете навчитися використовувати політику збоїв Pod, щоб уникати непотрібних перезапусків Pod, коли збій Pod вказує на неповторювану помилку програмного забезпечення.
Ознайомтесь з наступним маніфестом:
apiVersion: batch/v1 kind: Job metadata: name: job-pod-failure-policy-failjob spec: completions: 8 parallelism: 2 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/bash:5 command: ["bash"] args: - -c - echo "Hello world! I'm going to exit with 42 to simulate a software bug." && sleep 30 && exit 42 backoffLimit: 6 podFailurePolicy: rules: - action: FailJob onExitCodes: containerName: main operator: In values: [42]Застосуйте маніфест%
kubectl create -f https://k8s.io/examples/controllers/job-pod-failure-policy-failjob.yamlЧерез приблизно 30 секунд весь Job повинен завершитися. Перевірте статус Job, виконавши команду:
kubectl get jobs -l job-name=job-pod-failure-policy-failjob -o yamlУ статусі Job відображаються такі умови:
- Умова 
FailureTarget: має полеreason, встановлене вPodFailurePolicy, і полеmessageз додатковою інформацією про завершення, наприклад,Container main for pod default/job-pod-failure-policy-failjob-8ckj8 failed with exit code 42 matching FailJob rule at index 0. Контролер Job додає цю умову, як тільки Job вважається невдалим. Для отримання деталей дивіться Завершення Job Podʼів. - Умова 
Failed: те ж саме значення дляreasonіmessage, що й в умовиFailureTarget. Контролер Job додає цю умову після того, як усі Podʼи Job завершено. 
Для порівняння, якщо політика збоїв Pod була вимкнена, це б зайняло 6 спроб повторного запуску Pod, на що треба щонайменше 2 хвилини.
- Умова 
 
Прибирання
Видаліть створений Job:
kubectl delete jobs/job-pod-failure-policy-failjob
Кластер автоматично очищає Pod.
Використання політики збоїв Pod для ігнорування розладів Pod
На наступному прикладі ви можете навчитися використовувати політику збоїв Pod, щоб ігнорувати розлади Pod, які збільшують лічильник повторних спроб Pod до межі .spec.backoffLimit.
Увага:
Час має значення для цього прикладу, тому вам слід прочитати про кроки перед їх виконанням. Щоб викликати розлад Podʼа, важливо запустити очищення вузла, поки Pod працює на ньому (протягом 90 секунд після розміщення Pod).Ознайомтесь з наступним маніфестом:
apiVersion: batch/v1 kind: Job metadata: name: job-pod-failure-policy-ignore spec: completions: 4 parallelism: 2 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/bash:5 command: ["bash"] args: - -c - echo "Hello world! I'm going to exit with 0 (success)." && sleep 90 && exit 0 backoffLimit: 0 podFailurePolicy: rules: - action: Ignore onPodConditions: - type: DisruptionTargetЗастосуйте маніфест:
kubectl create -f https://k8s.io/examples/controllers/job-pod-failure-policy-ignore.yamlВиконайте цю команду, щоб перевірити
nodeName, на якому розміщено Pod:nodeName=$(kubectl get pods -l job-name=job-pod-failure-policy-ignore -o jsonpath='{.items[0].spec.nodeName}')Запустить очищення вузла, щоб виселити Pod до завершення його роботи (протягом 90 секунд):
kubectl drain nodes/$nodeName --ignore-daemonsets --grace-period=0Перевірте
.status.failed, щоб переконатися, що лічильник для Job не збільшено:kubectl get jobs -l job-name=job-pod-failure-policy-ignore -o yamlЗніміть блокування з вузла:
kubectl uncordon nodes/$nodeName
Job відновиться і завершиться успішно.
Для порівняння, якщо політика збоїв Pod була вимкнена, розлад Pod призведе до завершення всього Job (оскільки .spec.backoffLimit встановлено на 0).
Прибирання
Видаліть створений Job:
kubectl delete jobs/job-pod-failure-policy-ignore
Кластер автоматично очищає Pod.
Використання політики збоїв Pod для уникнення непотрібних повторних запусків Pod на основі власних станів Pod
В наступному прикладі ви можете навчитися використовувати політику збоїв Pod, щоб уникати непотрібних перезапусків Pod на основі власних станів Pod.
Примітка:
Наведений нижче приклад працює з версії 1.27, оскільки він базується на переході видалених Podʼів з фазиPending до термінальної фази (див. Фази Pod).Ознайомтесь з наступним маніфестом:
apiVersion: batch/v1 kind: Job metadata: name: job-pod-failure-policy-config-issue spec: completions: 8 parallelism: 2 template: spec: restartPolicy: Never containers: - name: main image: "non-existing-repo/non-existing-image:example" backoffLimit: 6 podFailurePolicy: rules: - action: FailJob onPodConditions: - type: ConfigIssueЗастосуйте маніфест:
kubectl create -f https://k8s.io/examples/controllers/job-pod-failure-policy-config-issue.yamlЗверніть увагу, що образ налаштоване неправильно, оскільки його не існує.
Перевірте статус Pod Job, виконавши команду:
kubectl get pods -l job-name=job-pod-failure-policy-config-issue -o yamlВи побачите результат, подібний до цього:
containerStatuses: - image: non-existing-repo/non-existing-image:example ... state: waiting: message: Back-off pulling image "non-existing-repo/non-existing-image:example" reason: ImagePullBackOff ... phase: PendingЗверніть увагу, що Pod залишається у фазі
Pending, оскільки йому не вдається завантажити неправильно налаштований образ. Це, в принципі, може бути тимчасовою проблемою, і образ може бути завантажений. Однак у цьому випадку образу не існує, тому ми вказуємо на цей факт за допомогою власної умови.Додайте власну умову. Спочатку підготуйте патч, виконавши команду:
cat <<EOF > patch.yaml status: conditions: - type: ConfigIssue status: "True" reason: "NonExistingImage" lastTransitionTime: "$(date -u +"%Y-%m-%dT%H:%M:%SZ")" EOFПо-друге, виберіть один із Pod, створених Job, виконавши команду:
podName=$(kubectl get pods -l job-name=job-pod-failure-policy-config-issue -o jsonpath='{.items[0].metadata.name}')Потім застосуйте патч до одного з Pod, виконавши наступну команду:
kubectl patch pod $podName --subresource=status --patch-file=patch.yamlЯкщо патч успішно застосовано, ви отримаєте повідомлення такого типу:
pod/job-pod-failure-policy-config-issue-k6pvp patchedВидаліть Pod для переходу його до фази
Failed, виконавши команду:kubectl delete pods/$podNameПеревірте статус Job, виконавши:
kubectl get jobs -l job-name=job-pod-failure-policy-config-issue -o yamlУ статусі Job перегляньте умову
Failedз полемreason, рівнимPodFailurePolicy. Додатково, полеmessageмістить більш детальну інформацію про завершення завдання, таку як:Pod default/job-pod-failure-policy-config-issue-k6pvp має умову ConfigIssue, яка відповідає правилу FailJob за індексом 0.
Примітка:
В операційному середовищі кроки 3 та 4 повинні бути автоматизовані контролером, наданим користувачем.Очищення
Видаліть створене вами завдання:
kubectl delete jobs/job-pod-failure-policy-config-issue
The cluster automatically cleans up the Pods.
Використання політики збоїв Pod для уникнення непотрібних повторних запусків Pod на основі індексів
Щоб уникнути непотрібних перезапусків Podʼів для кожного індексу, ви можете використовувати функції Політики збоїв Podʼа та Ліміт відстрочки для кожного індексу. У цьому розділі сторінки показано, як використовувати ці функції разом.
Ознайомтесь з наступним манфіфестом:
apiVersion: batch/v1 kind: Job metadata: name: job-backoff-limit-per-index-failindex spec: completions: 4 parallelism: 2 completionMode: Indexed backoffLimitPerIndex: 1 template: spec: restartPolicy: Never containers: - name: main image: docker.io/library/python:3 command: # Скрипт: # - завершує роботу Podʼа з індексом 0 з кодом виходу 1, що призводить до однієї повторної спроби; # - завершує роботу Podʼа з індексом 1 з кодом виходу 42, що призводить до # призводить до невдачі індексу без повторної спроби. # - завершує роботу Podʼа з будь-яким іншим індексом. - python3 - -c - | import os, sys index = int(os.environ.get("JOB_COMPLETION_INDEX")) if index == 0: sys.exit(1) elif index == 1: sys.exit(42) else: sys.exit(0) backoffLimit: 6 podFailurePolicy: rules: - action: FailIndex onExitCodes: containerName: main operator: In values: [42]Застосуйте маніфест:
kubectl create -f https://k8s.io/examples/controllers/job-backoff-limit-per-index-failindex.yamlПриблизно через 15 секунд перевірте стан Podʼів для Job. Ви можете зробити це, виконавши команду:
kubectl get pods -l job-name=job-backoff-limit-per-index-failindex -o yamlВи побачите результат, подібний до цього:
NAME READY STATUS RESTARTS AGE job-backoff-limit-per-index-failindex-0-4g4cm 0/1 Error 0 4s job-backoff-limit-per-index-failindex-0-fkdzq 0/1 Error 0 15s job-backoff-limit-per-index-failindex-1-2bgdj 0/1 Error 0 15s job-backoff-limit-per-index-failindex-2-vs6lt 0/1 Completed 0 11s job-backoff-limit-per-index-failindex-3-s7s47 0/1 Completed 0 6sЗверніть увагу, що вивід показує наступне:
- Два Podʼа мають індекс 0 через обмеження backoff, дозволене для однієї спроби індексування.
 - Тільки один Pod має індекс 1, оскільки код виходу невдалого Podʼа збігався з політикою збою podʼа з дією 
FailIndex. 
Перевірте стан Job виконавши:
kubectl get jobs -l job-name=job-backoff-limit-per-index-failindex -o yamlУ статусі Job побачите, що поле
failedIndexesпоказує "0,1", оскільки обидва індекси зазнали невдачі. Оскільки індекс 1 не було повторено, кількість збійних Podʼів, зазначена в полі статусу "failed", дорівнює 3.
Очищення
Вилучить створений Job:
kubectl delete jobs/job-backoff-limit-per-index-failindex
Кластер автоматично очищує поди.
Альтернативи
Ви можете покладатись виключно на політику відмови Pod backoff, вказавши поле .spec.backoffLimit завдання. Однак у багатьох ситуаціях важко знайти баланс між встановленням низького значення для .spec.backoffLimit для уникнення непотрібних повторних спроб виконання Podʼів, але достатньо великого, щоб забезпечити, що Job не буде припинено через втручання у роботу Podʼів.