Я обнаружил сбой cronjob в своем кластере Kubernetes, работающем на Google GKE. У меня есть только информация о состоянии отказа и причине отказа задания.
Хотя я обнаружил неудачное задание и узнал, что оно достигло предела отсрочки, я хотел бы получить доступ к фактическим журналам или стандартному выводу модуля, чтобы определить ошибку кода, вызвавшую сбой.
Однако, когда я попытался использовать команду для проверки журнала, я обнаружил, что модуль уже был удален, и я не смог найти неисправный модуль.
Но из пользовательского интерфейса GKE я обнаружил, что есть журналы, показывающие ошибки в моем коде, и эта информация — это то, что я ищу.
Мне интересно, реализует ли GKE систему ведения журналов, чтобы я мог найти журналы?
Потому что я нашел следующую информацию в документе:
Примечание. Если для вашего задания указано restartPolicy = "OnFailure", имейте в виду, что ваш модуль, выполняющий задание, будет остановлен, как только будет достигнут предел отсрочки задания. Это может затруднить отладку исполняемого файла задания. Мы предлагаем установить restartPolicy = «Никогда» при отладке задания или использовании системы ведения журнала, чтобы гарантировать, что выходные данные сбойных заданий не будут потеряны непреднамеренно.
Означает ли это, что если для параметра restartPolicy моего задания установлено значение OnFailure, соответствующий модуль будет удален в случае сбоя, и не будет возможности проверить журналы модуля?
Я нашел журналы в GKE, потому что у него есть собственная система ведения журналов, или есть другие действия, которые я могу предпринять, чтобы получить доступ к этим журналам?
Спасибо.
Ниже приведен фрагмент моего cronjob.
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 3
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- $cmd
image: $img
imagePullPolicy: Always
name: $job_name
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: OnFailure
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
schedule: 0 4 * * *
successfulJobsHistoryLimit: 3
suspend: false
Означает ли это, что если для параметра restartPolicy моего задания установлено значение OnFailure, соответствующий модуль будет удален в случае сбоя, и не будет возможности проверить журналы модуля?
Как правило, все журналы, связанные с модулем, будут потеряны после удаления модуля. Причина проста: по умолчанию все журналы сохраняются в томе модуля, и эти тома удаляются после удаления модуля, как указано в официальной документации kubernetes.
Файлы на диске в модуле являются эфемерными, что создает некоторые проблемы для нетривиальные приложения при работе в подах. Одна проблема - потеря файлов при сбое модуля. kubelet перезапускает контейнер, но с чистым состоянием.
Я нашел журналы в GKE, потому что у него есть собственная система ведения журналов, или есть другие действия, которые я могу предпринять, чтобы получить доступ к этим журналам?
Облачные провайдеры, такие как Google Cloud Platform (GCP), по умолчанию включают такие функции, как ведение журнала и мониторинг, чтобы облегчить работу, и благодаря этой функции по умолчанию вы можете видеть свои журналы в пользовательском интерфейсе.
Если вы хотите получить доступ к этим журналам другим способом, вы можете настроить сервер журналов для своего кластера kubernetes, а также хранить эти журналы в постоянных томах, поскольку PV доступны даже после удаления ваших модулей.
CronJob имеет значение истории:
.spec.successfulJobsHistoryLimit
и .spec.failedJobsHistoryLimit
Установите их на количество успешных/неудачных заданий, которые вы хотите сохранить, и Kubernetes сохранит столько же неудачных или успешных модулей. Обычно я оставляю 3 неудачных, 1 успешную, но если отладка, я оставлю больше (6 неудачных, 3 успешных)
Отредактированная версия вашего yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-app
labels:
app: my-app
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 3
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: busybox
# command:
# - $cmd
command:
- "sh"
- "-c"
- "exit 1"
imagePullPolicy: Always
name: crontest
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: OnFailure
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
schedule: 0 4 * * *
successfulJobsHistoryLimit: 3
suspend: false
Я смог воспроизвести вашу проблему с этим. Я видел это сообщение в журналах:
Events: │
│ Type Reason Age From Message │
│ ---- ------ ---- ---- ------- │
│ Normal SuccessfulCreate 9m26s job-controller Created pod: my-app-manual-xnj-fpvzq │
│ Normal SuccessfulDelete 3m18s job-controller Deleted pod: my-app-manual-xnj-fpvzq │
│ Warning BackoffLimitExceeded 3m18s job-controller Job has reached the specified backoff limit │
│
Измените свой yaml, чтобы изменить restartPolicy
:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-app
labels:
app: my-app
spec:
concurrencyPolicy: Allow
failedJobsHistoryLimit: 3
jobTemplate:
metadata:
creationTimestamp: null
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: busybox
# command:
# - $cmd
command:
- "sh"
- "-c"
- "exit 1"
imagePullPolicy: Always
name: crontest
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Never ### <--- this is changed
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
schedule: 0 4 * * *
successfulJobsHistoryLimit: 3
suspend: false
Затем производит это:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-app-manual-29l-27x8v 0/1 Error 0 2m9s
my-app-manual-29l-64th2 0/1 Error 0 110s
my-app-manual-29l-shfk7 0/1 Error 0 2m4s
my-app-manual-29l-tj9k7 0/1 Error 0 84s
my-app-manual-29l-tzlwd 0/1 Error 0 40s
Короче говоря, да, restartPolicy
— это причина, по которой вы не видите неисправные модули.
Благодарю за ваш ответ. Я проверил свою конфигурацию cronjob. И .spec.successfulJobsHistoryLimit
, и .spec.failedJobsHistoryLimit
установлены на 3. Из задания (kubectl get jobs) я вижу неудачное задание, и именно здесь я обнаружил, что иногда мой cronjob дает сбой. Однако я не могу найти неудавшиеся модули, все оставшиеся модули успешно выполняются.
Можно ли поделиться своим yaml CronJob в виде Gist или pastebin (при необходимости вы можете отредактировать что-либо конфиденциальное) — это позволит другим проверить и воспроизвести вашу проблему.
Из описания неудачной работы я могу узнать, что работа считается неудачной из-за достижения предела отсрочки. Других зацепок нет, и это приводит меня в замешательство.
Да, но если другие смогут воспроизвести проблему, мы сможем определить, что не так. Моя первоначальная догадка заключается в том, что вы, возможно, установили restartPolicy: OnFailure
, что приводит к перезапуску задания в случае сбоя, без сбоя выполнения задания; пока не будет достигнут предел повторных попыток, а затем все задание будет помечено как не выполненное.
Я вставил фрагмент своего yaml CronJob, если чего-то не хватает из-за отсутствия информации, просто дайте мне знать. Большое спасибо.
Я воспроизвел вашу проблему и предложил вам некоторые изменения. Пожалуйста, смотрите мой отредактированный ответ.
Спасибо за ваше подробное объяснение. Таким образом, мне нужно сбросить мою restartPolicy, чтобы сохранить сбойные модули или иметь систему журналов для отслеживания информации об отладке. Очень ценю информацию, которую вы предоставили!
Вы можете (и должны) иметь и то, и другое — у вас могут быть как отказавшие модули, так и система журналов (ELK, StackDriver и т. д.). запросы к базе данных журналов для более сложных запросов.
Я понимаю. Первоначально я думал, что все неисправные модули удалены, и я не мог их найти или просмотреть журнал. Мне было интересно, почему я могу проверять журналы на GCP, и я пытался найти другое решение. Но если это сервер журналов, предоставляемый Cloud Provider, для меня это имеет смысл. Спасибо за ответ.