Skip to content

Commit eebee30

Browse files
committed
examples
first version for backup script, but DO NOT USE IT , because database backup not working
1 parent 0e5f2de commit eebee30

File tree

1 file changed

+290
-0
lines changed

1 file changed

+290
-0
lines changed
Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
# WSC Backup Cronjob with Shell-Script
2+
# using: Toolbox Image from https://github.com/Tob1as/docker-tools
3+
# Requirements: kubectl, jq, tar, gzip, mariadb-client/mysql-client
4+
5+
6+
# DO NOT USE - DATABASE BACKUP is NOT ready !!!!!!!!!!!!!
7+
8+
9+
# DO NOT USE - DATABASE BACKUP is NOT ready !!!!!!!!!!!!!
10+
11+
12+
# DO NOT USE - DATABASE BACKUP is NOT ready !!!!!!!!!!!!!
13+
14+
---
15+
16+
apiVersion: v1
17+
kind: ServiceAccount
18+
metadata:
19+
name: backup
20+
namespace: wsc
21+
#imagePullSecrets:
22+
# - name: regcred-dhi
23+
# - name: regcred-dockerhub
24+
25+
---
26+
27+
apiVersion: rbac.authorization.k8s.io/v1
28+
kind: Role
29+
metadata:
30+
name: backup
31+
namespace: wsc
32+
rules:
33+
- apiGroups: ["apps"]
34+
resources: ["deployments"]
35+
verbs: ["get", "list"]
36+
- apiGroups: [""]
37+
resources: ["pods"]
38+
verbs: ["get", "list"]
39+
- apiGroups: [""]
40+
resources: ["pods/exec"]
41+
verbs: ["create"]
42+
- apiGroups: [""]
43+
resources: ["services"]
44+
verbs: ["get", "list"]
45+
46+
---
47+
48+
apiVersion: rbac.authorization.k8s.io/v1
49+
kind: RoleBinding
50+
metadata:
51+
name: backup
52+
namespace: wsc
53+
subjects:
54+
- kind: ServiceAccount
55+
name: backup
56+
namespace: wsc
57+
roleRef:
58+
kind: Role
59+
name: backup
60+
apiGroup: rbac.authorization.k8s.io
61+
62+
---
63+
64+
---
65+
66+
apiVersion: v1
67+
kind: PersistentVolumeClaim
68+
metadata:
69+
name: wsc-backup-data
70+
namespace: wsc
71+
labels:
72+
app.kubernetes.io/name: wsc-backup
73+
app.kubernetes.io/component: cronjob
74+
app.kubernetes.io/part-of: wsc
75+
spec:
76+
accessModes:
77+
- ReadWriteOnce
78+
volumeMode: Filesystem
79+
storageClassName: local-path # set to your class
80+
resources:
81+
requests:
82+
storage: 20Gi
83+
84+
---
85+
86+
apiVersion: batch/v1
87+
kind: CronJob
88+
metadata:
89+
name: wsc-backup
90+
namespace: wsc
91+
labels:
92+
app.kubernetes.io/name: wsc-backup
93+
app.kubernetes.io/component: cronjob
94+
app.kubernetes.io/part-of: wsc
95+
spec:
96+
suspend: true # set true for disable cronjob
97+
schedule: "0 4 * * 0-6" # Mon-Sun at 4am UTC
98+
concurrencyPolicy: "Forbid"
99+
successfulJobsHistoryLimit: 3
100+
failedJobsHistoryLimit: 1
101+
startingDeadlineSeconds: 120
102+
jobTemplate:
103+
metadata:
104+
labels:
105+
app.kubernetes.io/name: wsc-backup
106+
app.kubernetes.io/component: cronjob
107+
app.kubernetes.io/part-of: wsc
108+
spec:
109+
template:
110+
spec:
111+
serviceAccountName: backup
112+
imagePullSecrets:
113+
- name: regcred-dockerhub
114+
restartPolicy: OnFailure
115+
securityContext:
116+
runAsUser: 65534
117+
runAsGroup: 65534
118+
fsGroup: 65534
119+
containers:
120+
- name: backup
121+
image: docker.io/tobi312/tools:toolbox-extended
122+
imagePullPolicy: Always
123+
command:
124+
#- /bin/sh
125+
#- -c
126+
- /usr/local/bin/backup-script.sh
127+
args:
128+
- /bin/sh
129+
- -c
130+
- "sleep 5; exit 0"
131+
envFrom:
132+
- configMapRef:
133+
name: wsc-backup-env-config
134+
optional: true
135+
- secretRef:
136+
name: wsc-backup-env-secret
137+
optional: true
138+
env:
139+
- name: TZ
140+
value: "Europe/Berlin"
141+
- name: NAMESPACE
142+
valueFrom:
143+
fieldRef:
144+
fieldPath: metadata.namespace
145+
# Script need config/secrets from wsc-db
146+
- name: DB_DATABASE
147+
valueFrom:
148+
configMapKeyRef:
149+
name: wsc-db-env-config
150+
key: MYSQL_DATABASE
151+
- name: DB_USERNAME
152+
valueFrom:
153+
configMapKeyRef:
154+
name: wsc-db-env-config
155+
key: MYSQL_USER
156+
- name: DB_PASSWORD
157+
valueFrom:
158+
secretKeyRef:
159+
name: wsc-db-env-secret
160+
key: MYSQL_PASSWORD
161+
resources:
162+
requests:
163+
memory: "128Mi"
164+
cpu: "0.1"
165+
limits:
166+
memory: "256Mi"
167+
cpu: "0.5"
168+
volumeMounts:
169+
- name: backup-script
170+
subPath: backup-script.sh
171+
mountPath: /usr/local/bin/backup-script.sh
172+
readOnly: true
173+
- name: backups
174+
mountPath: /backups
175+
volumes:
176+
- name: backup-script
177+
configMap:
178+
name: wsc-backup-file-script
179+
defaultMode: 0555
180+
- name: backups
181+
#emptyDir: {}
182+
persistentVolumeClaim:
183+
claimName: wsc-backup-data
184+
185+
---
186+
187+
apiVersion: v1
188+
kind: ConfigMap
189+
metadata:
190+
name: wsc-backup-file-script
191+
namespace: wsc
192+
labels:
193+
app.kubernetes.io/name: wsc-backup
194+
app.kubernetes.io/component: cronjob
195+
app.kubernetes.io/part-of: wsc
196+
data:
197+
backup-script.sh: |-
198+
#!/bin/sh
199+
200+
# Requirements: kubectl, jq, tar, gzip, mariadb-client (mysql-client)
201+
202+
set -eu
203+
204+
# Variables (change Values)
205+
206+
# BASE
207+
: "${TZ:="Europe/Berlin"}" # timezone, default: "Europe/Berlin"
208+
: "${BACKUP_PATH_LOCAL:="/backups"}" # local backup path, default: "/backups"
209+
# Kubernetes
210+
: "${CONTEXT:=""}" # context, only for local debug, set then to "--context <clustername>"
211+
: "${NAMESPACE:="wsc"}" # namespace, example: "wsc"
212+
: "${WEB_DEPLOYMENT_NAME:="wsc-web"}" # name of Webserver deployment from WSC
213+
: "${DB_DEPLOYMENT_NAME:="wsc-db"}" # name of Databaserver deployment from WSC
214+
# Database
215+
: "${DB_HOST:="wsc-db"}" # DB Host, example: "wsc-db"
216+
: "${DB_PORT:="3306"}" # DB Port, default: "3306"
217+
: "${DB_USERNAME:="woltlab_suite"}" # DB User, default: "woltlab_suite"
218+
: "${DB_PASSWORD:=""}" # DB Passwort
219+
: "${DB_DATABASE:="woltlab_suite"}" # DB Database, default: "woltlab_suite"
220+
# Webserver / Files
221+
: "${WEB_CONTAINER_HELPER_NAME:="helper"}" # WEB Container Helper Name (with shell and tar/gzip and access to webfolder)
222+
: "${WEB_CONTAINER_HELPER_BACKUP_PATH:="/data"}" # WEB Container Helper Backup Path
223+
224+
# -----------------------------------------------------
225+
226+
# No changes from here on!
227+
228+
# Date for backup file
229+
BACKUP_DATE=$(date '+%Y%m%d-%H%M')
230+
#echo ">> BACKUP_DATE=${BACKUP_DATE}"
231+
232+
# create backup folder if not exists
233+
if [ ! -d "${BACKUP_PATH_LOCAL}" ]; then
234+
mkdir -p ${BACKUP_PATH_LOCAL}
235+
fi
236+
237+
# -----------------------------------------------------
238+
239+
# get namespace
240+
NAMESPACE=${NAMESPACE:-$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)}
241+
242+
# get Pod Labels from Deployment
243+
DB_LABEL_SELECTOR=$(kubectl ${CONTEXT} -n ${NAMESPACE} get deployment ${DB_DEPLOYMENT_NAME} -o json | jq -r '.spec.selector.matchLabels | to_entries | map("\(.key)=\(.value)") | join(",")')
244+
WEB_LABEL_SELECTOR=$(kubectl ${CONTEXT} -n ${NAMESPACE} get deployment ${WEB_DEPLOYMENT_NAME} -o json | jq -r '.spec.selector.matchLabels | to_entries | map("\(.key)=\(.value)") | join(",")')
245+
246+
# get Pod Name (using Labels)
247+
DB_POD_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get pod -l "${DB_LABEL_SELECTOR}" -o jsonpath="{.items[0].metadata.name}")
248+
WEB_POD_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get pod -l "${WEB_LABEL_SELECTOR}" -o jsonpath="{.items[0].metadata.name}")
249+
echo ">> set WSC Pods to ${DB_POD_NAME} and ${WEB_POD_NAME}"
250+
251+
# get (first) Containername from Pod
252+
DB_CONTAINER_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get pod ${DB_POD_NAME} -o jsonpath="{.spec.containers[0].name}")
253+
#WEB_CONTAINER_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get pod ${WEB_POD_NAME} -o jsonpath="{.spec.containers[0].name}")
254+
255+
# get Service Name (using Labels)
256+
DB_SERVICE_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get service -l "${DB_LABEL_SELECTOR}" -o jsonpath="{.items[0].metadata.name}")
257+
#WEB_SERVICE_NAME=$(kubectl ${CONTEXT} -n ${NAMESPACE} get service -l "${WEB_LABEL_SELECTOR}" -o jsonpath="{.items[0].metadata.name}")
258+
259+
# set vars if empty
260+
DB_HOST=${DB_HOST:-$DB_SERVICE_NAME}
261+
DB_PORT=${DB_PORT:-$(kubectl ${CONTEXT} -n ${NAMESPACE} get service -l "${DB_LABEL_SELECTOR}" -o jsonpath="{.items[0].spec.ports[0].port}")}
262+
263+
# BACKUPS
264+
echo ">> Backup process is started ..."
265+
if [ -n "$DB_DEPLOYMENT_NAME" -a -n "$DB_HOST" -a -n "$DB_PORT" -a -n "$DB_USERNAME" -a -n "$DB_PASSWORD" -a -n "$DB_DATABASE" ]; then
266+
echo ">> Database Backup process is started ..."
267+
DB_DUMP_OPTIONS="--skip-ssl-verify-server-cert" # --skip-ssl
268+
mariadb-dump --host=${DB_HOST} --port=${DB_PORT} --user=${DB_USERNAME} --password=${DB_PASSWORD} ${DB_DUMP_OPTIONS} --databases ${DB_DATABASE} | gzip -9 > ${BACKUP_PATH_LOCAL}/wsc_backup_${BACKUP_DATE}_db.sql.gz
269+
#mariadb-dump --host=${DB_HOST} --port=${DB_PORT} --user=${DB_USERNAME} --password=${DB_PASSWORD} ${DB_DUMP_OPTIONS} --databases ${DB_DATABASE} > ${BACKUP_PATH_LOCAL}/wsc_backup_${BACKUP_DATE}_db.sql
270+
echo ">> Database Backup process is complete!"
271+
else
272+
echo ">> WARNING: Database Backup process is skipped!"
273+
fi
274+
if [ -n "$WEB_DEPLOYMENT_NAME" -a -n "$WEB_CONTAINER_HELPER_NAME" -a -n "$WEB_CONTAINER_HELPER_BACKUP_PATH" ]; then
275+
echo ">> Files (Web) Backup process is started ..."
276+
kubectl ${CONTEXT} -n ${NAMESPACE} exec "${WEB_POD_NAME}" -c "${WEB_CONTAINER_HELPER_NAME}" -- tar cvpzf ${WEB_CONTAINER_HELPER_BACKUP_PATH}/wsc_backup_${BACKUP_DATE}_files.tar.gz -C /var/www/html .
277+
kubectl ${CONTEXT} -n ${NAMESPACE} -c "${WEB_CONTAINER_HELPER_NAME}" cp "${WEB_POD_NAME}:${WEB_CONTAINER_HELPER_BACKUP_PATH}/wsc_backup_${BACKUP_DATE}_files.tar.gz" ${BACKUP_PATH_LOCAL}/wsc_backup_${BACKUP_DATE}_files.tar.gz
278+
kubectl ${CONTEXT} -n ${NAMESPACE} exec "${WEB_POD_NAME}" -c "${WEB_CONTAINER_HELPER_NAME}" -- sh -c "rm ${WEB_CONTAINER_HELPER_BACKUP_PATH}/wsc_backup_${BACKUP_DATE}_files.tar.gz"
279+
echo ">> Files Backup process is complete!"
280+
else
281+
echo ">> WARNING: Files Backup process is skipped!"
282+
fi
283+
284+
# list backups
285+
echo ">> list ${BACKUP_PATH_LOCAL}"
286+
ls -lahR ${BACKUP_PATH_LOCAL}
287+
288+
# exec CMD
289+
echo ">> exec CMD: \"$@\""
290+
exec "$@"

0 commit comments

Comments
 (0)