본문 바로가기
kubernetes

Kubernetes Postgres DataBase Backup

by aws-evan 2024. 7. 5.
반응형

 

 

 

  • 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

 

Harbor 외부 Postgres DB 연동 및 구성

네임스페이스 생성kubectl create ns postgresDeployment 생성apiVersion: apps/v1kind: Deploymentmetadata: name: postgres namespace: postgresspec: replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: contai

monta010.tistory.com

 

 

 

  • 먼저 백업 할 스크립트 작성하기
    • 직접 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