Minikube의 데이터 영속성 문제와 백업 전략




Minikube는 로컬 환경에서 Kubernetes를 학습하고 테스트하기에 최적의 도구입니다. 하지만 운영 관점에서 한 가지 치명적인 문제가 있습니다. minikube delete 명령 한 번이면 모든 데이터가 사라진다는 것입니다.

이 글에서는 Minikube 환경에서 데이터를 안전하게 보존하는 방법을 단계별로 알아보겠습니다.

minikube delete 시 사라지는 것들

minikube delete를 실행하면 다음 항목들이 모두 삭제됩니다.

  • PersistentVolume(PV)에 저장된 모든 데이터
  • 배포된 모든 Kubernetes 리소스 (Deployment, Service, Pod 등)
  • ConfigMap과 Secret에 저장된 설정 및 인증 정보
  • Ingress 설정 및 TLS 인증서
  • 클러스터 내부 인증서

특히 DB를 PV에 올려서 운영 중이라면, 데이터베이스의 모든 데이터가 함께 삭제됩니다.

현재 상태 확인하기

백업을 진행하기 전에 현재 클러스터의 상태를 파악해야 합니다.

PV/PVC 확인

# 전체 PV/PVC 목록 확인
kubectl get pv,pvc -A

# 특정 PV의 상세 정보 (실제 저장 경로 확인)
kubectl describe pv <pv-name>

출력 예시에서 hostPath 항목을 확인하면 실제 데이터가 저장된 경로를 알 수 있습니다. 보통 /tmp/hostpath-provisioner/default/<pvc-name> 형태입니다.

네임스페이스별 리소스 확인

# 특정 네임스페이스의 주요 리소스 확인
kubectl get all,secrets,configmaps,pvc,ingress -n <namespace>

데이터베이스 백업

DB 데이터는 덤프 방식으로 백업하는 것이 가장 안전합니다.

MySQL 백업

# Pod 이름 확인
kubectl get pods -n <namespace> | grep mysql

# 전체 데이터베이스 덤프
kubectl exec -it <mysql-pod> -n <namespace> -- \
  mysqldump -u root -p --all-databases > mysql-backup.sql

# 특정 데이터베이스만 덤프
kubectl exec -it <mysql-pod> -n <namespace> -- \
  mysqldump -u root -p <database-name> > mysql-backup.sql

PostgreSQL 백업

# Pod 이름 확인
kubectl get pods -n <namespace> | grep postgres

# 전체 데이터베이스 덤프
kubectl exec -it <postgres-pod> -n <namespace> -- \
  pg_dumpall -U postgres > postgres-backup.sql

# 특정 데이터베이스만 덤프
kubectl exec -it <postgres-pod> -n <namespace> -- \
  pg_dump -U postgres <database-name> > postgres-backup.sql

MongoDB 백업

# Pod 이름 확인
kubectl get pods -n <namespace> | grep mongo

# 전체 데이터베이스 덤프
kubectl exec -it <mongo-pod> -n <namespace> -- \
  mongodump --archive --gzip > mongo-backup.gz

Secret과 ConfigMap 백업

인증서, 패스워드, 설정 정보들은 Secret과 ConfigMap에 저장되어 있습니다.

전체 Secret 백업

# 모든 네임스페이스의 Secret 백업
kubectl get secrets -A -o yaml > all-secrets-backup.yaml

# 특정 네임스페이스만 백업
kubectl get secrets -n <namespace> -o yaml > secrets-backup.yaml

전체 ConfigMap 백업

# 모든 네임스페이스의 ConfigMap 백업
kubectl get configmaps -A -o yaml > all-configmaps-backup.yaml

# 특정 네임스페이스만 백업
kubectl get configmaps -n <namespace> -o yaml > configmaps-backup.yaml

주요 리소스 통합 백업

# 네임스페이스별 주요 리소스 한 번에 백업
kubectl get all,secrets,configmaps,pvc,ingress -n <namespace> -o yaml > full-backup.yaml

주의사항: Secret 백업 파일에는 인증서, 패스워드 등이 base64 인코딩되어 있습니다. 파일 권한 관리와 보안에 주의하세요.

PV 데이터 직접 복사

DB 덤프 외에 PV에 저장된 파일을 직접 복사해야 하는 경우도 있습니다.

Minikube 내부 접속하여 복사

# minikube VM에 SSH 접속
minikube ssh

# PV 데이터 경로 확인 및 복사
sudo ls -la /tmp/hostpath-provisioner/default/<pvc-name>
sudo cp -r /tmp/hostpath-provisioner/default/<pvc-name> /home/docker/pv-backup/

# SSH 종료
exit

호스트로 파일 가져오기

# minikube에서 호스트로 복사
minikube cp minikube:/home/docker/pv-backup ./pv-backup/

데이터 보존을 위한 호스트 마운트 설정

처음부터 데이터를 호스트에 저장하도록 설정하면 minikube delete 후에도 데이터가 유지됩니다.

방법 1: hostPath를 호스트 경로로 직접 지정

Pod 정의에서 hostPath를 minikube VM 내부가 아닌 호스트 경로로 지정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: db-pod
spec:
  containers:
  - name: db
    image: postgres:15
    volumeMounts:
    - name: data
      mountPath: /var/lib/postgresql/data
  volumes:
  - name: data
    hostPath:
      path: /home/user/minikube-data/postgres  # 호스트의 실제 경로
      type: DirectoryOrCreate

방법 2: minikube mount 사용

호스트 디렉토리를 minikube 내부에 실시간 마운트합니다.

# 호스트 디렉토리를 minikube 내부에 마운트 (별도 터미널에서 실행)
minikube mount /home/user/data:/mnt/data

# 이후 Pod에서 /mnt/data 경로 사용

주의사항: minikube mount는 터미널을 열어둔 상태에서만 동작합니다. 백그라운드 실행이 필요하면 별도 설정이 필요합니다.

전체 백업 스크립트 예시

정기적인 백업을 위한 스크립트 예시입니다.

#!/bin/bash
# minikube-backup.sh

DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR=~/minikube-backup/$DATE
NAMESPACE="default"  # 백업할 네임스페이스

# 백업 디렉토리 생성
mkdir -p $BACKUP_DIR

echo "=== Minikube 백업 시작: $DATE ==="

# 1. DB 덤프 (PostgreSQL 예시)
echo "1. DB 백업 중..."
DB_POD=$(kubectl get pods -n $NAMESPACE -l app=postgres -o jsonpath='{.items[0].metadata.name}')
if [ -n "$DB_POD" ]; then
  kubectl exec -it $DB_POD -n $NAMESPACE -- pg_dumpall -U postgres > $BACKUP_DIR/db-backup.sql
  echo "   DB 백업 완료: $BACKUP_DIR/db-backup.sql"
else
  echo "   DB Pod을 찾을 수 없습니다."
fi

# 2. Secret 백업
echo "2. Secret 백업 중..."
kubectl get secrets -n $NAMESPACE -o yaml > $BACKUP_DIR/secrets.yaml
echo "   Secret 백업 완료"

# 3. ConfigMap 백업
echo "3. ConfigMap 백업 중..."
kubectl get configmaps -n $NAMESPACE -o yaml > $BACKUP_DIR/configmaps.yaml
echo "   ConfigMap 백업 완료"

# 4. 전체 리소스 백업
echo "4. 전체 리소스 백업 중..."
kubectl get all,pvc,ingress -n $NAMESPACE -o yaml > $BACKUP_DIR/resources.yaml
echo "   전체 리소스 백업 완료"

# 5. 오래된 백업 정리 (30일 이상)
find ~/minikube-backup -type d -mtime +30 -exec rm -rf {} \; 2>/dev/null

echo "=== 백업 완료: $BACKUP_DIR ==="

스크립트 실행 권한 부여:

chmod +x minikube-backup.sh

복원 절차

클러스터 재생성 후 데이터를 복원하는 절차입니다.

1. Minikube 클러스터 재생성

minikube start

2. 리소스 복원

# ConfigMap 복원
kubectl apply -f configmaps.yaml

# Secret 복원
kubectl apply -f secrets.yaml

# 기타 리소스 복원
kubectl apply -f resources.yaml

3. DB 데이터 복원

Pod이 정상적으로 실행된 후 데이터를 복원합니다.

# Pod 상태 확인
kubectl get pods -n <namespace>

# PostgreSQL 복원
kubectl exec -it <postgres-pod> -n <namespace> -- psql -U postgres < db-backup.sql

# MySQL 복원
kubectl exec -it <mysql-pod> -n <namespace> -- mysql -u root -p < mysql-backup.sql

마무리

Minikube는 편리한 로컬 Kubernetes 환경이지만, 데이터 영속성 측면에서는 취약합니다. 중요한 데이터가 있다면 반드시 정기적인 백업을 설정하고, 가능하다면 호스트 마운트를 활용하여 데이터를 외부에 저장하는 것을 권장합니다.

다음 편에서는 Minikube 인증서 만료 시 복구 시나리오를 다루겠습니다.




댓글 남기기