Czy można ponownie uruchomić zadanie Kubernetes?

35

Mam następującą konfigurację zadania Kubernetes:

---
apiVersion: batch/v1
kind: Job
metadata:
  name: dbload
  creationTimestamp: 
spec:
  template:
    metadata:
      name: dbload
    spec:
      containers:
      - name: dbload
        image: sdvl3prox001:7001/pbench/tdload
        command: ["/opt/pbench/loadTpcdsData.sh",  "qas0063", "dbc", "dbc", "1"]
      restartPolicy: Never
      imagePullSecrets: 
        - name: pbenchregkey
status: {}

Po wykonaniu kubectl create -f dbload-deployment.yml --recordzadania i utworzeniu zasobnika pojemnik Docker działa do końca i otrzymuję ten status:

$ kubectl get job dbload
NAME      DESIRED   SUCCESSFUL   AGE
dbload    1         1            1h
$ kubectl get pods -a
NAME           READY     STATUS      RESTARTS   AGE
dbload-0mk0d   0/1       Completed   0          1h

Ta praca jest jednorazowa i muszę ją ponownie uruchomić. Jeśli spróbuję go uruchomić ponowniekubectl create polecenia, pojawia się ten błąd

$ kubectl create -f dbload-deployment.yml --record
Error from server: error when creating "dbload-deployment.yml": jobs.batch "dbload" already exists

Oczywiście, że mogę to zrobić, kubectl delete job dbloada potem uciec, kubectl createale zastanawiam się, czy uda mi się jakoś obudzić pracę, która już istnieje?

Bostone
źródło

Odpowiedzi:

22

Nie. Zdecydowanie nie ma możliwości ponownego uruchomienia zadania kubernetes. Najpierw musisz go usunąć.

Cohadar
źródło
23

Możesz zasymulować ponowne uruchomienie, zastępując zadanie samym sobą:

  • kubectl get job "your-job" -o json | kubectl replace --force -f -

Jeśli pojawią się błędy z powodu automatycznie wygenerowanych etykiet lub selektorów, możesz je usunąć lub edytować za pomocą jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
F. Santiago
źródło
1
Zdecydowanie zaleca się najpierw zapisanie kopii zadania json w pliku. kubectl replaceusuwa zadanie przed wystąpieniem błędów podczas jego odtwarzania.
Jeremy Huiskamp
Najpierw zapisz plik Json, a następnie utwórz go ponownie !!
deepdive
14

Możesz także uniknąć wspomnianego błędu, określając go

metadata: generateName: dbload

zamiast po prostu name

W takim przypadku każde zadanie przesłane za pomocą tego pliku yaml będzie miało unikalną nazwę, która będzie wyglądać mniej więcej tak dbloada1b2c. Następnie możesz zdecydować, czy chcesz usunąć stare zadania, ale nie będziesz musiał tego robić.

vp124
źródło
Uważam, że generateName dotyczy tylko rodzaju = pod i NIE zadania.
user518066
2
Nie, jest to standardowa część ObjectMeta i dotyczy ona zarówno zasobnika, jak i zadania: k8s . Używam go cały czas, jest to podstawa tego, co robię.
vp124
1
Dziękuję bardzo za ten unik. Tylko dla dokumentacji działa to tylko zkubectl create
Ohmen