Задачи и расписания в кластере: Job, CronJob и как не выполнить работу дважды
Job выполняет работу до успешного завершения, CronJob создаёт Job по расписанию — и оба ведут себя не так, как ожидает человек, привыкший к системному планировщику. Во-первых, гарантия — не менее одного раза: при сбое узла или контроллера задача может быть запущена повторно, поэтому работа обязана быть идемпотентной. Во-вторых, конкурентные запуски: если предыдущий запуск ещё идёт, по умолчанию стартует следующий; управляется concurrencyPolicy со значениями Allow, Forbid, Replace. В-третьих, пропуски: если контроллер не работал дольше startingDeadlineSeconds, запуск просто пропускается, а без этого параметра после долгой недоступности могут стартовать сразу много пропущенных задач. Практический набор: идемпотентность через ключ выполнения в базе, Forbid для долгих задач, разумные backoffLimit и activeDeadlineSeconds, ограничение истории, а для критичных задач — блокировка на стороне приложения.