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)
-
Cieľ / Problém na vyriešenie: Pravidelne exportovať databázu MySQL do NFS zdieľaného úložiska s rotáciou dumpov.
-
Použité technológie a nástroje: Kubernetes CronJob, MySQL client image, Secret s DB prístupmi, NFS PV/PVC.
-
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.
- 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 -fvolumes:
- name: backup persistentVolumeClaim: claimName: nfs-backup-pvc `
- 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ť
fsGroupv pod špecifikácii). - Problém: Dlhé locky pri dumpovaní.
Riešenie: Použiť
--single-transaction --quick --lock-tables=falsepre InnoDB.
- Finálny výsledok / Záver:
Denné dumpy MySQL sú ukladané na NFS s jednoduchou rotáciou; obnova je možná priamo z
.sql.gzsúborov.