academy · gke · cream guide

영어학원 사이트 GKE로 나눠 배포하기

Fancy Store 모놀리스를 영어학원 통합 사이트(홈+커리큘럼+수강신청)로 읽어, GKE에 올린 뒤 수강신청·강의목록·프론트로 나누는 따라하기입니다. 명령은 공개 Codelabs 흐름을 따르고, 이미지·클러스터 이름만 학원식으로 바꿉니다.

출처 Codelabs 저장소 googlecodelabs/monolith-to-microservices · 검증 2026-09-18

이름·ID — 프로젝트는 항상 ${GOOGLE_CLOUD_PROJECT}(또는 본인 프로젝트)를 씁니다. Qwiklabs 학생 프로젝트 ID를 영구 값처럼 복사하지 마세요. 존·리전은 예시 europe-west1-b이며 학습자가 바꿔도 됩니다. 랩 UI의 Check my progress는 랩 전용 진행 확인이며, 이 가이드에 같은 버튼을 만들지 않습니다.

이름 대응

학원 스토리원문이미지 예
통합 사이트monolithacademy-monolith:1.0.0
수강신청 APIordersacademy-enrollments:1.0.0
커리큘럼/강의목록 APIproductsacademy-courses:1.0.0
학원 홈 프론트frontendacademy-frontend:1.0.0
클러스터fancy-clusteracademy-prod (노드 3)

원문 저장소 폴더 이름(orders, products 등)과 .env의 REACT_APP_ORDERS_URL / REACT_APP_PRODUCTS_URL 키는 그대로 둡니다. 스토리만 수강신청·강의목록으로 읽습니다.

Task 1 · 소개·환경

Cloud Shell · 프로젝트

콘솔에서 Cloud Shell을 연 뒤 계정·프로젝트를 확인합니다.

gcloud auth list
gcloud config list project
echo $GOOGLE_CLOUD_PROJECT

프로젝트가 비어 있으면 본인 프로젝트로 맞춥니다.

gcloud config set project ${GOOGLE_CLOUD_PROJECT}

기본 존 예시는 랩에서 자주 쓰는 europe-west1-b입니다. 다른 존을 써도 됩니다.

gcloud config set compute/zone europe-west1-b
확인 — echo $GOOGLE_CLOUD_PROJECT에 값이 나와야 이후 gcr.io/${GOOGLE_CLOUD_PROJECT}/… 태그가 맞습니다.

Task 2 · 클론·setup

저장소 · Node 의존성

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

setup.sh는 의존성 설치까지 포함하며 수 분이 걸릴 수 있습니다. Node가 오래되면 Cloud Shell에서 nvm install --lts를 먼저 실행하는 것이 원문 README 권장입니다.

Task 3 · GKE 클러스터 academy-prod

API · 클러스터 3노드

gcloud services enable container.googleapis.com cloudbuild.googleapis.com
gcloud container clusters create academy-prod \
  --num-nodes 3 \
  --zone europe-west1-b

생성이 끝나면 자격 증명을 받고 노드를 확인합니다. (gcloud container clusters create로 방금 만든 경우 get-credentials는 보통 자동이지만, 콘솔에서 만든 클러스터면 반드시 실행합니다.)

gcloud container clusters get-credentials academy-prod --zone europe-west1-b
gcloud compute instances list
존 오류 — region/zone not specified가 나오면 Task 1의 gcloud config set compute/zone …를 다시 하거나, 위처럼 --zone을 붙입니다.

Task 4 · 통합 사이트(모놀리스) 배포

Cloud Build · LoadBalancer 80→8080

원문 랩은 ./deploy-monolith.sh로 고정 이름 monolith를 올립니다. 이 가이드는 학원 이미지 이름에 맞춰 같은 단계를 명시적으로 적습니다.

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:1.0.0 .
kubectl create deployment academy-monolith \
  --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:1.0.0
kubectl expose deployment academy-monolith \
  --type=LoadBalancer \
  --port 80 \
  --target-port 8080
kubectl get service academy-monolith
EXTERNAL-IP가 <pending> — LoadBalancer용 외부 IP 할당에 시간이 걸립니다. 1~2분 뒤 같은 명령을 다시 실행하세요. IP가 나오면 브라우저에서 http://<EXTERNAL-IP>로 통합 사이트(환영·상품·주문에 해당하는 학원 홈·커리큘럼·수강 흐름)를 엽니다.
확인 — kubectl get all에서 deployment.apps/academy-monolith와 Pod가 Running인지 봅니다.

Task 5 · 수강신청(enrollments) API 분리

orders 폴더 → academy-enrollments · 80→8081

이미지 빌드·배포·노출

cd ~/monolith-to-microservices/microservices/src/orders
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-enrollments:1.0.0 .
kubectl create deployment academy-enrollments \
  --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-enrollments:1.0.0
kubectl expose deployment academy-enrollments \
  --type=LoadBalancer \
  --port 80 \
  --target-port 8081
kubectl get service academy-enrollments

EXTERNAL-IP를 메모합니다. (스토리: 수강신청 API. 원문 경로·JSON은 여전히 /api/orders.)

.env 수정 (REACT_APP_*)

cd ~/monolith-to-microservices/react-app
nano .env.monolith
처음에는 대략 다음과 같습니다.
REACT_APP_ORDERS_URL=/service/orders
REACT_APP_PRODUCTS_URL=/service/products

수강신청 IP로 바꿉니다. 강의목록은 아직 상대 경로로 둡니다.

REACT_APP_ORDERS_URL=http://<ENROLLMENTS_IP>/api/orders
REACT_APP_PRODUCTS_URL=/service/products

nano: Ctrl+O → Enter → Ctrl+X.

통합 사이트 재빌드·롤아웃

npm run build:monolith
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:2.0.0 .
kubectl set image deployment/academy-monolith \
  academy-monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:2.0.0
확인 — 브라우저에서 수강/주문 쪽을 열면 ID 접미사 등으로 마이크로서비스 응답인지 구분할 수 있습니다(원문 랩과 동일 패턴).

Task 6 · 커리큘럼(courses) API 분리

products 폴더 → academy-courses · 80→8082

cd ~/monolith-to-microservices/microservices/src/products
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-courses:1.0.0 .
kubectl create deployment academy-courses \
  --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-courses:1.0.0
kubectl expose deployment academy-courses \
  --type=LoadBalancer \
  --port 80 \
  --target-port 8082
kubectl get service academy-courses

.env에 강의목록 URL

cd ~/monolith-to-microservices/react-app
nano .env.monolith
REACT_APP_ORDERS_URL=http://<ENROLLMENTS_IP>/api/orders
REACT_APP_PRODUCTS_URL=http://<COURSES_IP>/api/products
npm run build:monolith
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:3.0.0 .
kubectl set image deployment/academy-monolith \
  academy-monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-monolith:3.0.0

Task 7 · 프론트 분리·모놀리스 삭제

academy-frontend · 80→8080 · 정리

모놀리스용으로 맞춰 둔 URL 설정을 프론트 빌드에 복사합니다.

cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build
cd ~/monolith-to-microservices/microservices/src/frontend
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-frontend:1.0.0 .
kubectl create deployment academy-frontend \
  --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/academy-frontend:1.0.0
kubectl expose deployment academy-frontend \
  --type=LoadBalancer \
  --port 80 \
  --target-port 8080

세 마이크로서비스가 준비되면 통합 배포를 제거합니다.

kubectl delete deployment academy-monolith
kubectl delete service academy-monolith
kubectl get services
기대 형태(IP는 예시):
academy-frontend LoadBalancer … 80
academy-enrollments LoadBalancer … 80
academy-courses LoadBalancer … 80
확인 — 새 academy-frontend EXTERNAL-IP로 접속합니다. 옛 모놀리스 IP는 더 이상 응답하지 않아야 합니다.

포트 맵 요약

배포Service porttargetPort
academy-monolith / academy-frontend808080
academy-enrollments808081
academy-courses808082

비용 정리 (선택)

실습이 끝나면 클러스터·로드밸런서 요금이 나오지 않게 프로젝트를 삭제하거나 리소스를 직접 지웁니다.

gcloud container clusters delete academy-prod --zone europe-west1-b
# 또는 실습 전용 프로젝트 전체 삭제:
# gcloud projects delete ${GOOGLE_CLOUD_PROJECT}

출처: Google Codelabs monolith-to-microservices. 절차는 공개 monolith-to-microservices 챌린지 패턴을 따릅니다(2026-09-18 학습자 완료 랩 노트와 Codelabs 본문으로 대조). 적응 표: source/NOTES.md · 카드: cards.md