2017-12-07 79 views
9

W K8S Cron Job Limitations wspomnieć, że nie ma gwarancji, że praca będzie wykonana dokładnie raz:Dlaczego w projekcie kubernetes cron można utworzyć dwa zadania lub nie można utworzyć żadnego zadania?

crona tworzy obiekt o pracy raz w czasie jej realizacji harmonogramu . Mówimy "o", ponieważ istnieją pewne okoliczności, w których można utworzyć dwa zadania lub nie można utworzyć żadnego zadania. Staramy się, aby te rzadkie, ale nie całkowicie im zapobiegać. Dlatego zadania należy idempotent

Czy ktoś może wyjaśnić:

  • dlaczego to się mogło stać?
  • jakie są prawdopodobieństwa/statystyki, które mogą się zdarzyć?
  • Czy zostanie naprawiony w rozsądnej przyszłości w K8s?
  • czy istnieją jakieś obejścia zapobiegające takiemu zachowaniu (jeśli uruchomione zadanie nie może zostać zaimplementowane jako idempotent)?
  • do innych związanych z cronem usługi cierpią z tym samym problemem? Może to jest podstawowy problem crona?

Odpowiedz

1

Kontroler:

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/cronjob/cronjob_controller.go

rozpoczyna się od komentarza, że ​​kładzie podwaliny dla wyjaśnienia:

I did not use watch or expectations. Those add a lot of corner cases, and we aren't expecting a large volume of jobs or scheduledJobs. (We are favoring correctness over scalability.) 

If we find a single controller thread is too slow because there are a lot of Jobs or CronJobs, we we can parallelize by Namespace. If we find the load on the API server is too high, we can use a watch and UndeltaStore.) 

Just periodically list jobs and SJs, and then reconcile them. 

Okresowo znaczy co 10 sekund:

https://github.com/kubernetes/kubernetes/blob/master/pkg/controller/cronjob/cronjob_controller.go#L105

Dokumentacja następujących cytowanych ograniczeń posiada również kilka przydatnych kolor na niektóre okoliczności, w których 2 ofert pracy lub brak pracy może być uruchomione na określonym harmonogramem:

If startingDeadlineSeconds is set to a large value or left unset (the default) and if concurrentPolicy is set to AllowConcurrent, the jobs will always run at least once. 

Jobs may fail to run if the CronJob controller is not running or broken for a span of time from before the start time of the CronJob to start time plus startingDeadlineSeconds, or if the span covers multiple start times and concurrencyPolicy does not allow concurrency. For example, suppose a cron job is set to start at exactly 08:30:00 and its startingDeadlineSeconds is set to 10, if the CronJob controller happens to be down from 08:29:00 to 08:42:00, the job will not start. Set a longer startingDeadlineSeconds if starting later is better than not starting at all. 

wyższy poziom, rozwiązując tylko-raz w rozproszony system jest trudne:

https://bravenewgeek.com/you-cannot-have-exactly-once-delivery/

Zegary i synchronizacji czasu w systemie rozproszonym jest również trudne:

https://8thlight.com/blog/rylan-dirksen/2013/10/04/synchronization-in-a-distributed-system.html

Do pytania:

  • dlaczego to się mogło stać?

    Na przykład - węzeł obsługujący CronJobController kończy się niepowodzeniem w momencie, gdy zadanie ma zostać uruchomione.

  • jakie są prawdopodobieństwa/statystyki, które mogą się zdarzyć?

    Bardzo mało prawdopodobne dla danego uruchomienia.W przypadku dużej liczby serii bardzo mało prawdopodobne jest uniknięcie konieczności zmierzenia się z tym problemem.

  • Czy zostanie naprawiony w rozsądnej przyszłości w K8s?

    W repozytorium k8s nie ma problemów związanych z identyfikacją idemopotencji, więc można się domyślić, że nie.

    https://github.com/kubernetes/kubernetes/issues?q=is%3Aopen+is%3Aissue+label%3Aarea%2Fbatch

  • są jakieś obejścia, aby zapobiec takie zachowanie (jeśli działa praca nie może być realizowana jako idempotent)?

    Pomyśl o szczegółowej definicji idempotent i konkretnych punktach pracy, w których występują zatwierdzenia. Na przykład, można zlecić prace, aby wesprzeć wykonywanie więcej niż raz, jeśli zachowują stan do obszarów inscenizacyjnych, a następnie odbywa się proces wyborczy, który określa, czyje prace wygrywają.

  • czy inne usługi związane z cronem cierpią z tym samym problemem? Może to jest podstawowy problem crona?

    Tak, to podstawowy problem z rozproszonymi systemami.

    Dla większości użytkowników dokumentacja K8s podaje prawdopodobnie bardziej precyzyjną i niuansową odpowiedź, niż jest to konieczne. Jeśli zaplanowana praca kontroluje jakąś krytyczną procedurę medyczną, naprawdę ważne jest, aby zaplanować awarie. Jeśli jest to po prostu czyszczenie systemu, brak zaplanowanego przebiegu nie ma większego znaczenia. Z definicji prawie wszyscy użytkownicy k8s CronJobs należą do tej drugiej kategorii.

+1

wygląda jasno, bardzo dużo. dla "zadanie może nie zostać uruchomione, gdy kontroler nie powiedzie się" - było to dość oczywiste, chociaż trudno było zrozumieć, dlaczego można go pomnożyć razy. – radistao

Powiązane problemy