我有以下 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
通过用其自身替换作业来模拟重新运行:
- 备份你的工作:
kubectl get job "your-job" -o json > your-job.json
- 替换到位的工作:
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
没有办法运行已完成的作业,但你可以通过执行以下操作来模拟重新运行
获取现有作业的 yaml 文件:
kubectl get job <job_name> -o yaml > <job_name>.yaml
删除现有的作业:
kubectl delete job <job_name>
再次运行该作业:
kubectl apply -f <job_name>.yaml