Apakah mungkin untuk menjalankan kembali pekerjaan kubernetes?

35

Saya memiliki konfigurasi Pekerjaan Kubernetes berikut:

---
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: {}

Ketika saya melakukan kubectl create -f dbload-deployment.yml --recordpekerjaan dan pod dibuat, wadah Docker berjalan ke selesai dan saya mendapatkan status ini:

$ 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

Pekerjaan ini adalah satu kali perjanjian dan saya harus bisa memutarnya kembali. Jika saya mencoba menjalankannya kembali dengan kubectl createperintah saya mendapatkan kesalahan ini

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

Tentu saja saya bisa melakukannya kubectl delete job dbloaddan kemudian berlari kubectl createtetapi saya bertanya-tanya apakah saya dapat membangunkan kembali pekerjaan yang sudah ada?

Bostone
sumber

Jawaban:

22

Tidak. Jelas tidak ada cara untuk menjalankan kembali pekerjaan kubernetes. Anda harus menghapusnya terlebih dahulu.

cohadar
sumber
23

Anda dapat mensimulasikan tayangan ulang dengan mengganti pekerjaan itu sendiri:

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

Jika Anda mendapatkan kesalahan karena label atau penyeleksi yang dibuat secara otomatis, Anda dapat menghapus atau mengeditnya dengan jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
F. Santiago
sumber
1
Akan sangat menyarankan menyimpan salinan pekerjaan json ke file terlebih dahulu. kubectl replacemenghapus pekerjaan sebelum mengalami kesalahan saat membuatnya kembali.
Jeremy Huiskamp
Simpan json pertama dan kemudian buat kembali !!
deepdive
14

Anda juga dapat menghindari kesalahan yang Anda sebutkan dengan menentukan

metadata: generateName: dbload

bukannya sederhana name

Dalam hal ini, setiap pekerjaan yang Anda kirimkan dengan file yaml ini akan memiliki nama unik yang akan terlihat seperti dbloada1b2c. Kemudian Anda dapat memutuskan apakah Anda perlu menghapus pekerjaan lama, tetapi Anda tidak harus melakukannya.

vp124
sumber
Saya percaya generateName hanya berlaku untuk jenis = pod dan BUKAN pekerjaan.
user518066
2
Tidak, ini adalah bagian standar ObjectMeta dan berlaku untuk pod dan referensi pekerjaan: k8s . Saya telah menggunakannya sepanjang waktu, itu inti dari apa yang saya lakukan.
vp124
1
Terima kasih banyak untuk menghindar ini. Hanya untuk dokumentasi, ini hanya bekerja dengankubectl create
Ohmen