[英]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.