본문 바로가기
쿠버네티스

[쿠버네티스/k8s] 크론잡(cron job) 작업 실행되지 않는 문제 해결 - Cannot determine if job needs to be started: too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew

by 개발하는 지토 2023. 3. 27.

문제 상황

  • 크론잡 스케쥴이 되었지만 더이상 작업이 실행되지 않음
  • 크론잡 이벤트 메세지중 cronjob-controller 에 의해 발생된 Cannot determine if job needs to be started: too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew 라는 메세지 확인

k8s cronjob, cronjob-controller event log

 

문제 발생 이유

  • 이전에 크론잡이 스케쥴에 맞춰 잡을 생성하고, 해당 잡에 의해 파드가 관리됨
  • 파드에서 실행 된 애플리케이션에 이슈로 인해 작업이 종료되지 않아서 파드가 계속 실행 상태로 남아있었음
  • 해당 크론잡에는 concurrencyPolicy: Forbid 설정이 되어있었음
  • 위 설정으로 인해 이전 작업이 완료 되지 않으면 다음 스케쥴에 새로운 작업이 실행되지 않음
  • 실행되지 않은 작업이 계속 쌓여서 100회 이상 실패하고 크론잡 컨트롤러에서 잡을 더이상 실행하지 않고 에러 로그를 남김, 이후 작업 실행 제한
    • 에러 로그: Cannot determine if job needs to be started: too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew

 

해결법

  • 쿠버네티스 공식 문서에 관련 내용이 있음 - 크론잡의 한계
    • 모든 크론잡에 대해 크론잡 컨트롤러 는 마지막 일정부터 지금까지 얼마나 많은 일정이 누락되었는지 확인한다. 만약 100회 이상의 일정이 누락되었다면, 잡을 실행하지 않고 아래와 같은 에러 로그를 남긴다.
  • 크론잡 설정에서 spec.startingDeadlineSeconds 옵션을 설정하면 컨트롤러는 마지막 일정부터 지금까지 대신 startingDeadlineSeconds 값에서 몇 개의 잡이 누락되었는지 카운팅하게 되어 다시 잡이 정상 실행될 수 있도록 할 수 있다.
    • ex) startingDeadlineSeconds: 200 로 설정시, 컨트롤러는 최근 200초 내 몇 개의 잡이 누락되었는지 카운팅한다.

 

이번 이슈에서는 작업이 특정시간이 아닌 시간에 실행해도 상관없고 작업이 실행되기만 하면 되었다.

startingDeadlineSeconds 을 설정하고 스케쥴을 조절(임시로 앞당김)해서 작업이 다시 실행되는걸 확인했다.

이후에 기존 스케쥴로 바꾸는 방식으로 문제를 해결했다.

 

근본적으로 종료되지 않은 작업 및 이슈가 되는 파드에 대한 모니터링을 적절하게 해서 크론잡 스케쥴에 대한 이슈가 발생하지 않았다면 더 좋았을 것 같다.

오류는 어떤 상황에서든 발생할 수 있기 때문에 적절한 대처 방안을 계획 해놓거나, 모니터링을 잘 해서 빠르게 대처할 수 있도록 해야한다.

댓글