¿Es posible volver a ejecutar el trabajo de kubernetes?

35

Tengo la siguiente configuración de trabajo de 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: {}

Cuando hago kubectl create -f dbload-deployment.yml --recordel trabajo y se crea un pod, el contenedor Docker se ejecuta hasta su finalización y obtengo este estado:

$ 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

Este trabajo es un contrato de una sola vez y necesito poder volver a ejecutarlo. Si intento volver a ejecutarlo con el kubectl createcomando, aparece este error

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

Por supuesto que puedo hacer kubectl delete job dbloady luego correr, kubectl createpero me pregunto si de alguna manera puedo volver a despertar el trabajo que ya existe.

Bostone
fuente

Respuestas:

22

No. Definitivamente no hay forma de volver a ejecutar un trabajo de kubernetes. Primero debes eliminarlo.

cohadar
fuente
23

Puede simular una repetición reemplazando el trabajo consigo mismo:

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

Si obtiene errores debido a etiquetas o selectores generados automáticamente, puede eliminarlos o editarlos con jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
F. Santiago
fuente
1
Recomiendo encarecidamente guardar primero una copia del trabajo json en un archivo. kubectl replaceelimina el trabajo antes de encontrarse con los errores que lo recrean.
Jeremy Huiskamp
Guarda el json primero y luego vuelve a crearlo.
DeepDive
14

También puede evitar el error que mencionó especificando

metadata: generateName: dbload

en lugar de simplemente name

En ese caso, cada trabajo que envíe con este archivo yaml tendrá un nombre único que tendrá un aspecto similar dbloada1b2c. Luego puede decidir si necesita eliminar los trabajos anteriores, pero no tendrá que hacerlo.

vp124
fuente
Creo que generateName solo se aplica a kind = pod y NO al trabajo.
user518066
2
No, es una parte estándar de ObjectMeta y se aplica tanto al pod como al trabajo: referencia de k8s . Lo he estado usando todo el tiempo, es esencial para lo que estoy haciendo.
vp124
1
Muchas gracias por esta esquiva. Solo para documentación, esto solo funciona conkubectl create
Ohmen