[英]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:
有沒有辦法清理以前(舊)創建的 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.