반응형
- DataBase를 사용하게 되면 반드시 백업은 필수, 데이터 유실 될 경우 복구가 불가능..
- 매번 수동으로 백업하면 실수도 할 수 있고 누락도 될 수 있음
- Kubernetes Postgres Pod를 백업 하는 방법에서 알아보도록 하겠습니다
- 환경
- Kubernetes Cluster
- Postgres Deployment , Pod ,SVC
- Postgres PV, PVC
- Postgres Backup PV,PVC
- CronJob
- Kubernetes Cluster , Deplyoment, Pod , SVC 생성했다는 가정
- Harbor 외부용 Postgres로 생성했던 부분이라 아래 참고(Postgres Pod형태로 배포 생성도 포함)
https://monta010.tistory.com/122
- 먼저 백업 할 스크립트 작성하기
- 직접 PVC 경로에 스크립트를 넣는 방식(선택)
- Configmap 마운트처리해서 사용하는 방식
- 백업 스크립트
- 원하는 스크립트형태로 작성하세요~
#!/bin/bash
# 변수 설정
HOSTNAME=postgres.postgres.svc.cluster.local
BACKUP_DIR=/mnt/postgres
DB_NAME=registry
DB_USER=harbor
DB_PASSWORD=harbor12345!
# pg_dump 명령어에서 사용할 비밀번호를 환경 변수로 설정
export PGPASSWORD=$DB_PASSWORD
# 백업 디렉토리가 존재하지 않으면 생성
mkdir -p $BACKUP_DIR
# 백업 수행 및 결과 로그 기록
BACKUP_FILE="$BACKUP_DIR/$(date +\%Y\%m\%d\%H\%M\%S)_$DB_NAME.dump"
pg_dump -h $HOSTNAME -U $DB_USER -F c $DB_NAME > $BACKUP_FILE 2> $BACKUP_DIR/backup_error.log
# 백업이 성공했는지 확인
if [ $? -eq 0 ]; then
echo "Backup successful: $BACKUP_FILE" >> $BACKUP_DIR/backup_log.log
else
echo "Backup failed: $(cat $BACKUP_DIR/backup_error.log)" >> $BACKUP_DIR/backup_log.log
fi
# 7일 이상 된 백업 파일을 찾아 삭제하고, 삭제된 파일 로그 기록
echo "Checking for old backups to delete:" >> $BACKUP_DIR/backup_log.log
OLD_BACKUPS=$(find $BACKUP_DIR -type f -name "*.dump" -mtime +7)
if [ -n "$OLD_BACKUPS" ]; then
echo "$OLD_BACKUPS" | while read -r FILE; do
echo "Deleting old backup: $FILE" >> $BACKUP_DIR/backup_log.log
rm "$FILE"
done
echo "Old backups deleted" >> $BACKUP_DIR/backup_log.log
else
echo "No old backups to delete" >> $BACKUP_DIR/backup_log.log
fi
# 7일 이상 된 로그 파일을 찾아 삭제
echo "Checking for old logs to delete:" >> $BACKUP_DIR/backup_log.log
OLD_LOGS=$(find $BACKUP_DIR -type f -name "*.log" -mtime +7)
if [ -n "$OLD_LOGS" ]; then
echo "$OLD_LOGS" | while read -r LOG_FILE; do
echo "Deleting old log file: $LOG_FILE" >> $BACKUP_DIR/backup_log.log
rm "$LOG_FILE"
done
echo "Old log files deleted" >> $BACKUP_DIR/backup_log.log
else
echo "No old log files to delete" >> $BACKUP_DIR/backup_log.log
fi
- CronJob
- 테스트용으로 1분에 한번씩 동작하게 구성
- Schedule 설정은 각 환경에 맞도록 설정하시길 바랍니다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: postgres-backup
namespace: postgres
spec:
schedule: "*/1 * * * *" # 매일 오후 1시 50분에 실행
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
startingDeadlineSeconds: 60
jobTemplate:
spec:
template:
spec:
containers:
- name: postgres-backup
image: postgres:15.7-alpine # 적절한 이미지를 선택하십시오.
volumeMounts:
- name: backup-storage
mountPath: /mnt
command: ["/bin/bash", "-c"]
args:
- |
ls -l /mnt
ls -l /mnt/script
sh /mnt/script/postgres-backup.sh
restartPolicy: OnFailure
volumes:
- name: backup-storage
persistentVolumeClaim:
claimName: postgres-backup-pvc # 적절한 PVC 이름을 지정하십시오.
- CronJob 설정 상태
- 동작하면 Active, Last Schedule 상태 변경됨
- CronJob 동작 상태
- 백업 성공
다양한 방식도 있지만, 최대한 Kubernetes Resource를 통하여 설정 하였습니다.
반응형
'kubernetes' 카테고리의 다른 글
Kubernetes Containerd GPU 사용 방법 (0) | 2024.08.09 |
---|---|
Kubernetes CronJob (0) | 2024.07.05 |
k3s 설치 가이드 (0) | 2024.06.13 |
Kubernetes EFK Helm (0) | 2024.05.03 |
Kubernetes NFS Provisioner (0) | 2024.05.02 |
댓글