Docker

是否可以重新執行 kubernetes 作業?

  • January 5, 2022

我有以下 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,但我想知道我是否可以以某種方式重新喚醒已經存在的工作?

不,絕對沒有辦法重新執行 Kubernetes 作業。您需要先將其刪除。

通過將作業替換為自身來模擬重新執行:

  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 -

更新了Jeremy Huiskamp的建議

引用自:https://serverfault.com/questions/809632