Чи можна заново працювати на кубернетах?


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

Ні. Однозначно немає способу відновити роботу з кубернетів. Спершу його потрібно видалити.


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, а потім відтворити !!
deepdive

14

Ви також можете уникнути вказаної вами помилки, вказавши

metadata: generateName: dbload

замість просто name

У цьому випадку кожна робота, яку ви подаєте з цим файлом yaml, матиме унікальне ім’я, яке буде виглядати приблизно так dbloada1b2c. Тоді ви можете вирішити, чи потрібно видаляти старі завдання, але робити це вам не доведеться .


Я вважаю, що createName застосовується лише до kind = pod, а НЕ до роботи.
user518066

2
Ні, це стандартна частина ObjectMeta і стосується як pod, так і завдання: k8s посилання . Я використовую його весь час, це головне для того, що я роблю.
vp124

1
Дуже дякую за цей ухил. Тільки для документації це працює лише зkubectl create
Оммен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.