在 Openshift 上的应用程序内运行 cron 作业的最佳实践?

Alv*_*123 3 cron openshift

我想对 Openshift 中部署的 postgres 数据库进行简单备份。运行 cron 作业的最佳实践是什么?由于 systemd 在容器上不可用并且只能通过黑客启用,所以我宁愿使用“更干净”的方法。除了 cronie 或 systemd 计时器单元之外,还有哪些选择?似乎可以在早期的Openshift 版本中启用 cron,但是 Openshift v4.x 不再支持此功能,并且文档仅提到 Kubernetes Cron Jobs 对象。

小智 6

这是我使用的:

  • 具有相同映像的专用 Pod(确保数据库转储客户端可用)和用于安装备份的 PVC
  • 带有备份脚本的 ConfigMap
  • Cronjob 频繁运行该 pod

以下是一些清单示例:

PVC:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: database-bkp
      namespace: database
        annotations:
        volume.beta.kubernetes.io/storage-class: "storage-class-name"
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
Run Code Online (Sandbox Code Playgroud)

厘米:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: psqldump
      namespace: database
      labels:
        job-name: db-backup
    data:
      psqldump.sh: |
        #!/bin/bash
        DBS=$(psql -xl |awk /^Name/'{print $NF}')
        for DB in ${DBS}; do
          SCHEMAS=$(psql -d ${DB} -xc "\dn" |awk /^Name/'{print $NF}')
          for SCHEMA in ${SCHEMAS}; do
            echo "Dumping database '${DB}' from Schema '${SCHEMA}' into ${BACKUPDIR}/${PGHOST}_${SCHEMA}_${DB}_${ENVMNT}_$(date -I).sql"
            pg_dump -n "${SCHEMA}" ${DB} > ${BACKUPDIR}/${PGHOST}_${SCHEMA}_${DB}_${ENVMNT}_$(date -I).sql
          done
        done
        echo "Deleting dumps older than ${RETENTION} days"
        find ${BACKUPDIR} -name "*.sql" -mtime +${RETENTION} -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

计划任务:

    apiVersion: v1
    kind: Template
    metadata:
      name: postgres-backup
      namespace: database
    objects:
    - kind: CronJob
      apiVersion: batch/v1beta1
      metadata:
        name: postgres-backup
        namespace: database
      spec:
        schedule: "0 3 * * *"
        successfulJobsHistoryLimit: 1
        jobTemplate:
          spec:
            template:
              metadata:
                namespace: database
              spec:
                containers:
                - name: postgres-dbbackup
                  image: "postgres:11"
                  env:
                  - name: PGHOST
                    value: "${_PGHOST}"
                  - name: PGUSER
                    value: "${_PGUSER}"
                  - name: RETENTION
                    value: "${_RETENTION}"
                  - name: BACKUPDIR
                    value: "${_BACKUPDIR}"
                  command: ["/bin/bash", "-c", "/usr/local/bin/psqldump.sh"]
                  volumeMounts:
                  - mountPath: /usr/local/bin
                    name: psqldump-volume
                  - mountPath: /backup
                    name: backup-volume
                volumes:
                  - name: psqldump-volume
                    configMap:
                      name: psqldump
                      defaultMode: 0755
                  - name: backup-volume
                    persistentVolumeClaim:
                      claimName: database-bkp
                restartPolicy: Never
    parameters:
      - name: _PGHOST
        value: postgres
      - name: _PGUSER
        value: postgres
      - name: _RETENTION
        value: "30"
      - name: _BACKUPDIR
        value: "/backup"
Run Code Online (Sandbox Code Playgroud)

PGHOST 是您的数据库的 pod 名称。如果您有用于备份的专用用户和密码,请相应地导出环境变量 PGUSER 和 PGPASS