как создать только один 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
Другие вопросы по тегам