KubeMigrate는 Kubernetes 클러스터 간 백업 및 복구 검증을 위한 종합적인 API 서버입니다.
멀티 클러스터 환경에서 Velero 기반 백업/복원 관리, Helm 및 MinIO 연동을 지원하며, 스토리지 클래스 비교 검증, 백업 무결성 확인, 복구 검증 등의 기능을 제공합니다.
- Kubernetes 관리: 클러스터 리소스 조회 및 관리 (통합 API)
- Velero 통합: 백업/복원 작업 모니터링 및 관리 (비동기 처리)
- Helm 지원: URL 기반 차트 설치, 업그레이드, 관리 (비동기 처리)
- MinIO 연동: 객체 스토리지 버킷 및 파일 관리
- RESTful API: 일관된 API 디자인으로 쉬운 통합
- Swagger 문서: 자동 생성된 API 문서
- Bruno 컬렉션: 포함된 API 테스트 도구
- 고성능: LRU 캐시 및 워커 풀을 통한 최적화
- 비동기 처리: Job Manager를 통한 장시간 작업 관리
- 모니터링: 메모리 사용량 및 성능 모니터링
- 🚀 빠른 시작 가이드 - 설치부터 첫 API 호출까지
- 📚 API 문서 - 모든 엔드포인트 상세 설명
- 🛠️ 개발 가이드 - 개발 환경 설정 및 기여 방법
- 📋 코드 리뷰 체크리스트 - 코드 품질 관리 가이드
- Kubernetes 클라이언트 - Kubernetes 리소스 관리
- Helm 클라이언트 - Helm 차트 관리
- MinIO 클라이언트 - 객체 스토리지 관리
- Velero 클라이언트 - 백업/복원 관리
- 예제 코드 - 실제 사용 예제들
- Go 1.24.5 이상
- Kubernetes 클러스터 접근 권한
- Helm
- MinIO
- Velero CRD
# 레포지토리 클론
git clone https://github.com/taking/kubemigrate.git
# kubemigrate 폴더 이동
cd kubemigrate
# 서버 실행
make runWithSwagger
# 의존성 업데이트
make deps
# 빌드
make build-compressed
# 코드 포맷팅
make format
# 린트 검사
make lint
# Swagger 업데이트
make swagger
# Docker 이미지 빌드
make docker-build
# 컨테이너 실행
make docker-run
# 또는 docker-compose 사용
make compose-up
kubemigrate/
├── cmd/ # 메인 애플리케이션
├── internal/ # 내부 패키지
│ ├── api/ # API 핸들러 (kubernetes, minio, helm, velero)
│ │ ├── helm/ # Helm API 핸들러 + 서비스
│ │ ├── kubernetes/ # Kubernetes API 핸들러 + 서비스
│ │ ├── minio/ # MinIO API 핸들러 + 서비스
│ │ └── velero/ # Velero API 핸들러 + 서비스
│ ├── handler/ # 공통 핸들러 (BaseHandler)
│ ├── validator/ # 검증 로직 (ValidationManager)
│ ├── response/ # 응답 처리 (ResponseManager)
│ ├── job/ # 작업 관리 (JobManager, WorkerPool)
│ ├── installer/ # 설치 로직 (VeleroInstaller)
│ ├── cache/ # 캐시 관리 (LRU Cache)
│ ├── logger/ # 로깅
│ ├── middleware/ # 미들웨어
│ ├── server/ # 서버 설정
│ └── mocks/ # Mock 클라이언트
├── pkg/ # 공개 패키지
│ ├── client/ # 클라이언트 인터페이스
│ │ ├── helm/ # Helm 클라이언트
│ │ ├── kubernetes/ # Kubernetes 클라이언트
│ │ ├── minio/ # MinIO 클라이언트
│ │ └── velero/ # Velero 클라이언트
│ ├── config/ # 설정 관리 (ConfigManager)
│ ├── types/ # 타입 정의 (kubernetes, minio, helm, velero)
│ └── utils/ # 유틸리티
├── docs/ # 문서 (Swagger)
├── docker/ # Docker 설정
├── .bruno/ # Bruno API 컬렉션
└── example/ # 사용 예제
┌──────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
│ │ Kubernetes│ │ MinIO │ │ Helm │ │ Velero │ │
│ │ Handler │ │ Handler │ │ Handler │ │ Handler │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────┘ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ Business Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
│ │ Kubernetes│ │ MinIO │ │ Helm │ │ Velero │ │
│ │ Service │ │ Service │ │ Service │ │ Service │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Common Services │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌────────────────────┐ │ │
│ │ │ Job │ │ Installer │ │ Response │ │ │
│ │ │ Manager │ │ Service │ │ Manager │ │ │
│ │ └─────────────┘ └─────────────┘ └────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ Data Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────┐ │
│ │ Kubernetes│ │ MinIO │ │ Helm │ │ Velero │ │
│ │ Client │ │ Client │ │ Client │ │ Client │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Infrastructure │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌────────────────────┐ │ │
│ │ │ Config │ │ Cache │ │ Validation │ │ │
│ │ │ Manager │ │ Manager │ │ Manager │ │ │
│ │ └─────────────┘ └─────────────┘ └────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
환경 변수 | 설명 | 기본값 |
---|---|---|
SERVER_HOST |
서버 주소 | localhost |
SERVER_PORT |
서버 포트 | 9091 |
READ_TIMEOUT |
요청 읽기 타임아웃 | 30s |
WRITE_TIMEOUT |
응답 쓰기 타임아웃 | 30s |
IDLE_TIMEOUT |
연결 유지 타임아웃 | 120s |
HEALTH_CHECK_TIMEOUT |
헬스체크 요청 타임아웃 | 5s |
REQUEST_TIMEOUT |
일반 API 요청 타임아웃 | 30s |
LOG_LEVEL |
로그 레벨 | info |
LOG_FORMAT |
로그 포맷 | json |
- Swagger UI: https://taking.github.io/kubemigrate/
- 로컬 실행: http://localhost:9091/docs
GET /
: 서버 기본 정보GET /api/v1/health
: API 서버 상태 확인
POST /health
: Kubernetes 클러스터 연결 확인GET /:kind
: 통합 리소스 조회 (pods, services, deployments 등)GET /:kind/:name
: 특정 리소스 조회
POST /health
: Velero 연결 확인POST /install
: Velero 설치 및 MinIO 연동 (비동기)GET /backups
: Backup 목록 조회GET /restores
: Restore 목록 조회GET /repositories
: BackupRepository 조회GET /storage-locations
: BackupStorageLocation 조회GET /volume-snapshot-locations
: VolumeSnapshotLocation 조회GET /pod-volume-restores
: PodVolumeRestore 조회GET /status/{jobId}
: 작업 상태 조회GET /status/{jobId}/logs
: 작업 로그 조회
POST /health
: Helm 연결 확인POST /charts
: Helm 차트 설치 (URL 기반, 비동기)GET /charts
: 차트 목록 조회GET /charts/:name
: 특정 차트 상세 조회GET /charts/:name/status
: 차트 설치 상태 확인PUT /charts/:name
: 차트 업그레이드 (비동기)GET /charts/:name/history
: 차트 히스토리 조회GET /charts/:name/values
: 차트 값 조회DELETE /charts/:name
: 차트 제거 (비동기)GET /status/{jobId}
: 작업 상태 조회
POST /health
: MinIO 연결 확인
GET /buckets
: 버킷 목록 조회GET /buckets/:bucket
: 버킷 존재 확인POST /buckets/:bucket
: 버킷 생성DELETE /buckets/:bucket
: 버킷 삭제
GET /buckets/:bucket/objects
: 객체 목록 조회POST /buckets/:bucket/objects/:objectName
: 객체 업로드GET /buckets/:bucket/objects/:objectName
: 객체 다운로드GET /buckets/:bucket/objects/:objectName
: 객체 정보 조회POST /buckets/:srcBucket/objects/:srcObject/copy/:dstBucket/:dstObject
: 객체 복사DELETE /buckets/:bucket/objects/:objectName
: 객체 삭제
GET /buckets/:bucket/objects/:objectName/presigned-get
: Presigned GET URL 생성PUT /buckets/:bucket/objects/:objectName/presigned-put
: Presigned PUT URL 생성
curl -X POST "http://localhost:9091/api/v1/helm/charts" \
-H "Content-Type: application/json" \
-d '{
"kubeconfig": "base64_encoded_kubeconfig"
}' \
-G \
--data-urlencode "releaseName=my-nginx" \
--data-urlencode "chartURL=https://charts.bitnami.com/bitnami/nginx-15.4.2.tgz" \
--data-urlencode "version=15.4.2" \
--data-urlencode "namespace=default"
curl -X POST "http://localhost:9091/api/v1/minio/buckets/my-bucket/objects/test-file.txt" \
-F "file=@/path/to/local/file.txt" \
-F 'config={"endpoint":"192.168.1.100:9000","accessKey":"admin","secretKey":"password","useSSL":false}'
curl -X GET "http://localhost:9091/api/v1/kubernetes/:kind" \
-H "Content-Type: application/json" \
-d '{
"kubeconfig": "base64_encoded_kubeconfig",
"namespace": "default"
}'
curl -X GET "http://localhost:9091/api/v1/velero/backups" \
-H "Content-Type: application/json" \
-d '{
"kubeconfig": "base64_encoded_kubeconfig"
}'
curl -X POST "http://localhost:9091/api/v1/velero/install?namespace=default&force=false" \
-H "Content-Type: application/json" \
-d '{
"kubeconfig": "base64_encoded_kubeconfig",
"minio": {
"endpoint": "192.168.1.100:9000",
"accessKey": "admin",
"secretKey": "password",
"useSSL": false
}
}'
curl -X GET "http://localhost:9091/api/v1/velero/status/{jobId}"
프로젝트에는 Bruno API 컬렉션이 포함되어 있어 쉽게 API를 테스트할 수 있습니다:
- Bruno 설치: Bruno 공식 사이트에서 다운로드
- 컬렉션 열기:
.bruno/
폴더를 Bruno에서 열기 - 환경 변수 설정:
{{base_url}}
,{{base64_local_kubeconfig}}
등 설정 - API 테스트: 각 서비스별로 분류된 요청들을 실행
.bruno/
├── 1_kube/ # Kubernetes API 테스트
├── 2_minio/ # MinIO API 테스트
├── 3_helm/ # Helm API 테스트
└── velero/ # Velero API 테스트