У меня следующая конфигурация 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
задание и модуль созданы, контейнер 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
но мне интересно, могу ли я как-то заново разбудить уже существующую работу?
Вы можете смоделировать повторный запуск, заменив задание на себя:
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 -
Нет. Определенно невозможно повторить работу в кубернетах. Вам нужно сначала удалить его.
Вы также можете избежать упомянутой ошибки, указав
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
Как улучшение @F. Идея Сантьяго, вы можете просто использовать значение, хранящееся в аннотации "kubectl.kubernetes.io/last-applied-configuration"
который содержит исходную примененную конфигурацию без какого-либо автоматически сгенерированного поля:
kubectl get <job name> -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | \
kubectl replace --save-config --force -f -
Примечание: для kubectl replace
, не забудьте пройти --save-config
поэтому он обновляет поле аннотации последней примененной конфигурацией.
Невозможно запустить завершенное задание, но вы можете смоделировать повторный запуск, выполнив следующие действия.
Получите yaml-файл существующей работы:
kubectl get job <job_name> -o yaml > <job_name>.yaml
Удалите существующее задание:
kubectl delete job <job_name>
Снова запустите задание:
kubectl apply -f <job_name>.yaml