${GOOGLE_CLOUD_PROJECT}(또는 본인 프로젝트)를 씁니다. Qwiklabs 학생 프로젝트 ID를 영구 값처럼 복사하지 마세요. 존·리전은 예시 europe-west1-b이며 학습자가 바꿔도 됩니다.
랩 UI의 Check my progress는 랩 전용 진행 확인이며, 이 가이드에 같은 버튼을 만들지 않습니다.
이름 대응
| 학원 스토리 | 원문 | 이미지 예 |
|---|---|---|
| 통합 사이트 | monolith | academy-monolith:1.0.0 |
| 수강신청 API | orders | academy-enrollments:1.0.0 |
| 커리큘럼/강의목록 API | products | academy-courses:1.0.0 |
| 학원 홈 프론트 | frontend | academy-frontend:1.0.0 |
| 클러스터 | fancy-cluster | academy-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
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
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/ordersREACT_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
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
academy-frontend LoadBalancer … 80academy-enrollments LoadBalancer … 80academy-courses LoadBalancer … 80
academy-frontend EXTERNAL-IP로 접속합니다. 옛 모놀리스 IP는 더 이상 응답하지 않아야 합니다.포트 맵 요약
| 배포 | Service port | targetPort |
|---|---|---|
| academy-monolith / academy-frontend | 80 | 8080 |
| academy-enrollments | 80 | 8081 |
| academy-courses | 80 | 8082 |
비용 정리 (선택)
실습이 끝나면 클러스터·로드밸런서 요금이 나오지 않게 프로젝트를 삭제하거나 리소스를 직접 지웁니다.
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