Generator Kubernetes Job i CronJob
Manifest YAML dla migracji, backupów i zadań cyklicznych: ponowienia, limit czasu, TTL, Secret i limity zasobów.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Opcje wykonania
Rodzaj
Linii YAML
completions
wymagane ukończenia
parallelism
pody naraz
Min. rund
partii podów
backoffLimit
ponowień po błędzie
Manifest YAML
Polecenie uruchamia się w shellu (/bin/sh -c). Sekrety są tylko referencją; sprawdź idempotencję, uprawnienia ServiceAccount i zgodność obrazu z non-root/read-only.
- readOnlyRootFilesystem: true blokuje zapis do systemu plików kontenera. Jeśli polecenie zapisuje pliki (np. dump bazy), zamontuj wolumen (tego manifest nie dodaje) albo wyłącz tę opcję.
Jak uruchomić i sprawdzić zadanie
| Krok | Polecenie |
|---|---|
| Zastosuj manifest | kubectl apply -f job.yaml |
| Sprawdź status | kubectl get job db-migrate -n default |
| Zobacz logi | kubectl logs job/db-migrate -n default |
| Poczekaj na zakończenie | kubectl wait --for=condition=complete job/db-migrate -n default --timeout=300s |
| Usuń Job | kubectl delete job db-migrate -n default |
Ściąga: najważniejsze pola
| Pole | Twoja wartość | Co oznacza |
|---|---|---|
| backoffLimit | 3 | Ile razy Kubernetes ponowi nieudane podejście, zanim uzna Job za nieudany (domyślnie w Kubernetes: 6). |
| completions | 1 | Ile podów musi zakończyć się sukcesem, żeby Job był ukończony. |
| parallelism | 1 | Maksymalna liczba podów działających jednocześnie. |
| ttlSecondsAfterFinished | 3600 s | Po ilu sekundach od zakończenia Job i jego pody są usuwane automatycznie. |
| activeDeadlineSeconds | brak | Maksymalny czas trwania Joba; po jego upływie Kubernetes przerywa pody. |
| restartPolicy | OnFailure | Never: przy błędzie powstaje nowy pod. OnFailure: kontener jest restartowany w tym samym podzie. |
Jak to liczymy
Przy completions = 1 i parallelism = 1 Kubernetes uruchamia naraz do 1 podów, więc do 1 ukończeń potrzeba co najmniej ⌈1 / 1⌉ = 1 rund. Ponowienia po błędach (do 3) wydłużają ten czas.
Job czy CronJob
Job uruchamia zadanie raz i kończy pracę (migracja, import, jednorazowy backup). CronJob tworzy Joby według harmonogramu; przy zadaniach, które nie powinny się nakładać, zostaw concurrencyPolicy: Forbid.
Never czy OnFailure
Never: po błędzie powstaje nowy pod, a stary zostaje z logami do analizy. OnFailure: kontener restartuje się w tym samym podzie, co ogranicza liczbę podów, ale logi poprzednich prób są krótsze.
Typowe pułapki
Obraz musi mieć /bin/sh, bo polecenie idzie przez sh -c. Zadanie powinno być idempotentne, bo ponowienie uruchomi je od początku. ttlSecondsAfterFinished usuwa też logi poda, więc zbierz je wcześniej.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Kubernetes Job
Kubernetes Job uruchamia zadanie, które kończy się po wykonaniu pracy: migrację bazy, backup, import albo przetwarzanie wsadowe. W odróżnieniu od Deployment pody Joba nie działają w nieskończoność. Generator tworzy manifest batch/v1 typu Job albo CronJob (zadanie według harmonogramu), a pod wynikiem podaje gotowe polecenia kubectl dla wpisanej nazwy i namespace.
Najważniejsze pola
| Pole | Znaczenie | Zakres w generatorze |
|---|---|---|
| backoffLimit | ile razy ponowić po błędzie (domyślnie w Kubernetes 6) | 0–20, domyślnie 3 |
| completions | ile udanych ukończeń jest wymaganych | 1–1000 |
| parallelism | ile podów jednocześnie | od 1, nie więcej niż completions |
| restartPolicy | restart kontenera w tym samym podzie albo nowy pod | OnFailure lub Never |
| ttlSecondsAfterFinished | po jakim czasie usunąć zakończony Job | 0–604800 s (0 = pole pominięte), domyślnie 3600 |
| activeDeadlineSeconds | maksymalny czas trwania całego Joba | 1–604800 s albo puste pole |
Przykład: migracja bazy
Preset „Migracje” ustawia nazwę db-migrate i polecenie php artisan migrate --force. Domyślny manifest zawiera apiVersion: batch/v1, kind: Job, namespace default, backoffLimit: 3, completions: 1, parallelism: 1, ttlSecondsAfterFinished: 3600 i restartPolicy: OnFailure. Polecenie trafia do kontenera jako /bin/sh -c "php artisan migrate --force", a obraz musi mieć przypięty tag lub digest, np. registry.example.com/myapp:1.0.0. Tag :latest jest odrzucany, bo przy ponowieniu węzeł mógłby pobrać inną wersję obrazu niż przy pierwszej próbie.
Pozostałe presety to „Backup” (pg_dump $DATABASE_URL > /backup/db.sql) i „Czyszczenie” (php artisan cleanup:old-records).
Uruchomienie
kubectl apply -f job.yaml, status: kubectl get job db-migrate -n default, logi: kubectl logs job/db-migrate -n default. W skryptach CI przydaje się kubectl wait --for=condition=complete job/db-migrate -n default --timeout=300s, które czeka na zakończenie zadania. CronJob uruchomisz ręcznie poza harmonogramem poleceniem kubectl create job --from=cronjob/nazwa nazwa-reczny.
Jak działa kontroler Job i co generuje narzędzie
Job nie uruchamia podów sam z siebie, robi to kontroler Joba działający w pętli sterowania. Czyta z manifestu liczbę wymaganych ukończeń (completions) i porównuje ją z liczbą podów zakończonych sukcesem. Dopóki udanych ukończeń jest mniej, kontroler tworzy kolejne pody na podstawie spec.template, ale nigdy więcej niż parallelism podów jednocześnie. Gdy liczba udanych ukończeń osiągnie completions, Job przechodzi w stan Complete i kontroler przestaje tworzyć nowe pody.
Drugim mechanizmem jest backoffLimit, czyli licznik niepowodzeń, a nie limit czasu. Każde nieudane podejście zwiększa ten licznik, a kolejne ponowienia startują z rosnącym opóźnieniem (10 s, 20 s, 40 s… do 6 minut). Gdy licznik zostanie przekroczony, Job dostaje stan Failed. Przy restartPolicy: Never każda porażka to nowy pod, a przy OnFailure kontener wstaje ponownie w tym samym podzie, przy czym te restarty też liczą się do backoffLimit. Limit czasu ustawia osobne pole activeDeadlineSeconds: po jego upływie Kubernetes przerywa wszystkie pody i oznacza Job jako nieudany, nawet jeśli ponowienia się nie wyczerpały.
Pole ttlSecondsAfterFinished jest znacznikiem dla kontrolera TTL: po zakończeniu Joba (sukces albo porażka) kontroler odczekuje zadany czas i usuwa obiekt razem z podami. Bez tego pola zakończone Joby zostają w klastrze. Generator składa pola w jeden manifest YAML. Nie łączy się z API Kubernetes, nie uruchamia podów i nie waliduje manifestu względem konkretnego klastra, sprawdza tylko poprawność nazw, obrazu, polecenia i zakresy liczb.
Przykład krok po kroku: import 10 paczek danych
- Cel zadania: chcesz przetworzyć 10 paczek danych, każda ma być osobnym, udanym ukończeniem. Ustawiasz completions: 10.
- Równoległość: parallelism: 3, więc kontroler trzyma w pracy najwyżej 3 pody naraz. Generator liczy minimalną liczbę rund jako ⌈10 / 3⌉ = 4: trzy pełne partie po 3 pody i ostatnia z 1 podem.
- Ponowienia: backoffLimit: 3 oznacza 3 ponowienia po błędach. Czwarta porażka przekracza limit i cały Job przechodzi w stan Failed, nawet jeśli część paczek już się udała.
- Restart kontenera: wybierasz restartPolicy: Never, bo przy imporcie chcesz zachować pody z błędem i ich logi do analizy.
- Limit czasu: jeśli jedna paczka trwa około 5 minut, 4 rundy to co najmniej 20 minut (1200 s). Ustawiasz activeDeadlineSeconds: 1800, żeby zostawić zapas na ponowienia i ich opóźnienia. Wartość mniejsza niż 1200 s przerwie poprawnie działający import.
- Sprzątanie: zostawiasz ttlSecondsAfterFinished: 3600, więc godzinę po zakończeniu kontroler TTL usunie Job wraz z podami. Logi zbierz wcześniej, bo znikną razem z podami.
Co jeszcze generator dodaje do manifestu
| Element manifestu | Do czego służy | Wartość w generatorze |
|---|---|---|
| metadata.name, metadata.namespace | nazwa Joba (podstawa nazw podów) i przestrzeń nazw | małe litery, cyfry, myślniki, do 63 znaków; dla CronJob do 52 |
| template.metadata.labels.job | etykieta ułatwiająca filtrowanie podów | taka sama jak nazwa |
| securityContext poda | uruchomienie bez roota i z domyślnym profilem seccomp | runAsNonRoot: true, seccompProfile: RuntimeDefault |
| securityContext kontenera | blokada eskalacji uprawnień i odebranie capabilities | allowPrivilegeEscalation: false, drop: ALL, readOnlyRootFilesystem do wyboru |
| envFrom.secretRef | zmienne środowiska z istniejącego obiektu Secret | opcjonalnie, tylko referencja do nazwy |
| resources | gwarantowane i maksymalne zasoby kontenera | requests: cpu 100m, memory 256Mi; limits: cpu 1, memory 512Mi (opcja „Limity zasobów”) |
| schedule, concurrencyPolicy | tylko CronJob: harmonogram i zachowanie przy nakładaniu się uruchomień | 5 pól crona lub makro (@daily, @hourly…); Forbid, Allow albo Replace |
Praktyczne wskazówki przed wdrożeniem manifestu
- Zacznij od restartPolicy. Jeśli kontener ma sam wracać do pracy po chwilowym błędzie, wybierz OnFailure. Jeśli każda próba ma być osobnym podem z własnymi logami, wybierz Never.
- Nie ustawiaj parallelism wyżej, niż potrzebujesz. Przy completions: 10 i parallelism: 3 zadanie idzie w 4 rundach; parallelism równe completions uruchomi wszystkie pody naraz i obciąży klaster oraz współdzielone zasoby, na przykład bazę danych.
- Nie traktuj backoffLimit jako limitu czasu. Zadanie, które wisi bez błędu, przerwie dopiero activeDeadlineSeconds.
- Sprawdź readOnlyRootFilesystem. Opcja jest domyślnie włączona i blokuje zapis na dysk kontenera, więc preset „Backup” zapisujący
/backup/db.sqlwymaga dopisania wolumenu albo wyłączenia tej opcji. - Zadbaj o idempotencję. Ponowienie uruchamia polecenie od początku, więc migracja czy import muszą znieść ponowne wykonanie.
- Nazwij Joba od zadania. metadata.name trafia do nazw podów, więc db-migrate jest czytelniejsze niż job-1, a przy ręcznym usuwaniu łatwiej trafić we właściwy obiekt.
Czego generator nie uwzględnia
- Brak walidacji względem klastra. Narzędzie nie sprawdza, czy obraz istnieje, czy namespace i Secret są utworzone ani czy kwoty klastra pozwolą uruchomić tyle podów, ile ustawisz w parallelism.
- Bez wolumenów i ConfigMap. Manifest nie zawiera wolumenów, montowań, ConfigMap ani serviceAccountName; przy backupie czy imporcie plików trzeba je dopisać ręcznie.
- Bez reguł schedulowania. Generator nie ustawia nodeSelector, tolerations ani affinity, a limity zasobów mają stałe wartości, które możesz zmienić w gotowym YAML.
- Tylko zwykły Job lub CronJob. Narzędzie nie tworzy Joba indeksowanego ani kolejki pracy z przypisaniem elementu do poda. Odrzuca też polecenia wieloliniowe oraz zawierające
curl … | shirm -rf.
Najczęstsze pytania o Kubernetes Job
Job czy CronJob?
Job to jedno wykonanie, CronJob tworzy Joby według harmonogramu w formacie crona. Dla zadań, które nie powinny się nakładać, zostaw concurrencyPolicy: Forbid: kolejne uruchomienie zostanie pominięte, jeśli poprzednie jeszcze trwa.
Czym różni się restartPolicy: Never od OnFailure w Jobie?
Never po błędzie tworzy nowy pod, a stary zostaje z logami. OnFailure restartuje kontener w tym samym podzie; restarty też liczą się do backoffLimit, a po przekroczeniu limitu pod jest zatrzymywany, co utrudnia analizę logów.
Jak przerwać Job, który działa zbyt długo?
Ustaw w generatorze limit czasu, czyli activeDeadlineSeconds. Po upływie tylu sekund Kubernetes zatrzyma pody i oznaczy Job jako nieudany. Działający Job możesz też usunąć poleceniem kubectl delete job nazwa.
Dlaczego Job pokazuje mniej ukończeń, choć pody działają?
completions liczy wyłącznie udane zakończenia. Dopóki pody kończą się błędem albo wciąż pracują, status jest niższy od zadanej liczby, a nieudane próby zbliżają Job do przekroczenia backoffLimit.
Czy Job usunie się sam po zakończeniu?
Tylko jeśli ustawisz ttlSecondsAfterFinished. Generator domyślnie wpisuje 3600 s (1 godzina); wartość 0 pomija to pole i Job zostaje w klastrze ze statusem Complete lub Failed do ręcznego usunięcia.
Dlaczego nazwa CronJob może mieć tylko 52 znaki?
Kontroler CronJob dopisuje do nazwy każdego tworzonego Joba sufiks z czasem uruchomienia, a nazwa Joba nie może przekroczyć 63 znaków. Dlatego generator odrzuca dłuższe nazwy w trybie CronJob.