簡體   English   中英

如何只為/由 Cronjob 創建一個 Pod

[英]how to have only one Pod created for/by Cronjob

我在凌晨 2 點運行這個 Cronjob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: postgres-backup
spec:
  # Backup the database every day at 2AM
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: postgres-backup
            image: postgres:10.4
            command:
            - "/bin/sh"
            - -c
            - |
              pg_dump -Fc -d postgresql://$DBUSER:$DBPASS@$DBHOST:$DBPORT/$DBNAME > /var/backups/backup_$(date +"%d-%m-%Y_%H-%M").bak;
            env:
            - name: DBHOST
              valueFrom:
                configMapKeyRef:
                  name: dev-db-config
                  key: db_host
            - name: DBPORT
              valueFrom:
                configMapKeyRef:
                  name: dev-db-config
                  key: db_port
            - name: DBNAME
              valueFrom:
                configMapKeyRef:
                  name: dev-db-config
                  key: db_name
            - name: DBUSER
              valueFrom:
                secretKeyRef:
                  name: dev-db-secret
                  key: db_username
            - name: DBPASS
              valueFrom:
                secretKeyRef:
                  name: dev-db-secret
                  key: db_password
            volumeMounts:
            - mountPath: /var/backups
              name: postgres-backup-storage
          - name: postgres-restore
            image: postgres:10.4
            volumeMounts:
            - mountPath: /var/backups
              name: postgres-backup-storage
          restartPolicy: OnFailure
          volumes:
          - name: postgres-backup-storage
            hostPath:
            # Ensure the file directory is created.
              path: /var/volumes/postgres-backups
              type: DirectoryOrCreate

作業已成功執行,但我不喜歡的是,每次作業執行都會創建一個新 Pod:

Cornjob Job 執行的多個 Pod

有沒有辦法清理以前(舊)創建的 Pod? 或者,也許有辦法每次都重新運行同一個 Pod/Job?

如果只需要保留最后一個作業和 pod,則可以使用.spec.successfulJobsHistoryLimit字段設置為1

這樣只會保留最后一個作業和相應的 pod。 默認情況下,它設置為3 也可以將此值設置為0 ,並且在 cronjob 執行后不會保存任何內容。

相同的邏輯有.spec.failedJobsHistoryLimit字段,默認為1

請參閱作業歷史限制


這是我從 cronjob 獲取事件時的樣子:

$ kubectl describe cronjob test-cronjob
...
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  2m31s  cronjob-controller  Created job test-cronjob-27304493
  Normal  SawCompletedJob   2m30s  cronjob-controller  Saw completed job: test-cronjob-27304493, status: Complete
  Normal  SuccessfulCreate  91s    cronjob-controller  Created job test-cronjob-27304494
  Normal  SawCompletedJob   90s    cronjob-controller  Saw completed job: test-cronjob-27304494, status: Complete
  Normal  SuccessfulDelete  90s    cronjob-controller  Deleted job test-cronjob-27304493
  Normal  SuccessfulCreate  31s    cronjob-controller  Created job test-cronjob-27304495
  Normal  SawCompletedJob   30s    cronjob-controller  Saw completed job: test-cronjob-27304495, status: Complete
  Normal  SuccessfulDelete  30s    cronjob-controller  Deleted job test-cronjob-27304494

僅提供最后一項工作:

$ kubectl get jobs
NAME                    COMPLETIONS   DURATION   AGE
test-cronjob-27304496   1/1           1s         3s

還有一個吊艙:

$ kubectl get pods
NAME                               READY   STATUS      RESTARTS   AGE
test-cronjob-27304496-r4qd8        0/1     Completed   0          38s

您可以嘗試設置ttlSecondsAfterFinished ,以了解更多嘗試:

kubectl explain cronjob.spec.jobTemplate.spec.ttlSecondsAfterFinished --api-version=batch/v1beta1

ttlSecondsAfterFinished 限制已完成執行(完成或失敗)的作業的生命周期。 如果設置了這個字段,在 Job 完成后 ttlSecondsAfterFinished ,它就有資格被自動刪除。 當作業被刪除時,它的生命周期保證(例如終結器)將被兌現。 如果未設置此字段,則作業不會被自動刪除。 如果此字段設置為零,則作業在完成后即可立即刪除。 此字段是 alpha 級別的,僅由啟用 TTLAfterFinished 功能的服務器使用。

很快,由CronJob創建的Job將在指定秒后被刪除。


在你的情況下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: postgres-backup
spec:
  # Backup the database every day at 2AM
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          ttlSecondsAfterFinished: 60 # after 1 minute the and the pods will be deleted by kubernetes
...

有兩種方法可以解決此問題

第一種方法,使用工作規范

將 Job 的.spec.activeDeadlineSeconds字段添加到秒數。 activeDeadlineSeconds 適用於作業的持續時間

一旦 Job 達到 activeDeadlineSeconds,其所有正在運行的 Pod 都將終止,並且 Job 狀態將變為 type: Failed with reason: DeadlineExceeded。

將 activeDeadlineSeconds 設置為比預期運行時間長得多

第二種方法,使用 pod

制作 pod,使其在作業完成時自行終止。 類似於將命令更改為

pg_dump -Fc -d postgresql://$DBUSER:$DBPASS@$DBHOST:$DBPORT/$DBNAME > /var/backups/backup_$(date +"%d-%m-%Y_%H-%M").bak; exit

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM