Kubernetes находит журналы неудачной работы cronjob

Я обнаружил сбой 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
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
0
0
142
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Означает ли это, что если для параметра restartPolicy моего задания установлено значение OnFailure, соответствующий модуль будет удален в случае сбоя, и не будет возможности проверить журналы модуля?

Как правило, все журналы, связанные с модулем, будут потеряны после удаления модуля. Причина проста: по умолчанию все журналы сохраняются в томе модуля, и эти тома удаляются после удаления модуля, как указано в официальной документации kubernetes.

Файлы на диске в модуле являются эфемерными, что создает некоторые проблемы для нетривиальные приложения при работе в подах. Одна проблема - потеря файлов при сбое модуля. kubelet перезапускает контейнер, но с чистым состоянием.

Я нашел журналы в GKE, потому что у него есть собственная система ведения журналов, или есть другие действия, которые я могу предпринять, чтобы получить доступ к этим журналам?

Облачные провайдеры, такие как Google Cloud Platform (GCP), по умолчанию включают такие функции, как ведение журнала и мониторинг, чтобы облегчить работу, и благодаря этой функции по умолчанию вы можете видеть свои журналы в пользовательском интерфейсе.

Если вы хотите получить доступ к этим журналам другим способом, вы можете настроить сервер журналов для своего кластера kubernetes, а также хранить эти журналы в постоянных томах, поскольку PV доступны даже после удаления ваших модулей.

Я понимаю. Первоначально я думал, что все неисправные модули удалены, и я не мог их найти или просмотреть журнал. Мне было интересно, почему я могу проверять журналы на GCP, и я пытался найти другое решение. Но если это сервер журналов, предоставляемый Cloud Provider, для меня это имеет смысл. Спасибо за ответ.

Wilson.Wang 11.04.2023 09:16
Ответ принят как подходящий

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 дает сбой. Однако я не могу найти неудавшиеся модули, все оставшиеся модули успешно выполняются.

Wilson.Wang 11.04.2023 08:41

Можно ли поделиться своим yaml CronJob в виде Gist или pastebin (при необходимости вы можете отредактировать что-либо конфиденциальное) — это позволит другим проверить и воспроизвести вашу проблему.

Blender Fox 11.04.2023 08:46

Из описания неудачной работы я могу узнать, что работа считается неудачной из-за достижения предела отсрочки. Других зацепок нет, и это приводит меня в замешательство.

Wilson.Wang 11.04.2023 08:47

Да, но если другие смогут воспроизвести проблему, мы сможем определить, что не так. Моя первоначальная догадка заключается в том, что вы, возможно, установили restartPolicy: OnFailure, что приводит к перезапуску задания в случае сбоя, без сбоя выполнения задания; пока не будет достигнут предел повторных попыток, а затем все задание будет помечено как не выполненное.

Blender Fox 11.04.2023 08:56

Я вставил фрагмент своего yaml CronJob, если чего-то не хватает из-за отсутствия информации, просто дайте мне знать. Большое спасибо.

Wilson.Wang 11.04.2023 09:05

Я воспроизвел вашу проблему и предложил вам некоторые изменения. Пожалуйста, смотрите мой отредактированный ответ.

Blender Fox 11.04.2023 09:43

Спасибо за ваше подробное объяснение. Таким образом, мне нужно сбросить мою restartPolicy, чтобы сохранить сбойные модули или иметь систему журналов для отслеживания информации об отладке. Очень ценю информацию, которую вы предоставили!

Wilson.Wang 11.04.2023 11:32

Вы можете (и должны) иметь и то, и другое — у вас могут быть как отказавшие модули, так и система журналов (ELK, StackDriver и т. д.). запросы к базе данных журналов для более сложных запросов.

Blender Fox 11.04.2023 11:46

Другие вопросы по теме