как создать только один Pod для/с помощью Cronjob
Я запускаю эту Cronjob в 2 часа ночи:
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/Job?
3 ответа
Если необходимо сохранить только последнее задание и модуль, вы можете использовать
.spec.successfulJobsHistoryLimit
поле установлено в .
Таким образом, будет сохранена только последняя работа и соответствующий модуль. По умолчанию установлено значение
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
Вы можете попробовать установить , чтобы узнать больше, попробуйте:
kubectl explain cronjob.spec.jobTemplate.spec.ttlSecondsAfterFinished --api-version=batch/v1beta1
ttlSecondsAfterFinished ограничивает время существования задания, которое завершило выполнение (либо завершено, либо не выполнено). Если это поле установлено, ttlSecondsAfterFinished после завершения задания может быть автоматически удалено. Когда задание удаляется, его гарантии жизненного цикла (например, финализаторы) будут соблюдены. Если это поле не установлено, задание не будет автоматически удалено. Если в этом поле установлено нулевое значение, задание становится доступным для удаления сразу после его завершения. Это поле имеет альфа-уровень и учитывается только серверами, на которых включена функция TTLAfterFinished.
Короче говоря,
Job
сделано
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:
ttlSecondsAfterFinished: 60 # after 1 minute the job and the pods will be deleted by kubernetes
...
Обратите внимание, что
ttlSecondsAfterFinished
будет применяться, если задание было успешно завершено.
Есть два способа это исправить
Первый способ, со спецификацией работы
добавить
.spec.activeDeadlineSeconds
поле задания на количество секунд. ActiveDeadlineSeconds применяется к продолжительности задания.
Как только задание достигает activeDeadlineSeconds, все его запущенные поды прекращаются, а статус задания становится следующим: Сбой по причине: DeadlineExceeded.
Установите для параметра activeDeadlineSeconds значение, намного превышающее ожидаемое время выполнения.
Второй способ, с подушкой
сделать модуль так, чтобы он завершал работу после завершения задания. Что-то вроде изменения команды на
pg_dump -Fc -d postgresql://$DBUSER:$DBPASS@$DBHOST:$DBPORT/$DBNAME > /var/backups/backup_$(date +"%d-%m-%Y_%H-%M").bak; exit