Назад | Перейти на главную страницу

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

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

Невозможно запустить завершенное задание, но вы можете смоделировать повторный запуск, выполнив следующие действия.

  1. Получите yaml-файл существующей работы:

    kubectl get job <job_name> -o yaml > <job_name>.yaml
    
  2. Удалите существующее задание:

    kubectl delete job <job_name>
    
  3. Снова запустите задание:

    kubectl apply -f <job_name>.yaml