Có thể chạy lại công việc kubernetes?


35

Tôi có cấu hình công việc Kubernetes sau:

---
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: {}

Khi tôi thực hiện kubectl create -f dbload-deployment.yml --recordcông việc và một nhóm được tạo, Docker container sẽ chạy đến khi hoàn thành và tôi nhận được trạng thái này:

$ 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

Công việc này là một lần giao dịch và tôi cần có thể chạy lại nó. Nếu tôi cố chạy lại nó bằng kubectl createlệnh tôi sẽ gặp lỗi này

$ kubectl create -f dbload-deployment.yml --record
Error from server: error when creating "dbload-deployment.yml": jobs.batch "dbload" already exists

Tất nhiên tôi có thể làm kubectl delete job dbloadvà sau đó chạy kubectl createnhưng tôi tự hỏi liệu bằng cách nào đó tôi có thể đánh thức lại công việc đã tồn tại?

Câu trả lời:


22

Không. Chắc chắn không có cách nào để chạy lại công việc kubernetes. Bạn cần xóa nó trước.


23

Bạn có thể mô phỏng chạy lại bằng cách thay thế công việc bằng chính nó:

  • kubectl get job "your-job" -o json | kubectl replace --force -f -

Nếu bạn gặp lỗi do nhãn hoặc bộ chọn được tạo tự động, bạn có thể xóa hoặc chỉnh sửa chúng bằng jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -

1
Trước tiên, chúng tôi khuyên bạn nên lưu một bản sao của công việc vào một tệp. kubectl replacexóa công việc trước khi chạy vào các lỗi tạo lại nó.
Jeremy Huiskamp

Lưu json trước và sau đó tạo lại !!
sâu

14

Bạn cũng có thể tránh lỗi bạn đã đề cập bằng cách chỉ định

metadata: generateName: dbload

thay vì đơn giản name

Trong trường hợp đó, mỗi công việc bạn gửi với tệp yaml này sẽ có một tên duy nhất trông giống như vậy dbloada1b2c. Sau đó, bạn có thể quyết định xem bạn có cần xóa các công việc cũ hay không, nhưng bạn sẽ không phải làm việc đó.


Tôi tin rằng GenerName chỉ áp dụng cho công việc kind = pod và KHÔNG.
dùng518066

2
Không, đó là một phần tiêu chuẩn của ObjectMeta và áp dụng cho cả tham chiếu nhóm và công việc: k8s . Tôi đã sử dụng nó mọi lúc, đó là cốt lõi cho những gì tôi đang làm.
vp124

1
Cảm ơn bạn rất nhiều vì sự né tránh này. Chỉ để làm tài liệu, nó không hoạt động vớikubectl create
Ohmen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.