web-dev-qa-db-ja.com

kubernetesジョブを再実行することはできますか?

次の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を実行することもできますが、すでに存在しているジョブをなんとか再起動できるかどうか疑問に思っていますか?

47
Bostone

いいえ。kubernetesジョブを再実行する方法は絶対にありません。最初に削除する必要があります。

31
cohadar

ジョブをそれ自体で置き換えることにより、再実行をシミュレートできます。

  • _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 -
31
F. Santiago

次のように指定することで、言及したエラーを回避することもできます

metadata: generateName: dbload

単にnameの代わりに

その場合、このyamlファイルを使用して送信する各ジョブには、dbloada1b2cのような一意の名前が付けられます。次に、古いジョブを削除する必要があるかどうかを決定できますが、削除する必要はありませんhave

20
vp124