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

Respuestas:


22

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


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 -

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.