Можно ли перезапустить работу Куберне?


35

У меня есть следующая конфигурация работы 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

Эта работа разовая, и мне нужно ее повторить. Если я пытаюсь запустить его с помощью 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но мне интересно, смогу ли я как-то пробудить работу, которая уже существует?

Ответы:


22

Нет. Определенно нет способа возобновить работу в kubernetes. Вы должны сначала удалить его.


23

Вы можете смоделировать повторный запуск, заменив задание на себя:

  • 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 -

1
Настоятельно рекомендую сначала сохранить копию задания json в файл. kubectl replaceудаляет задание перед тем, как столкнуться с ошибками, создавая его заново
Джереми Хуискамп

Сначала сохраните json, а затем воссоздайте!
глубокое погружение

14

Вы также можете избежать ошибки, которую вы упомянули, указав

metadata: generateName: dbload

вместо просто name

В этом случае каждое задание, которое вы отправляете с этим файлом yaml, будет иметь уникальное имя, которое будет выглядеть примерно так dbloada1b2c. Затем вы можете решить, нужно ли вам удалять старые задания, но вам не придется это делать.


Я считаю, что generateName относится только к kind = pod, а НЕ к заданию.
user518066

2
Нет, это стандартная часть ObjectMeta и применяется как к pod, так и к job: k8s reference . Я использовал это все время, это суть того, что я делаю.
vp124

1
Большое спасибо за этот уклонение. Просто для документации это работает только сkubectl create
Ohmen
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.