API 기반 로컬 Kubernetes Internal Developer Platform(IDP) 실험 프로젝트입니다.
mini-cloud는 Kubernetes 리소스를 직접 작성하지 않고, Control Plane API 호출만으로 App/DB를 프로비저닝하는 것을 목표로 합니다.
- Developer -> mini-cloud API (Spring Boot)
- mini-cloud API -> 상태 DB(Postgres)
- mini-cloud API -> Kubernetes API/Helm (오케스트레이션)
- Spring Boot 3 + Kotlin 기반
server모듈 - 상태 머신 enum (
REQUESTED -> PROVISIONING -> READY/FAILED -> DELETING -> DELETED) - MVP API:
POST /v1/databasesPOST /v1/appsGET /v1/apps/{name}?namespace=...DELETE /v1/apps/{name}?namespace=...
- JPA 기반 상태 저장 엔티티/리포지토리
- 오케스트레이션 인터페이스 + Helm/K8s 스텁 구현
docker compose up -d
docker compose ps종료:
docker compose down환경변수 미지정 시 기본값:
DB_URL=jdbc:postgresql://localhost:5432/minicloudDB_USERNAME=minicloudDB_PASSWORD=minicloud
주의: 이 프로젝트는 Java 21 환경에서 실행해야 합니다. (Java 25 등에서는 Gradle/Kotlin 스크립트 단계에서 실행이 실패할 수 있습니다.)
cd server
../gradlew bootRun참고: 서버는 kubectl로 클러스터를 직접 제어하므로, 현재는 서버 컨테이너화보다 호스트에서 실행하는 구성이 안전합니다.
deploy/docker/server.env.example를 기반으로 환경변수를 주고 실행하려면:
set -a
source ../deploy/docker/server.env.example
set +a
../gradlew bootRuncurl -X POST http://localhost:8080/v1/databases \
-H "Content-Type: application/json" \
-d '{"name":"pg-main","namespace":"demo"}'Database API를 호출하면 현재 구현은 실제 kubectl로 다음을 생성합니다.
- Namespace (
demo) - Secret (
pg-main-conn) - Pod (
pg-main-pg, image:postgres:16-alpine) - Service (
pg-main-svc)
확인:
kubectl -n demo get pod,svc,secret | grep pg-main
kubectl -n demo logs pg-main-pgkubectl 또는 클러스터가 준비되지 않은 상태에서 POST /v1/databases를 호출하면 503과 함께
kubectl이 실행/연결되어 있지 않습니다. 먼저 minikube와 kubectl을 실행해 주세요. 메시지를 반환합니다.
아래 테스트는 실제 엔드포인트를 호출하고 Kubernetes에 Postgres Pod가 생성되는지 검증합니다.
- 테스트 파일:
server/src/test/kotlin/io/minicloud/controlplane/e2e/DatabasePodProvisionE2ETest.kt - 실행 조건:
RUN_DB_POD_E2E=true
export RUN_DB_POD_E2E=true
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
./gradlew :server:test --tests '*DatabasePodProvisionE2ETest'App + DB 연동 E2E:
export RUN_APP_DB_E2E=true
export JAVA_HOME=$(/usr/libexec/java_home -v 21)
./gradlew :server:test --tests '*AppWithDatabaseE2ETest'curl -X POST http://localhost:8080/v1/apps \
-H "Content-Type: application/json" \
-d '{
"name":"hello",
"namespace":"demo",
"image":"nginx:latest",
"port":80,
"replicas":1,
"databaseRef":"pg-main"
}'databaseRef를 지정하면 App Deployment에 아래 환경변수가 자동 주입됩니다.
DB_HOST,DB_PORT,DB_NAME,DB_USER,DB_PASSWORDSPRING_DATASOURCE_URL,SPRING_DATASOURCE_USERNAME,SPRING_DATASOURCE_PASSWORD
생성 리소스:
- Deployment (
<app-name>) - Service (
<app-name>-svc) - Ingress (
<app-name>-ing)
Kubernetes 매니페스트 템플릿 위치:
server/src/main/resources/k8s/templates/database.yamlserver/src/main/resources/k8s/templates/app.yamlserver/src/main/resources/k8s/templates/app-db-env.yaml
React + Vite 기반 웹 콘솔이 서버에 내장되어 제공됩니다.
서버만 실행하면 됩니다.
cd server
../gradlew bootRun접속:
http://localhost:8080/console
cd web
npm install
npm run dev단독 실행 시 API URL은 아래로 조정:
cp .env.example .env
# .env -> VITE_API_BASE_URL 수정서버는 기본적으로 아래 오리진에서의 API 호출(CORS)을 허용합니다.
http://localhost:5173http://127.0.0.1:5173http://localhost:5500http://127.0.0.1:5500
필요하면 환경변수로 조정:
export MINICLOUD_WEB_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000참고:
- Gradle이 서버 리소스 처리 시
web을 자동 빌드해/console로 포함합니다. - 웹 빌드를 건너뛰려면
MINICLOUD_SKIP_WEB_BUILD=true를 사용할 수 있습니다.