oracle-backup · 集群外 Oracle 主机的备份拉取与 NAS 异地镜像
oracle-backup 命名空间里跑两个定时备份任务:oracle-backup-pull 把集群外那台 Oracle Cloud 主机(opc@129.150.55.22)上各服务的 GPG 加密备份拉进集群内 MinIO 的 oracle-backups 桶,nas-backup-sync 再把 MinIO 里的备份桶每日镜像一份到 Synology NAS,给备份一个硬件独立的第二副本。
这两个任务都不部署长驻服务,而是用临时的 alpine 容器在运行时装好 openssh-client 和 rclone 完成一次性搬运。所有备份在 Oracle 主机上完成 dump 与 GPG 加密,集群侧只接触密文,加密口令永不离开 Oracle 主机。
部署形态
- Name
- 命名空间
- Description
- oracle-backup(由 namespace.yaml 创建)
- Name
- 工作负载类型
- Description
- 两个 CronJob,无长驻 Deployment/StatefulSet
- Name
- 镜像
- Description
- alpine:3.24(运行时 apk add openssh-client rclone)
- Name
- oracle-backup-pull 调度
- Description
- 30 4 * * *(每晚 04:30 UTC),concurrencyPolicy: Forbid,activeDeadlineSeconds 1800,backoffLimit 1,restartPolicy Never
- Name
- nas-backup-sync 调度
- Description
- 30 5 * * *(每日 05:30 UTC,在夜间备份落地之后),concurrencyPolicy: Forbid,activeDeadlineSeconds 3600,backoffLimit 1,restartPolicy Never
- Name
- 历史保留
- Description
- 两者均 successfulJobsHistoryLimit 3 / failedJobsHistoryLimit 3
- Name
- 资源
- Description
- pull:requests 50m/64Mi,limits 500m/256Mi;sync:requests 50m/64Mi,limits 1 CPU/256Mi
oracle-backup-pull 通过 SSH 强制命令(forced-command)逐个组件调用 Oracle 主机上的 /home/opc/scripts/oracle-backup-stream.sh <component>,把返回的密文用 rclone rcat 写入 m:oracle-backups/oracle/<comp>/<comp>-<TS>.tar.gz.gpg。拉取的组件清单:postgres、mysql、vault、bitwarden、obsidian、n8n、qinglong、uptimekuma、consul、emqx、waline、domainadmin、onenav。每个组件落盘小于 100 字节会被判失败,全部成功(fail=0)Job 才算成功。
nas-backup-sync 用 rclone sync 把以下四个桶镜像到 NAS(SFTP,host 192.168.88.88,user xiaomo)的 /yldm-backup/minio/<bucket> 下:oracle-backups、k3s-etcd-snapshots、velero-backups、database-backups。同样要求全部桶成功才算 Job 成功。
配置与依赖
凭据全部由 ExternalSecret 从 Vault(ClusterSecretStore vault-backend)拉取,refreshInterval 1h,target creationPolicy Owner。
| Secret | remoteRef.key | 字段 |
|---|---|---|
| oracle-backup-creds | yldm/backup/oracle-backup-creds | ssh-key、minio-access、minio-secret |
| nas-sync-creds | yldm/backup/nas-sync-creds | nas-ssh-key、minio-access、minio-secret |
oracle-backup-creds 提供拉取 Oracle 主机的 SSH 私钥(对应主机侧的 forced-command key)和一个读写 oracle-backups 桶的 MinIO 用户;nas-sync-creds 提供 Synology NAS 的 SSH 私钥和一个对备份桶只读的 MinIO 用户。
两个任务都把 MinIO 配成 rclone 的 s3/Minio backend,endpoint 指向集群内部 http://minio.minio.svc.cluster.local:9000,以绕开 Cloudflare 前置端点对 S3 签名的改写。依赖项:集群内 MinIO(S3 端点与备份桶)、Vault(凭据来源)、外部的 Oracle Cloud 主机(129.150.55.22,SSH)和 Synology NAS(192.168.88.88,SFTP)。
访问与监控
这两个 CronJob 不暴露任何 Service / Ingress,也没有 ServiceMonitor、PrometheusRule、HPA、VPA、PDB —— kustomization 只纳管 namespace、两个 cronjob 和 externalsecrets。运行结果靠 Job 自身的退出码与日志反映:pull 任务末尾打印 === summary ok=$ok fail=$fail ===,sync 任务打印 === done fail=$fail ===,任一组件/桶失败都会让 Job 以非零退出并记入 failedJobsHistoryLimit。
nas-backup-sync 特意放在 oracle-backup 命名空间内运行,以复用该命名空间已有的访问 MinIO 的 NetworkPolicy。
注意事项
/home/opc/.config/vaultwarden-backup/passphrase,break-glass 副本在 Vault secret/yldm/backup/oracle-gpg-passphrase)。主机侧脚本与 SSH 配置部署在 Oracle 主机上,不由 ArgoCD 管理,只在仓库 host/ 目录留存以便复现。脚本 oracle-backup-stream.sh 安装在 /home/opc/scripts/oracle-backup-stream.sh(mode 750),按组件分别处理:postgres/mysql/consul 走容器内 dump(pg_dumpall、mysqldump --single-transaction、consul snapshot save),其余组件直接 tar 数据目录;tar 对 live-written 存储的 "file changed as we read it"(退出码 1)做了容忍,但仍会在真实错误(退出码 2+)时失败。
集群公钥写在 opc 的 authorized_keys 里并被 forced-command 限制为只能运行该脚本(no-pty、no-port-forwarding 等),对应私钥即 Vault 中的 oracle-backup-creds.ssh-key。oracle-backup-creds、nas-sync-creds 这些 Secret 标注为 out-of-band / 不在 git 中的写入对象,由 ExternalSecret 从 Vault 物化到命名空间。
返回 infrastructure 总览