This commit is contained in:
203
templates/cronjob.yaml
Normal file
203
templates/cronjob.yaml
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
{{- if .Values.backup.enabled }}
|
||||||
|
apiVersion: batch/v1
|
||||||
|
kind: CronJob
|
||||||
|
metadata:
|
||||||
|
name: {{ include "phpmyadmin-nginx.fullname" . }}-backup
|
||||||
|
labels:
|
||||||
|
{{- include "phpmyadmin-nginx.labels" . | nindent 4 }}
|
||||||
|
app.kubernetes.io/component: backup
|
||||||
|
spec:
|
||||||
|
schedule: {{ .Values.backup.schedule | quote }}
|
||||||
|
successfulJobsHistoryLimit: {{ .Values.backup.successfulJobsHistoryLimit }}
|
||||||
|
failedJobsHistoryLimit: {{ .Values.backup.failedJobsHistoryLimit }}
|
||||||
|
concurrencyPolicy: {{ .Values.backup.concurrencyPolicy }}
|
||||||
|
suspend: {{ .Values.backup.suspend }}
|
||||||
|
jobTemplate:
|
||||||
|
spec:
|
||||||
|
backoffLimit: {{ .Values.backup.backoffLimit }}
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
{{- include "phpmyadmin-nginx.selectorLabels" . | nindent 12 }}
|
||||||
|
app.kubernetes.io/component: backup
|
||||||
|
{{- with .Values.backup.podAnnotations }}
|
||||||
|
annotations:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
spec:
|
||||||
|
restartPolicy: OnFailure
|
||||||
|
{{- with .Values.imagePullSecrets }}
|
||||||
|
imagePullSecrets:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
serviceAccountName: {{ include "phpmyadmin-nginx.serviceAccountName" . }}
|
||||||
|
securityContext:
|
||||||
|
fsGroup: 999
|
||||||
|
runAsNonRoot: true
|
||||||
|
seccompProfile:
|
||||||
|
type: RuntimeDefault
|
||||||
|
containers:
|
||||||
|
- name: mysql-backup
|
||||||
|
image: "{{ .Values.backup.image.registry }}/{{ .Values.backup.image.repository }}:{{ .Values.backup.image.tag }}"
|
||||||
|
imagePullPolicy: {{ .Values.backup.image.pullPolicy }}
|
||||||
|
securityContext:
|
||||||
|
allowPrivilegeEscalation: false
|
||||||
|
capabilities:
|
||||||
|
drop:
|
||||||
|
- ALL
|
||||||
|
readOnlyRootFilesystem: true
|
||||||
|
runAsNonRoot: true
|
||||||
|
runAsUser: 999
|
||||||
|
env:
|
||||||
|
- name: MYSQL_HOST
|
||||||
|
value: {{ .Values.backup.mysql.host | quote }}
|
||||||
|
- name: MYSQL_PORT
|
||||||
|
value: {{ .Values.backup.mysql.port | quote }}
|
||||||
|
- name: MYSQL_USER
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.backup.mysql.existingSecret | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }}
|
||||||
|
key: {{ .Values.backup.mysql.userKey | default "mysql-user" }}
|
||||||
|
- name: MYSQL_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Values.backup.mysql.existingSecret | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }}
|
||||||
|
key: {{ .Values.backup.mysql.passwordKey | default "mysql-password" }}
|
||||||
|
- name: BACKUP_TIMESTAMP
|
||||||
|
value: $(date +%Y%m%d_%H%M%S)
|
||||||
|
{{- if .Values.backup.databases }}
|
||||||
|
- name: DATABASES
|
||||||
|
value: {{ join " " .Values.backup.databases | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.backup.compression.enabled }}
|
||||||
|
- name: COMPRESSION_ENABLED
|
||||||
|
value: "true"
|
||||||
|
- name: COMPRESSION_LEVEL
|
||||||
|
value: {{ .Values.backup.compression.level | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if .Values.backup.retention.enabled }}
|
||||||
|
- name: RETENTION_DAYS
|
||||||
|
value: {{ .Values.backup.retention.days | quote }}
|
||||||
|
{{- end }}
|
||||||
|
command:
|
||||||
|
- /bin/bash
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
BACKUP_DIR="{{ .Values.backup.destinationPath }}"
|
||||||
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||||
|
DATE_DIR=$(date +%Y%m%d)
|
||||||
|
|
||||||
|
echo "=== MySQL Backup Started at $(date) ==="
|
||||||
|
echo "Backup destination: ${BACKUP_DIR}/${DATE_DIR}"
|
||||||
|
|
||||||
|
# Create backup directory
|
||||||
|
mkdir -p "${BACKUP_DIR}/${DATE_DIR}"
|
||||||
|
|
||||||
|
# Function to backup a database
|
||||||
|
backup_database() {
|
||||||
|
local db=$1
|
||||||
|
local backup_file="${BACKUP_DIR}/${DATE_DIR}/${db}_${TIMESTAMP}.sql"
|
||||||
|
|
||||||
|
echo "Backing up database: ${db}"
|
||||||
|
|
||||||
|
mysqldump \
|
||||||
|
-h "${MYSQL_HOST}" \
|
||||||
|
-P "${MYSQL_PORT}" \
|
||||||
|
-u "${MYSQL_USER}" \
|
||||||
|
-p"${MYSQL_PASSWORD}" \
|
||||||
|
--single-transaction \
|
||||||
|
--quick \
|
||||||
|
--lock-tables=false \
|
||||||
|
--routines \
|
||||||
|
--triggers \
|
||||||
|
--events \
|
||||||
|
"${db}" > "${backup_file}"
|
||||||
|
|
||||||
|
{{- if .Values.backup.compression.enabled }}
|
||||||
|
echo "Compressing backup: ${db}"
|
||||||
|
gzip -{{ .Values.backup.compression.level }} "${backup_file}"
|
||||||
|
backup_file="${backup_file}.gz"
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
# Verify backup file
|
||||||
|
if [ -f "${backup_file}" ]; then
|
||||||
|
size=$(du -h "${backup_file}" | cut -f1)
|
||||||
|
echo "✓ Backup completed: ${backup_file} (${size})"
|
||||||
|
else
|
||||||
|
echo "✗ Backup failed: ${backup_file}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Backup specified databases or all databases
|
||||||
|
{{- if .Values.backup.databases }}
|
||||||
|
for db in ${DATABASES}; do
|
||||||
|
backup_database "${db}" || echo "Warning: Failed to backup ${db}"
|
||||||
|
done
|
||||||
|
{{- else }}
|
||||||
|
# Get all databases except system databases
|
||||||
|
DATABASES=$(mysql \
|
||||||
|
-h "${MYSQL_HOST}" \
|
||||||
|
-P "${MYSQL_PORT}" \
|
||||||
|
-u "${MYSQL_USER}" \
|
||||||
|
-p"${MYSQL_PASSWORD}" \
|
||||||
|
-N -B -e "SHOW DATABASES" | \
|
||||||
|
grep -Ev '^(information_schema|performance_schema|mysql|sys)$')
|
||||||
|
|
||||||
|
for db in ${DATABASES}; do
|
||||||
|
backup_database "${db}" || echo "Warning: Failed to backup ${db}"
|
||||||
|
done
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
{{- if .Values.backup.retention.enabled }}
|
||||||
|
# Cleanup old backups
|
||||||
|
echo "Cleaning up backups older than {{ .Values.backup.retention.days }} days"
|
||||||
|
find "${BACKUP_DIR}" -type f -name "*.sql*" -mtime +{{ .Values.backup.retention.days }} -delete
|
||||||
|
find "${BACKUP_DIR}" -type d -empty -delete
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo "=== Backup Summary ==="
|
||||||
|
echo "Total backup size:"
|
||||||
|
du -sh "${BACKUP_DIR}/${DATE_DIR}"
|
||||||
|
echo "Backup files:"
|
||||||
|
ls -lh "${BACKUP_DIR}/${DATE_DIR}"
|
||||||
|
|
||||||
|
echo "=== MySQL Backup Completed at $(date) ==="
|
||||||
|
resources:
|
||||||
|
{{- toYaml .Values.backup.resources | nindent 14 }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: backup-storage
|
||||||
|
mountPath: {{ .Values.backup.destinationPath }}
|
||||||
|
- name: tmp
|
||||||
|
mountPath: /tmp
|
||||||
|
volumes:
|
||||||
|
- name: backup-storage
|
||||||
|
{{- if .Values.backup.nfs.enabled }}
|
||||||
|
nfs:
|
||||||
|
server: {{ .Values.backup.nfs.server }}
|
||||||
|
path: {{ .Values.backup.nfs.path }}
|
||||||
|
{{- if .Values.backup.nfs.readOnly }}
|
||||||
|
readOnly: false
|
||||||
|
{{- end }}
|
||||||
|
{{- else }}
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ .Values.backup.existingClaim | default (printf "%s-backup" (include "phpmyadmin-nginx.fullname" .)) }}
|
||||||
|
{{- end }}
|
||||||
|
- name: tmp
|
||||||
|
emptyDir: {}
|
||||||
|
{{- with .Values.backup.nodeSelector }}
|
||||||
|
nodeSelector:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.backup.affinity }}
|
||||||
|
affinity:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- with .Values.backup.tolerations }}
|
||||||
|
tolerations:
|
||||||
|
{{- toYaml . | nindent 12 }}
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
Reference in New Issue
Block a user