Skip to content

Commit b3f7417

Browse files
fix: pvc mount permission (#70)
* fix: pvc mount permission - add job to fix permission if needed - update storage capacity - update cronjob manifest * fix: update manifest of tenangdb - fix permission issue at mounted pvc - remove unused env var - combine pvc from 3 to 1 * feat: update configmap
1 parent 214dce7 commit b3f7417

File tree

10 files changed

+350
-455
lines changed

10 files changed

+350
-455
lines changed

k8s/README.md

Lines changed: 181 additions & 211 deletions
Large diffs are not rendered by default.

k8s/backup-explorer.yaml.disabled

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: backup-explorer
5+
namespace: tenangdb
6+
labels:
7+
app: tenangdb
8+
component: explorer
9+
spec:
10+
securityContext:
11+
runAsNonRoot: true
12+
runAsUser: 1001
13+
runAsGroup: 1001
14+
fsGroup: 1001
15+
containers:
16+
- name: explorer
17+
image: busybox
18+
command: ['sleep', 'infinity']
19+
securityContext:
20+
allowPrivilegeEscalation: false
21+
capabilities:
22+
drop:
23+
- ALL
24+
seccompProfile:
25+
type: RuntimeDefault
26+
volumeMounts:
27+
- name: data
28+
mountPath: /data
29+
readOnly: true
30+
resources:
31+
requests:
32+
memory: "16Mi"
33+
cpu: "10m"
34+
limits:
35+
memory: "64Mi"
36+
cpu: "50m"
37+
volumes:
38+
- name: data
39+
persistentVolumeClaim:
40+
claimName: pvc-tenangdb-data
41+
restartPolicy: Never
42+
43+
---
44+
# Instructions for usage:
45+
# 1. Enable this manifest: mv backup-explorer.yaml.disabled backup-explorer.yaml
46+
# 2. Deploy: kubectl apply -f backup-explorer.yaml
47+
# 3. Access files: kubectl exec -it backup-explorer -n tenangdb -- ls -la /data
48+
# 4. Copy files: kubectl cp tenangdb/backup-explorer:/data/backups/database/date ./local-backup
49+
# 5. Cleanup: kubectl delete -f backup-explorer.yaml

k8s/configmap.yaml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ data:
3030
3131
# Backup storage and database selection
3232
backup:
33-
output_dir: /backups
33+
directory: /data/backups
3434
databases:
3535
- production_db
3636
- analytics_db
@@ -40,20 +40,17 @@ data:
4040
4141
# Cloud upload configuration
4242
upload:
43-
enabled: true
44-
destination: "s3:your-backup-bucket/tenangdb" # Configure your cloud storage
45-
rclone_path: /usr/local/bin/rclone
43+
enabled: false
44+
destination: "s3:your-backup-bucket/tenangdb"
4645
timeout: 300
4746
retry_count: 3
4847
4948
# Frequency checking (requires persistent volume)
5049
frequency:
5150
enabled: true
5251
interval: 24h
53-
tracking_file: /tmp/tenangdb/backup_tracking.json
5452
5553
# Logging settings
5654
logging:
5755
level: info
58-
format: json # JSON format for better Kubernetes log integration
59-
output_file: /var/log/tenangdb/tenangdb.log
56+
format: json

k8s/cronjob.yaml

Lines changed: 58 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ metadata:
88
spec:
99
# Schedule: Daily at 2 AM
1010
schedule: "0 2 * * *"
11-
failedJobsHistoryLimit: 3 # This should be here
12-
successfulJobsHistoryLimit: 3 # This should be here
11+
failedJobsHistoryLimit: 3
12+
successfulJobsHistoryLimit: 3
1313
# Timezone (optional, requires Kubernetes 1.25+)
1414
timeZone: "Asia/Jakarta"
1515

@@ -31,6 +31,7 @@ spec:
3131
runAsUser: 1001
3232
runAsGroup: 1001
3333
fsGroup: 1001
34+
fsGroupChangePolicy: "OnRootMismatch"
3435

3536
containers:
3637
- name: tenangdb
@@ -39,40 +40,17 @@ spec:
3940

4041
# Command - use the main binary
4142
command: ["/tenangdb"]
42-
args: ["backup"]
43+
args: ["backup", "--force", "--config", "/config.yaml"]
4344

44-
# Environment variables from secrets
45-
env:
46-
- name: MYSQL_USER
47-
valueFrom:
48-
secretKeyRef:
49-
name: tenangdb-secrets
50-
key: MYSQL_USER
51-
- name: MYSQL_PASSWORD
52-
valueFrom:
53-
secretKeyRef:
54-
name: tenangdb-secrets
55-
key: MYSQL_PASSWORD
56-
# Optional: Cloud storage credentials
57-
- name: RCLONE_CONFIG
58-
valueFrom:
59-
secretKeyRef:
60-
name: tenangdb-secrets
61-
key: RCLONE_CONFIG
62-
optional: true
6345

6446
# Volume mounts
6547
volumeMounts:
6648
- name: config
6749
mountPath: /config.yaml
6850
subPath: config.yaml
6951
readOnly: true
70-
- name: backups
71-
mountPath: /backups
72-
- name: tracking
73-
mountPath: /tmp/tenangdb
74-
- name: logs
75-
mountPath: /var/log/tenangdb
52+
- name: data
53+
mountPath: /data
7654

7755
# Resource limits
7856
resources:
@@ -82,124 +60,70 @@ spec:
8260
limits:
8361
memory: "2Gi"
8462
cpu: "2000m"
85-
86-
# Liveness and readiness probes (optional)
87-
# livenessProbe:
88-
# exec:
89-
# command:
90-
# - /bin/sh
91-
# - -c
92-
# - "pgrep -f tenangdb || exit 1"
93-
# initialDelaySeconds: 30
94-
# periodSeconds: 60
9563

9664
volumes:
9765
- name: config
9866
configMap:
9967
name: tenangdb-config
100-
- name: backups
101-
persistentVolumeClaim:
102-
claimName: pvc-tenangdb-backups
103-
- name: tracking
68+
- name: data
10469
persistentVolumeClaim:
105-
claimName: pvc-tenangdb-tracking
106-
- name: logs
107-
persistentVolumeClaim:
108-
claimName: pvc-tenangdb-logs
109-
110-
# Optional: Node selector for dedicated backup nodes
111-
# nodeSelector:
112-
# backup-node: "true"
113-
114-
# Optional: Tolerations for dedicated backup nodes
115-
# tolerations:
116-
# - key: "backup-only"
117-
# operator: "Equal"
118-
# value: "true"
119-
# effect: "NoSchedule"
70+
claimName: pvc-tenangdb-data
12071

12172
---
12273
# Optional: Manual backup job template
123-
apiVersion: batch/v1
124-
kind: Job
125-
metadata:
126-
name: tenangdb-manual-backup
127-
namespace: tenangdb
128-
labels:
129-
app: tenangdb
130-
job-type: manual
131-
spec:
132-
template:
133-
metadata:
134-
labels:
135-
app: tenangdb
136-
job-type: manual
137-
spec:
138-
serviceAccountName: tenangdb
139-
restartPolicy: Never
74+
# apiVersion: batch/v1
75+
# kind: Job
76+
# metadata:
77+
# name: tenangdb-manual-backup
78+
# namespace: tenangdb
79+
# labels:
80+
# app: tenangdb
81+
# job-type: manual
82+
# spec:
83+
# template:
84+
# metadata:
85+
# labels:
86+
# app: tenangdb
87+
# job-type: manual
88+
# spec:
89+
# serviceAccountName: tenangdb
90+
# restartPolicy: Never
14091

141-
securityContext:
142-
runAsNonRoot: true
143-
runAsUser: 1001
144-
runAsGroup: 1001
145-
fsGroup: 1001
92+
# securityContext:
93+
# runAsNonRoot: true
94+
# runAsUser: 1001
95+
# runAsGroup: 1001
96+
# fsGroup: 1001
97+
# fsGroupChangePolicy: "OnRootMismatch"
14698

147-
containers:
148-
- name: tenangdb
149-
image: ghcr.io/abdullahainun/tenangdb:latest
150-
imagePullPolicy: Always
151-
152-
command: ["/tenangdb"]
153-
args: ["backup", "--force"] # Force backup even if frequency check fails
99+
# containers:
100+
# - name: tenangdb
101+
# image: ghcr.io/abdullahainun/tenangdb:latest
102+
# imagePullPolicy: Always
154103

155-
env:
156-
- name: MYSQL_USER
157-
valueFrom:
158-
secretKeyRef:
159-
name: tenangdb-secrets
160-
key: MYSQL_USER
161-
- name: MYSQL_PASSWORD
162-
valueFrom:
163-
secretKeyRef:
164-
name: tenangdb-secrets
165-
key: MYSQL_PASSWORD
166-
- name: RCLONE_CONFIG
167-
valueFrom:
168-
secretKeyRef:
169-
name: tenangdb-secrets
170-
key: RCLONE_CONFIG
171-
optional: true
104+
# command: ["/tenangdb"]
105+
# args: ["backup", "--force", "--config", "/config.yaml"] # Force backup even if frequency check fails
172106

173-
volumeMounts:
174-
- name: config
175-
mountPath: /config.yaml
176-
subPath: config.yaml
177-
readOnly: true
178-
- name: backups
179-
mountPath: /backups
180-
- name: tracking
181-
mountPath: /tmp/tenangdb
182-
- name: logs
183-
mountPath: /var/log/tenangdb
107+
# volumeMounts:
108+
# - name: config
109+
# mountPath: /config.yaml`
110+
# subPath: config.yaml
111+
# readOnly: true
112+
# - name: backups
113+
# mountPath: /backups
184114

185-
resources:
186-
requests:
187-
memory: "512Mi"
188-
cpu: "500m"
189-
limits:
190-
memory: "2Gi"
191-
cpu: "2000m"
115+
# resources:
116+
# requests:
117+
# memory: "512Mi"
118+
# cpu: "500m"
119+
# limits:
120+
# memory: "2Gi"
121+
# cpu: "2000m"
192122

193-
volumes:
194-
- name: config
195-
configMap:
196-
name: tenangdb-config
197-
- name: backups
198-
persistentVolumeClaim:
199-
claimName: pvc-tenangdb-backups
200-
- name: tracking
201-
persistentVolumeClaim:
202-
claimName: pvc-tenangdb-tracking
203-
- name: logs
204-
persistentVolumeClaim:
205-
claimName: pvc-tenangdb-logs
123+
# volumes:
124+
# - name: config
125+
# configMap:
126+
# name: tenangdb-config
127+
# - name: backups
128+
# persistentVolumeClaim:
129+
# claimName: pvc-tenangdb-backups
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
apiVersion: v1
2+
kind: Namespace
3+
metadata:
4+
name: tenangdb-privileged
5+
labels:
6+
pod-security.kubernetes.io/enforce: privileged
7+
pod-security.kubernetes.io/audit: privileged
8+
pod-security.kubernetes.io/warn: privileged
9+
---
10+
apiVersion: batch/v1
11+
kind: Job
12+
metadata:
13+
name: fix-tenangdb-permissions
14+
namespace: tenangdb-privileged
15+
spec:
16+
template:
17+
spec:
18+
hostPID: true
19+
containers:
20+
- name: fix-permissions
21+
image: busybox
22+
command:
23+
- sh
24+
- -c
25+
- |
26+
mkdir -p /host/var/lib/tenangdb/data/backups
27+
mkdir -p /host/var/lib/tenangdb/data/metrics
28+
mkdir -p /host/var/lib/tenangdb/data/logs
29+
chown -R 1001:1001 /host/var/lib/tenangdb/data
30+
chmod -R 775 /host/var/lib/tenangdb/data
31+
echo "Single PVC permissions fixed for /data structure"
32+
securityContext:
33+
privileged: true
34+
volumeMounts:
35+
- name: host-var
36+
mountPath: /host/var
37+
volumes:
38+
- name: host-var
39+
hostPath:
40+
path: /var
41+
restartPolicy: Never
42+
nodeSelector:
43+
kubernetes.io/hostname: homelab-k8s-worker-2

k8s/kustomization.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ resources:
1010
- namespace.yaml
1111
- rbac.yaml
1212
- configmap.yaml
13-
- secret.yaml
1413
- pv.yaml
1514
- pvc.yaml
1615
- cronjob.yaml

0 commit comments

Comments
 (0)