
๐งฑ GKE๋ก Monolith์์ Microservices ์ด์ - ์ค์ ํธ
์ด์ ์ ์ด์ด Google Kubernetes Engine(GKE)๋ก ๊ธฐ์กด Monolith์์ Microservices๋ก ์ด์ ์ ํด ์ง์ ํด ๋ณด๋ ๊ณผ์ ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.์ด ๊ณผ์ ์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ study jam์ ๊ณผ์ ์ค ์ผ๋ถ ๊ณผ์ (chanlleng lab)์ ๋๋ค. ์ฉ์ด๋ ๊ฐ๋ ์ด ์ ์ ์กํ๋ ๋ถ์...
์ด์ ์ ์ด์ด Google Kubernetes Engine(GKE)๋ก ๊ธฐ์กด Monolith์์ Microservices๋ก ์ด์ ์ ํด ์ง์ ํด ๋ณด๋ ๊ณผ์ ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
์ด ๊ณผ์ ์ ๊ตฌ๊ธ ํด๋ผ์ฐ๋์ study jam์ ๊ณผ์ ์ค ์ผ๋ถ ๊ณผ์ (chanlleng lab)์ ๋๋ค.
์ฉ์ด๋ ๊ฐ๋ ์ด ์ ์ ์กํ๋ ๋ถ์ ์ด์ ๊ธ์ ๋ณด์๋ฉด ์ข ๋ ์ดํด๊ฐ ํธํ์ค๊ฒ๋๋ค.
(๋ชจ๋๋ฆฌ์ค ์ํคํ ์ฒ ์ดํด์ ์ ๋ง์ดํฌ์๋น์ค๋ก ์ด์ ์ ํด์ผ ํ๋๊ฐ๋ ์ด์ ๊ธ์ ๋ณด๋ฉด ์ ๋ฆฌํด ๋์์ต๋๋ค.)
2025.04.26 - [๊ฐ๋ฐ/Google Cloud] - ๐งฑ GKE๋ก Monolith์์ Microservices ์ด์ - ๊ฐ๋ ์ก๊ธฐ
๐ท ํ๋ก์ ํธ ๊ฐ์
์ฌ๊ธฐ์๋ https://github.com/googlecodelabs/monolith-to-microservices ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ธ์ ์์ ์ด ์ด๋ฃจ์ด์ง๋๋ค.
์ด ํ๋ก์ ํธ์์๋ ์ด๋ฏธ ๊ฐ๋ฐ์๋ค์ด ๋ชจ๋๋ฆฌ์ค ์ฝ๋๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌํ๋ ๋ฆฌํฉํ ๋ง ์์ ์ ๋ฏธ๋ฆฌ ํด๋์๋ค๋ ์ ์ ๋ก ์์์ด ๋ฉ๋๋ค. (Microservices๋ก ์ด์ ํ๊ธฐ ์ํด ์ค๋น๋ ํ๋ก์ ํธ๋ผ๋ ๋ง์ ๋๋ค.)
monolith-to-microservices/
โโโ monolith/ # ๋ชจ๋๋ฆฌ์ค ๋ฒ์ ์ ์ฝ๋
โโโ microservices/
โโโ src/
โโโ orders/ # ์ด๋ฏธ ๋ถ๋ฆฌ๋ Orders ๋ง์ดํฌ๋ก์๋น์ค ์ฝ๋
โโโ products/ # ์ด๋ฏธ ๋ถ๋ฆฌ๋ Products ๋ง์ดํฌ๋ก์๋น์ค ์ฝ๋
โโโ frontend/ # ์ด๋ฏธ ๋ถ๋ฆฌ๋ Frontend ๋ง์ดํฌ๋ก์๋น์ค ์ฝ๋์ฌ๊ธฐ์๋ "FancyStore"๋ผ๋ ์ํ ์ ์์๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์์ ํ๋ฉฐ ๊ทธ ๋ชจ๋๋ฆฌ์ค ์ํคํ ์ฒ๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ณํํ ๊ฒ์ ๋๋ค. ์ด ํ๋ก์ ํธ๋ ๋ค์๊ณผ ๊ฐ์ ํ์ค ์ง์นจ์ด ์์ต๋๋ค.
- ํด๋ฌ์คํฐ ์์น: europe-west1
- ๋ฆฌ์์ค ๋ช ๋ช ๊ท์น: team-resource(์: fancystore-orderservice1)
- ๋จธ์ ํ์ : e2-medium(๋น์ฉ ํจ์จ์ฑ์ ์ํด)
์ฌ๊ธฐ์ ๋ชฉํ๋ ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ธ ๊ฐ์ง ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํ๋ ๊ฒ์ ๋๋ค.(Challenge Lab์ ์๊ตฌ์ฌํญ์ ๋๋ค.)
- Orders ์๋น์ค - ๊ณ ๊ฐ ์ฃผ๋ฌธ ๋ฐ์ดํฐ ๋ฐ ์ด๋ ฅ ์ฒ๋ฆฌ
- Products ์๋น์ค - ์ ํ ์นดํ๋ก๊ทธ ๋ฐ ์ ๋ณด ๊ด๋ฆฌ
- Frontend ์๋น์ค - ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ ๊ณต
๐ท ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
๋จผ์ ์ ์ฅ์๋ฅผ ๋ณต์ ํ๊ณ ํ๊ฒฝ์ ์ค์ ํด์ผ ํฉ๋๋ค.
# ํ๋ก์ ํธ ID ์ค์
gcloud config set project qwiklabs-gcp-00-09f9d6988b61
# ์ ์ฅ์ ๋ณต์
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd monolith-to-microservices
# ์ต์ Node.js LTS ๋ฒ์ ์ค์น
nvm install --lts
# Cloud Build API ํ์ฑํ
gcloud services enable cloudbuild.googleapis.com์ด๊ฒ์ ํ๋ก์ ํธ๋ฅผ ์ค์ ํ๊ณ , ์์ค ์ฝ๋๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ฌ๋ฐ๋ฅธ Node.js ๋ฒ์ ์ ํ๋ณดํ๊ณ , ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ฑ์ ์ํ Cloud Build API๋ฅผ ํ์ฑํํฉ๋๋ค.
๐ท๋ชจ๋๋ฆฌ์ค ์ปจํ ์ด๋ํ
๋ถํดํ๊ธฐ ์ ์ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํ๋ฅผ ๋จผ์ ํด์ผ ํฉ๋๋ค.
์??
๋น์ฐํ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๊ฐ์๊ธฐ ์ ํํ๋ ๊ฒ์ ์ํ์ฑ์ด ํฝ๋๋ค. ๊ทธ๋์ ๋จ๊ณ์ ์ผ๋ก ์งํํ๋ ๊ฒ์ด ๋ ์์ ํ์ฃ .
๊ทธ๋์ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ฝ๋ ๋ณ๊ฒฝ์์ด ๊ทธ๋๋ก ์ปจํ ์ด๋ํ๋ฅผ ์์ผ๋๊ณ , ์ปจํ ์ด๋ ํ๊ฒฝ์์ ์ ๋๋ก ์๋ํ๋์ง ํ์ธ์ ํด์ผ ํฉ๋๋ค.
๊ทธํ ํ๋์ฉ ๊ฐ ์๋น์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ ์คํธ๋ญ๊ธ๋ฌ ํจํด(Strangler Pattern)์ด๋ผ๊ณ ํฉ๋๋ค.
๋ ๊ฑฐ์ ์์คํ ์ ์ ์ง์ ์ผ๋ก ์๋ก์ด ์์คํ ์ผ๋ก ๋์ฒดํ๋ ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ต์ ๋งํ๋ ๊ฒ๋๋ค.
๋ชจ๋๋ฆฌ์ค๋ฅผ ๋จผ์ ์ปจํ ์ด๋ํํ๋ฉด ์ ํ ๊ธฐ๊ฐ ๋์ ์์คํ ์ ๊ณ์ ์ด์ํ๋ฉด์, ๊ฐ ์๋น์ค๋ฅผ ๋ง์ดํฌ๋ก ์๋น์ค๋ฅผ ์ถ์ถํ๊ณ ๋ฐฐํฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ๊ธฐ๋ฅ์ ๋นํ์ฑํ ํ๊ฑฐ๋ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ฆฌ๋๋ ์ (redirection)ํ๊ณ , ๋ชจ๋ ๊ธฐ๋ฅ์ด ๋ค ์ด๋์ด ๋์์ผ๋ฉด ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ ๊ฑฐํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ๋จํ ๊ทธ ๊ณผ์ ์ ์ถ์ฝํด์ ๊ฐ๋จํด ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋ ๋ช๋ฌ์ด ๊ฑธ๋ฆด์๋ ์๋ ๊ณผ์ ์ ๋๋ค.
# ๋ชจ๋๋ฆฌ์ค ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd monolith
# ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
gcloud builds submit \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:1.0.0์ด ๋ช ๋ น์ ๋ชจ๋๋ฆฌ์ค ๋๋ ํ ๋ฆฌ์ Dockerfile์์ Docker ์ปจํ ์ด๋๋ฅผ ๋น๋ํ๊ณ fancy-monolith-203:1.0.0 ํ๊ทธ๋ก Google์ Artifact Registry์ ํธ์ํฉ๋๋ค.
Cloud Build๋ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ ์์ถํ์ฌ Cloud Storage ๋ฒํท์ผ๋ก ์ด๋ํ ๋ค์ Dockerfile์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํฉ๋๋ค.
--tag ํ๋๊ทธ๋ Docker ์ด๋ฏธ์ง์ ํธ์คํธ ์ด๋ฆ(gcr.io)์ ์ง์ ํฉ๋๋ค.
๐ทKubernetes ํด๋ฌ์คํฐ ์์ฑ
์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์คํ ํ GKE ํด๋ฌ์คํฐ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
# Containers API ํ์ฑํ
gcloud services enable container.googleapis.com
# 3๋
ธ๋ GKE ํด๋ฌ์คํฐ ์์ฑ
gcloud container clusters create fancy-cluster-685 \
--zone=europe-west1-b \
--num-nodes=3 \
--machine-type=e2-medium
# ์ธ์ฆ ์๊ฒฉ ์ฆ๋ช
๊ฐ์ ธ์ค๊ธฐ
gcloud container clusters get-credentials fancy-cluster-685 --zone=europe-west1-b์ด๊ฒ์ ์ง์ ๋ ์์ญ์ 3๊ฐ์ e2-medium ๋ ธ๋๋ฅผ ๊ฐ์ง fancy-cluster-685๋ผ๋ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์์ฑํฉ๋๋ค.
๋ ๋ฒ์งธ ๋ช ๋ น์ kubectl์ด ์ด ํด๋ฌ์คํฐ์ ํต์ ํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
ํด๋ฌ์คํฐ ์์ฑ์ ํ์ธํ๊ธฐ ์ํด์๋ ์๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
gcloud compute instances list

์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ํด๋ฌ์คํธ ์ด๋ฆ์ "fancy-cluster-685" ์ด ๋์ด์ผ ํ๋ค. ์ด ์ด๋ฏธ์ง์ฒ๋ผ ์ถ๋ ฅ์ด ๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ ๊ฒ์ด๋ค.
๐ท Kubernetes์ ๋ชจ๋๋ฆฌ์ค ๋ฐฐํฌ
๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฌ์คํฐ์ ๋ฐฐํฌํด ๋ณด๊ฒ ์ต๋๋ค.
# Kubernetes ๋ฐฐํฌ ์์ฑ
kubectl create deployment fancy-monolith-203 \
--image=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:1.0.0
# LoadBalancer ์๋น์ค๋ก ๋ฐฐํฌ ๋
ธ์ถ
kubectl expose deployment fancy-monolith-203 \
--type=LoadBalancer \
--port=80 \
--target-port=8080
# ์ธ๋ถ IP๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์๋น์ค ์ํ ํ์ธ
kubectl get service fancy-monolith-203์ด๊ฒ์ ๋ชจ๋๋ฆฌ์ค ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ฌ Kubernetes ๋ฐฐํฌ๋ฅผ ์์ฑํ ๋ค์ LoadBalancer ์ ํ์ ์๋น์ค๋ก ๋ ธ์ถ์ํต๋๋ค.
์๋น์ค๋ ์ธ๋ถ ํฌํธ 80์ ๋ด๋ถ ์ ํ๋ฆฌ์ผ์ด์ ํฌํธ 8080์ ๋งคํํฉ๋๋ค.
์ด์ ์ธ๋ถ IP ์ฃผ์๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
Kubernetes์ LoadBalancer ์ ํ์ ์๋น์ค๋ก ํธ๋ํฝ์ ๋ณด๋ด๋ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ IP ์ฃผ์๋ฅผ ๊ฐ์ง ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์๋์ผ๋ก ์์ฑํฉ๋๋ค.

์ธ๋ถ ์์ดํผ๊ฐ ๋ถ์ฌ๋๋๋ฐ๋ 1~2๋ถ์ ๋ ์์๋ฉ๋๋ค. <pending> ์ด ๋์ค๋ฉด ์กฐ๊ธ์๋ค๊ฐ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ฉ๋๋ค.
๊ทธ๋์ ์ธ๋ถ ์์ดํผ๋ก ์ ๊ทผํ๋ฉด ์ด๋ฏธ์ง์ฒ๋ผ ์ ์์ ์ผ๋ก ์๋น์ค๊ฐ ๋๋ ๊ฒ์ ๋ณผ์ ์์ต๋๋ค.

๐ท ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํ๊ธฐ
์ ์์ ์ผ๋ก ๋ชจ๋๋ฆฌ์ค๋ก ์๋น์ค ๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ์ด์ ๋ถํฐ ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ชจ๋๋ฆฌ์ค๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํดํด ๋ด ์๋ค.
Orders, Products ๋ฐ Frontend ์๋น์ค๋ฅผ ์ํ ๋ณ๋์ ์ปจํ ์ด๋๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
โ Orders ๋ง์ดํฌ๋ก์๋น์ค
๋จผ์ Orders ์๋น์ค๋ฅผ ์ปจํ ์ด๋ํํ๊ณ ๋ฐฐํฌํด ๋ณด๊ฒ ์ต๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด ํด๋น ํ๋ก์ ํธ๋ ์ด๋ฏธ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ํด ์ฝ๋๋ค์ ๋ถ๋ฆฌ๋ ์ํ์ ๋๋ค.
# Orders ์๋น์ค ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd ~/monolith-to-microservices/microservices/src/orders
# ์ปจํ
์ด๋ ๋น๋ ๋ฐ ํธ์
gcloud builds submit \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-orders-447:1.0.0 .
# Kubernetes์ ๋ฐฐํฌ
kubectl create deployment fancy-orders-447 \
--image=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-orders-447:1.0.0
# ์๋น์ค ๋
ธ์ถ
kubectl expose deployment fancy-orders-447 \
--type=LoadBalancer \
--port=80 \
--target-port=8081
# ์ธ๋ถ IP ๊ฐ์ ธ์ค๊ธฐ
kubectl get service fancy-orders-447
Orders ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ด๋ถ์ ์ผ๋ก ํฌํธ 8081์์ ์ง์ ํ์ต๋๋ค. ๊ธฐ์ตํด ๋์ธ์.
์ด๋ ๋ชจ๋๋ฆฌ์ค๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถํ ํ ๋ ๊ฐ ์๋น์ค๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์์ฒด ํฌํธ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฏธ ์ฝ๋๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌ๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์์ฝ๊ฒ ์๋น์ค๋ฅผ ๋ถ๋ฆฌ ์์ผฐ์ต๋๋ค.
์ด๊ฒ์ ์ด์ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค์ ์ ์ฉํด ์ ๋ฐ์ดํธ๋ฅผ ํ๋ฉด ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ํ์ด ๋ฉ๋๋ค.
๋ชจ๋๋ฆฌ์ค๋ฅผ ์ฌ๊ตฌ์ฑํ์ฌ Orders ๋ง์ดํฌ๋ก์๋น์ค ์ฌ์ฉํ๊ธฐ
์ด์ ๋ชจ๋๋ฆฌ์ค๊ฐ ์๋ก์ด Orders ๋ง์ดํฌ๋ก์๋น์ค๋ก ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค
# ๊ตฌ์ฑ ํ์ผ ํธ์ง
cd ~/monolith-to-microservices/react-app
nano .env.monolith
# REACT_APP_ORDERS_URL=/service/orders
# ์ด๊ฒ์ ์๋์ฒ๋ผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
# REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
# ๋ชจ๋๋ฆฌ์ค ํ๋ก ํธ์๋ ๋ค์ ๋น๋
npm run build:monolith
# ์ปจํ
์ด๋ ๋ค์ ๋น๋ ๋ฐ ์ฌ๋ฐฐํฌ
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:2.0.0 .
kubectl set image deployment/fancy-monolith-203 fancy-monolith-203=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:2.0.0๋ชจ๋๋ฆฌ์ค์์ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๋ ์ด ๋จ๊ณ๊ฐ ์ค์ํฉ๋๋ค.
๋ด๋ถ ํจ์ ํธ์ถ์ ํ๋ ๋์ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ ๋ณ๋์ ์๋น์ค์ HTTP๋ก ์์ฒญ์ ํด์ผ ํฉ๋๋ค.
์ด๊ฒ ์ ์ผ ์ค์ํ ํฌ์ธํธ์ด๋, ๋ฐ๋์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
โ Products ๋ง์ดํฌ๋ก์๋น์ค
์ด์ Products ์๋น์ค๋ฅผ ๋ฐฐํฌํด ๋ณด๊ฒ ์ต๋๋ค.
# Products ์๋น์ค ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd ~/monolith-to-microservices/microservices/src/products
# ์ปจํ
์ด๋ ๋น๋ ๋ฐ ํธ์
gcloud builds submit \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-products-894:1.0.0 .
# Kubernetes์ ๋ฐฐํฌ
kubectl create deployment fancy-products-894 \
--image=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-products-894:1.0.0
# ์๋น์ค ๋
ธ์ถ
kubectl expose deployment fancy-products-894 \
--type=LoadBalancer \
--port=80 \
--target-port=8082
# ์ธ๋ถ IP ๊ฐ์ ธ์ค๊ธฐ
kubectl get service fancy-products-894Products ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ด๋ถ์ ์ผ๋ก ํฌํธ 8082์์ ์คํ๋๋ฉฐ, ์ด๋ ๊ฒ ๋ง์ดํฌ๋ก ์๋น์ค๋ ๋ด๋ถ์ฉ ๊ฐ๋ณ ํฌํธ๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ๊ฒ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.

๋ชจ๋๋ฆฌ์ค ๋ค์ ์ฌ๊ตฌ์ฑํ๊ธฐ
์ด์ Products๋ ๋ถ๋ฆฌ๋์์ผ๋, ์ด์ ์ฒ๋ผ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ ๋ฐ์ดํธ ํด์ผ๊ฒ ์ฃ ?
# ๊ตฌ์ฑ ํ์ผ ํธ์ง
cd ~/monolith-to-microservices/react-app
nano .env.monolith
# ๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๋ชจ๋ ํฌํจํ๋๋ก ๋ณ๊ฒฝ:
# REACT_APP_ORDERS_URL=http://<ORDERS_IP_ADDRESS>/api/orders
# REACT_APP_PRODUCTS_URL=http://<PRODUCTS_IP_ADDRESS>/api/products
# ๋ชจ๋๋ฆฌ์ค ํ๋ก ํธ์๋ ๋ค์ ๋น๋
npm run build:monolith
# ์ปจํ
์ด๋ ๋ค์ ๋น๋ ๋ฐ ์ฌ๋ฐฐํฌ
cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:3.0.0 .
kubectl set image deployment/fancy-monolith-203 fancy-monolith-203=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-monolith-203:3.0.0
์ด๋ ๊ฒ Orders, Products๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌ๋ฅผ ํ์ต๋๋ค.
์ด์ ๋ง์ง๋ง์ผ๋ก frontend๋ง ๋ถ๋ฆฌ ์ํค๋ฉด ๋ฉ๋๋ค.
โ Frontend ๋ง์ดํฌ๋ก์๋น์ค ๋ฐฐํฌ
๋ง์ง๋ง์ผ๋ก, ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ฃํ๊ธฐ ์ํด Frontend ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
# ํ๋ก ํธ์๋ ๊ตฌ์ฑ ์ค๋น
cd ~/monolith-to-microservices/react-app
cp .env.monolith .env
npm run build
# Frontend ์๋น์ค ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd ~/monolith-to-microservices/microservices/src/frontend
# ์ปจํ
์ด๋ ๋น๋ ๋ฐ ํธ์
gcloud builds submit \
--tag gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-frontend-962:1.0.0 .
# Kubernetes์ ๋ฐฐํฌ
kubectl create deployment fancy-frontend-962 \
--image=gcr.io/${GOOGLE_CLOUD_PROJECT}/fancy-frontend-962:1.0.0
# ์๋น์ค ๋
ธ์ถ
kubectl expose deployment fancy-frontend-962 \
--type=LoadBalancer \
--port=80 \
--target-port=8080
# ์ธ๋ถ IP ๊ฐ์ ธ์ค๊ธฐ
kubectl get service fancy-frontend-962
์ด๋ ๊ฒ Orders ๋ฐ Products ๋ง์ดํฌ๋ก์๋น์ค์ ์ง์ ํต์ ํ๋ ์ ์ฉ Frontend ๋ง์ดํฌ๋ก์๋น์ค๋ ๋ฐฐํฌ๋์์ต๋๋ค.
๊ทธ๋ผ ์ด์ ํ์ธ์ ํด ๋ณด๋ฉด ์๋์ ๋น์ทํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณผ์ ์๊ฒ ๋ ๊ฒ๋๋ค.


study jam์ challenge lab์์๋ json ํ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฌผ์ ๋ณผ์ ์์๊ฒ๋๋ค..
โ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค ํ๊ธฐ
์ด์ ๋ชจ๋ ์๋น์ค๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌ๊ฐ ๋์์ต๋๋ค. ๊ทธ๋ผ ์ด์ ๊ธฐ์กด ๋ชจ๋๋ฆฌ์ค๋ฅผ ์ ๊ฑฐํ๋ฉด ๋ฉ๋๋ค.
kubectl delete deployment fancy-monolith-203
kubectl delete service fancy-monolith-203์ค ์์ ์์๋ ๋ชจ๋๋ฆฌ์ค์์ ์๋ก์ด ํ๋ก ํธ์๋๋ก ํธ๋ํฝ์ ๋ฆฌ๋๋ ์ ํ๊ธฐ ์ํ DNS ๋ณ๊ฒฝ ๋ฑ์ ํฌํจํ ์ ์คํ ๊ณํ์ด ํ์ํฉ๋๋ค.
์ ๋๋ก ์์ ์ด ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ ํ์ธ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
kubectl get services
์ด์ ๋น์ทํ ํ๋ฉด์ ๋ณผ์ ์์๊ฒ๋๋ค. (์ด ์ด๋ฏธ์ง๋ ๋ค๋ฅธ ํ ์คํธ์์ ์คํฌ๋ฆฐ์ท์ ์ฐ์ ๊ฒ์ผ๋ก ์ ์์ดํผ์ ์ผ์นํ์ง ์์ผ๋ ์ฃผ์ํ์ธ์.)
๐ท ๊ฒฐ๋ก ๋ฐ ์ฃผ์์ฌํญ
๊ฐ๋จํ ๋ชจ๋๋ฆฌ์ค๋ก ๋ ํ๋ก์ ํธ๋ฅผ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋ถ๋ฆฌ๋ฅผ ํด ๋ณด์์ต๋๋ค. ๊ฐ๋จํ ํํ์ฌ์ ๋ณ๊ฑฐ ์๋๊ฑฐ ๊ฐ์ง๋ง, ์ค ์๋น์ค์ ์ ์ฉ์์๋ ๋ง์ด ๋ณต์กํด ์ง๋๋ค.
๊ฐ๋จํ๋๋ง ์ฃผ์์ฌํญ์ ์ฒดํฌํด ๋ณด๋ฉด..
- ์๋น์ค ๊ฐ ํต์ ๊ด๋ฆฌ: ๋ง์ดํฌ๋ก์๋น์ค๋ ๋คํธ์ํฌ๋ฅผ ํตํด ํต์ ํ๋ฏ๋ก ์ง์ฐ ์๊ฐ์ด ๋ฐ์ํ๊ณ ์ฅ์ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์๋ Istio ๊ฐ์ ์๋น์ค ๋ฉ์๋ฅผ ๋์ ํ์ฌ ํธ๋ํฝ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ๋ณด์์ ๊ฐํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ๋ฐ์ดํฐ ์ผ๊ด์ฑ ํ๋ณด: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ ๋ถํ ์ ๋ต๊ณผ ์ผ๊ด์ฑ ์ ์ง ๋ฐฉ์์ ์ ์คํ๊ฒ ๊ณํํด์ผ ํฉ๋๋ค. ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
- ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ ํ๋ณด: ์ฌ๋ฌ ์๋น์ค๋ก ๋ถ์ฐ๋๋ฉด ๋ฌธ์ ์ถ์ ๊ณผ ๋๋ฒ๊น ์ด ๋ณต์กํด์ง๋๋ค. ํตํฉ๋ ๋ก๊น , ๋ชจ๋ํฐ๋ง, ๋ถ์ฐ ์ถ์ ์์คํ ์ ๊ตฌ์ถํ์ฌ ์ ์ฒด ์์คํ ์ ๊ฐ์์ฑ์ ํ๋ณดํด์ผ ํฉ๋๋ค.
- ๋ณด์ ์ฒด๊ณ ์ฌ์ค๊ณ: ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์๋ ์๋น์ค ๊ฐ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ๊ฐ ๋ ๋ณต์กํด์ง๋๋ค. ์๋น์ค ๊ฐ ์์ ํ ํต์ ์ ์ํ ์ ์ ํ ์ธ์ฆ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
Google Kubernetes Engine(GKE)์ ํ์ฉํ์ฌ ๋ชจ๋๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ก ์ฑ๊ณต์ ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ์ต๋๋ค. ๋ถ๋ฆฌ ์ํค๋ ๊ณผ์ ์ด ์ฝ์ง๋ ์์ง๋ง.. ๊ทธ๋ผ์๋ ๋ถ๋ฆฌ๋ฅผ ํ๋ฉด ์ข์ ์ ์ ๋ค์ ํ๋ฒ ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค.
- ํ์ฅ์ฑ: ๊ฐ ์๋น์ค๋ ๊ฐ๋ณ์ ์ธ ์์์ ๋ง์ถฐ ๋ ๋ฆฝ์ ์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
- ๋ณต์๋ ฅ: ํ ์๋น์ค์ ๋ฐ์ํ ๋ฌธ์ ๊ฐ ๋ค๋ฅธ ์๋น์ค์ ๊ธฐ๋ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์์ ์ ์ฒด ์์คํ ์ ์์ ์ฑ์ด ํฅ์๋ฉ๋๋ค.
- ๊ฐ๋ฐ ๋ฏผ์ฒฉ์ฑ: ๊ฐ๋ฐ ํ์ ๋ค๋ฅธ ์๋น์ค์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์์ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ ์ ์์ด ๊ฐ๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง๋๋ค.
- ๊ธฐ์ ์ ์ ์ฐ์ฑ: ๊ฐ ์๋น์ค๋ง๋ค ์๊ตฌ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๊ธฐ์ ์คํ์ ์ ํํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ง์ google cloud์์ ํ ์คํธ๋ ์ง์ ํด ๋ณด์๋ ค๋ฉด https://www.cloudskillsboost.google/course_templates/638 ์์ ์ค์ตํด ๋ณด์ค์ ์์ต๋๋ค.
ํ ํฐ์ด ์์ด์ผ ํ๋ฉฐ, ๋งค๋ ๊ตฌ๊ธ์์ ํ์ฌํ๋ study jam์ ํตํด์๋ ์ง์ ์ค์ตํด ๋ณผ์ ์์ต๋๋ค.
๊ฐ๋จํ ์ ์ผ๋ ค๊ณ ํ๋๋ฐ, ๋ฌด์ง ๊ธธ์ด์ก๋ค์.
๋ฐ์์ด ์ข์ผ๋ฉด ๋ค๋ฅธ google cloud ์๋น์ค๋ ๊ธฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ค๋๋ ์ข์ ํ๋ฃจ ๋ณด๋ด์๊ธฐ ๋ฐ๋๋๋ค.
๋.
<i>์ด ๊ธ์ ๋ธ๋ก๊ทธ ์ด์ ์ผ๋ก ํฐ์คํ ๋ฆฌ์์ ๊ฐ์ ธ์จ ๊ธ์ ๋๋ค.</i>



๋๊ธ
์๊ฐ์ ๋จ๊ฒจ์ฃผ์ธ์
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธํด ์ฃผ์ธ์.
๋๊ธ ๋ก๊ทธ์ธ ์ค์ ์ด ์์ง ์ค๋น ์ค์ ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.