是否可以重新运行kubernetes作业?


35

我具有以下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: {}

当我完成kubectl create -f dbload-deployment.yml --record工作并创建一个pod时,Docker容器运行完毕,并且我得到以下状态:

$ 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

这项工作是一笔交易,我需要能够重新运行它。如果我尝试使用kubectl create命令此错误

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

当然可以kubectl delete job dbload,然后运行,kubectl create但是我想知道是否可以以某种方式重新唤醒已经存在的工作?

Answers:


22

不。绝对没有办法重新运行kubernetes作业。您需要先删除它。


23

您可以通过将作业替换为自身来模拟重新运行:

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

如果由于自动生成的标签或选择器而出现错误,则可以使用jq删除或编辑它们:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -

1
强烈建议您先将作业json的副本保存到文件中。 kubectl replace在遇到重新创建错误之前删除作业。
Jeremy Huiskamp,

首先保存json,然后重新创建!
deepdive

14

您还可以通过指定来避免提到的错误

metadata: generateName: dbload

而不是简单 name

在这种情况下,您使用此yaml文件提交的每个作业都会有一个唯一的名称,看起来像dbloada1b2c。然后,你可以决定你是否需要删除旧的工作,但你不会这样做。


我相信generateName仅适用于kind = pod而不适用于job。
user518066

2
不,这是ObjectMeta的标准部分,适用于pod和job:k8s reference。我一直在使用它,这是我正在做的事情的核心。
vp124'9

1
非常感谢您的回避。仅出于文档目的,此功能仅适用于kubectl create
Ohmen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.