Sprytne Okazje — promocje, kody rabatowe i wyprzedaże

Generator Kubernetes Job i CronJob

Manifest YAML dla migracji, backupów i zadań cyklicznych: ponowienia, limit czasu, TTL, Secret i limity zasobów.

Bezpieczne (SSL)
Przetwarzanie Lokalne
100% Darmowe
Instrukcja
  • 1
    Wprowadź dane
    Wpisz treść, wklej tekst lub załaduj plik z dysku.
  • 2
    Kliknij przycisk
    Narzędzie natychmiast przetworzy Twoje dane w przeglądarce.
  • 3
    Pobierz wynik
    Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
function runTool() {
  return "Wynik gotowy w 0.1s";
}
Opcje wykonania
Zmiany w polach zastosujesz przyciskiem „Generuj manifest” lub klawiszem Enter.

Rodzaj

Job

Linii YAML

37

completions

1

wymagane ukończenia

parallelism

1

pody naraz

Min. rund

1

partii podów

backoffLimit

3

ponowień po błędzie

Manifest YAML

apiVersion: batch/v1 kind: Job metadata: name: db-migrate namespace: default spec: backoffLimit: 3 completions: 1 parallelism: 1 ttlSecondsAfterFinished: 3600 template: metadata: labels: job: db-migrate spec: securityContext: runAsNonRoot: true seccompProfile: { type: RuntimeDefault } restartPolicy: OnFailure containers: - name: db-migrate image: registry.example.com/myapp:1.0.0 securityContext: allowPrivilegeEscalation: false readOnlyRootFilesystem: true capabilities: { drop: ["ALL"] } command: - /bin/sh - -c - "php artisan migrate --force" resources: requests: cpu: 100m memory: 256Mi limits: cpu: "1" memory: 512Mi
TTL po zakończeniu: 1 godz.. Rozmiar manifestu: 894 B.

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

Polecenia kubectl dla Twojej nazwy i namespace
KrokPolecenie
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

Pola manifestu i ich znaczenie
PoleTwoja 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

PoleZnaczenieZakres w generatorze
backoffLimitile razy ponowić po błędzie (domyślnie w Kubernetes 6)0–20, domyślnie 3
completionsile udanych ukończeń jest wymaganych1–1000
parallelismile podów jednocześnieod 1, nie więcej niż completions
restartPolicyrestart kontenera w tym samym podzie albo nowy podOnFailure lub Never
ttlSecondsAfterFinishedpo jakim czasie usunąć zakończony Job0–604800 s (0 = pole pominięte), domyślnie 3600
activeDeadlineSecondsmaksymalny czas trwania całego Joba1–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

  1. Cel zadania: chcesz przetworzyć 10 paczek danych, każda ma być osobnym, udanym ukończeniem. Ustawiasz completions: 10.
  2. 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.
  3. 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.
  4. Restart kontenera: wybierasz restartPolicy: Never, bo przy imporcie chcesz zachować pody z błędem i ich logi do analizy.
  5. 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.
  6. 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 manifestuDo czego służyWartość w generatorze
metadata.name, metadata.namespacenazwa Joba (podstawa nazw podów) i przestrzeń nazwmałe litery, cyfry, myślniki, do 63 znaków; dla CronJob do 52
template.metadata.labels.jobetykieta ułatwiająca filtrowanie podówtaka sama jak nazwa
securityContext podauruchomienie bez roota i z domyślnym profilem seccomprunAsNonRoot: true, seccompProfile: RuntimeDefault
securityContext kontenerablokada eskalacji uprawnień i odebranie capabilitiesallowPrivilegeEscalation: false, drop: ALL, readOnlyRootFilesystem do wyboru
envFrom.secretRefzmienne środowiska z istniejącego obiektu Secretopcjonalnie, tylko referencja do nazwy
resourcesgwarantowane i maksymalne zasoby kontenerarequests: cpu 100m, memory 256Mi; limits: cpu 1, memory 512Mi (opcja „Limity zasobów”)
schedule, concurrencyPolicytylko 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.sql wymaga 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 … | sh i rm -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.

Zainstaluj Webp.pl Miej narzędzia we własnej kieszeni!