次の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
を実行すると、ジョブとポッドが作成され、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
このジョブは1回限りの取引であり、再実行できるようにする必要があります。 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
を実行することもできますが、すでに存在しているジョブをなんとか再起動できるかどうか疑問に思っていますか?
いいえ。kubernetesジョブを再実行する方法は絶対にありません。最初に削除する必要があります。
ジョブをそれ自体で置き換えることにより、再実行をシミュレートできます。
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 -
次のように指定することで、言及したエラーを回避することもできます
metadata: generateName: dbload
単にname
の代わりに
その場合、このyamlファイルを使用して送信する各ジョブには、dbloada1b2c
のような一意の名前が付けられます。次に、古いジョブを削除する必要があるかどうかを決定できますが、削除する必要はありませんhave。