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

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

我有以下 Kubernetes Job 配置:

---
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,但我想知道我是否可以以某种方式重新唤醒已经存在的工作?

答案1

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

但是,您可以根据现有的作业配置创建一个将立即执行的新作业:

kubectl create job --from=job/dbload new-dbload -n <namespace>

答案2

通过用其自身替换作业来模拟重新运行:

  1. 备份你的工作:
  • kubectl get job "your-job" -o json > your-job.json
  1. 替换到位的工作:
  • 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 -

更新杰里米·胡斯坎普的建议

答案3

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

  generateName: dbload

而不是简单地name

在这种情况下,您使用此 yaml 文件提交的每个作业都将具有一个唯一的名称,类似于dbloada1b2c。然后您可以决定是否需要删除旧作业,但您不会去做吧。

这是一个有效的 yaml 示例:

apiVersion: batch/v1
kind: Job
metadata:
  generateName: netutils-
spec:
  parallelism: 1
  template:
    spec:
      containers:
      - image: amouat/network-utils 
        name: netutil
      restartPolicy: Never

kubectl get job这是两个命令之后的输出kubectl create -f example.yaml

NAME             COMPLETIONS   DURATION   AGE
netutils-5bs2s   0/1           14s        14s
netutils-dsvfk   0/1           10s        10s

答案4

没有办法运行已完成的作业,但你可以通过执行以下操作来模拟重新运行

  1. 获取现有作业的 yaml 文件:

    kubectl get job <job_name> -o yaml > <job_name>.yaml
    
  2. 删除现有的作业:

    kubectl delete job <job_name>
    
  3. 再次运行该作业:

    kubectl apply -f <job_name>.yaml
    

相关内容