Automatická záloha MySQL z K3s do NFS (CronJob)

Vytvorené: 25. 8. 2025 20:04 Aktualizované: 27. 8. 2025 13:14
Vyriešené
Obsah článku

title: "Automatická záloha MySQL z K3s do NFS (CronJob)"
slug: "k3s-mysql-backup-cronjob-nfs"
technologies: ["K3s", "Kubernetes", "MySQL", "CronJob", "NFS"]
tags: ["backup", "mysql", "cronjob", "nfs", "pvc", "security"]
date_solved: "2025-08-24"

Projekt/Téma: Automatická záloha MySQL z K3s do NFS (CronJob)

  1. Cieľ / Problém na vyriešenie: Pravidelne exportovať databázu MySQL do NFS zdieľaného úložiska s rotáciou dumpov.

  2. Použité technológie a nástroje: Kubernetes CronJob, MySQL client image, Secret s DB prístupmi, NFS PV/PVC.

  3. Kľúčové postupy a konfiguračné kroky:

  • Definovať NFS PV/PVC s mountom na backup share.
  • Vytvoriť Secret s DB prístupmi.
  • CronJob spúšťajúci mysqldump, kompresiu a rotáciu.
  1. Výsledné kódy a skripty:

`

PV/PVC (uprav server/path/size)

apiVersion: v1 kind: PersistentVolume metadata: name: nfs-backup-pv spec: capacity: { storage: 200Gi } accessModes: ["ReadWriteMany"] nfs: server: 10.0.0.10 path: /export/backups

---

apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-backup-pvc namespace: default spec: accessModes: ["ReadWriteMany"] resources: requests: { storage: 200Gi } volumeName: nfs-backup-pv

---

DB Secret

apiVersion: v1 kind: Secret metadata: name: mysql-backup-secret namespace: default type: Opaque stringData: MYSQL_HOST: "mysql.default.svc.cluster.local" MYSQL_PORT: "3306" MYSQL_USER: "backup" MYSQL_PASSWORD: "changeme" MYSQL_DATABASE: "appdb"

---

CronJob

apiVersion: batch/v1 kind: CronJob metadata: name: mysql-backup namespace: default spec: schedule: "0 2 *" # denne 02:00 successfulJobsHistoryLimit: 3 failedJobsHistoryLimit: 3 jobTemplate: spec: template: spec: restartPolicy: OnFailure containers:

  • name: mysqldump image: mysql:8 envFrom:
    • secretRef: name: mysql-backup-secret volumeMounts:
    • name: backup mountPath: /backup command: ["/bin/sh","-c"] args:
    • | set -e TS=$(date +%F_%H-%M-%S) FILE="/backup/${MYSQLDATABASE}${TS}.sql.gz" mysqldump -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" --databases "$MYSQL_DATABASE" --single-transaction --quick --lock-tables=false | gzip -9 > "$FILE"

      rotácia: ponechaj 14 najnovších dumpov

        ls -1t /backup/${MYSQL_DATABASE}_*.sql.gz | tail -n +15 | xargs -r rm -f

      volumes:

  • name: backup persistentVolumeClaim: claimName: nfs-backup-pvc `
  1. Zistené problémy a riešenia (Gotchas):
  • Problém: Permission denied na NFS share. Riešenie: Uistiť sa, že NFS export povoľuje RW pre klientov a uid/gid sedí (alebo použiť fsGroup v pod špecifikácii).
  • Problém: Dlhé locky pri dumpovaní. Riešenie: Použiť --single-transaction --quick --lock-tables=false pre InnoDB.
  1. Finálny výsledok / Záver: Denné dumpy MySQL sú ukladané na NFS s jednoduchou rotáciou; obnova je možná priamo z .sql.gz súborov.
Vyriešené: 24. 8. 2025