Можно ли запланировать выполнение CronJob на каждом узле Kubernetes?

Что я хотел бы сделать, так это периодически запускать несколько сценариев резервного копирования на каждом из узлов Kubernetes. Я хочу, чтобы он работал внутри кластера Kubernetes, а не просто добавлял скрипт в crontab каждого узла. Это связано с тем, что я буду хранить резервную копию на томе, подключенном к узлу с помощью Kubernetes. Это отличается от конфигурации, но это может быть файловая система CIFS, смонтированная плагином Flex или awsElasticBlockStore.

Было бы идеально, если бы CronJob смог шаблонировать DaemonSet (вместо того, чтобы фиксировать его как jobTemplate) и была бы возможность установить политику перезапуска DaemonSet на OnFailure.

Я хотел бы избежать определения n разных CronJobs для каждого из n узлов, а затем связывать их вместе, определяя nodeSelectors, поскольку это будет не так удобно поддерживать в среде, где количество узлов изменяется динамически.

То, что я вижу, обсуждалось здесь без какого-либо четкого вывода: https://github.com/kubernetes/kubernetes/issues/36601

Может быть, у вас есть какие-нибудь лайфхаки или трюки для достижения этой цели?


person Daniel Szot    schedule 29.04.2019    source источник


Ответы (2)


Вы можете использовать DaemonSet со следующим сценарием bash:

  while :; do
   currenttime=$(date +%H:%M)
   if [[ "$currenttime" > "23:00" ]] && [[ "$currenttime" < "23:05" ]]; then
     do_something
   else
     sleep 60
   fi
   test "$?" -gt 0 && notify_failed_job
  done
person Vasili Angapov    schedule 29.04.2019
comment
Это самый хакерский способ, который я могу себе представить ;) В любом случае, он будет работать. Вы думаете, что нет другого более нативного решения Kubernetes? - person Daniel Szot; 30.04.2019
comment
На самом деле есть некоторые проблемы (например, github.com/kubernetes/kubernetes/issues/36601 ) на k8s GitHub о проблеме и нет нативной поддержки. На данный момент ваше решение является наиболее разумным способом сделать это, поэтому я отметил его как принятое. - person Daniel Szot; 06.08.2019
comment
в строке 3 || должен быть &&, иначе do_something всегда вызывается - person Peter Skarpetis; 05.08.2020

Это все еще лучший способ имитировать CronJob с помощью шаблона DaemonSet. т.е. запустить crontab на всех узлах (на основе селектора узлов)

Я не против этого, но это облом, мне нужно постоянно запускать эти стручки. Было бы неплохо, если бы планировщик k8s справился со всем этим за меня.

person Gerb    schedule 27.02.2020