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?

Odpowiedzi:


22

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


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 -

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ć.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.