Build a Website on Google Cloud

목록
- Deploy Your Website on Cloud Run
- Host a Web App on Google Cloud Using Compute Engine
- Deploy, Scale, and Update Your Website on Google Kubernetes Engine ⬅️ 오늘의 Lab!
- Migrating a Monolithic Website to Microservices on Google Kubernetes Engine
- Case Study: Hosting Scalable web apps on Google Cloud
- Build a Website on Google Cloud: Challenge Lab


# lab zone을 할당받은 실습용 zone으로 변경
gcloud config set compute/zone lab zone
GKE ✨
Google Kubernetes Engine의 약자로, Google Cloud에서 컨테이너화된 애플리케이션을 배포, 확장 및 관리하기 위한 관리형 프로덕션 환경용 컨테이너 오케스트레이션 서비스

gcloud container clusters create fancy-cluster --num-nodes 3
➡️ 3개의 노드가 있는 fancy-cluster 생성
➡️ 클러스터를 만드는 데 몇 분의 시간이 소요된다.

gcloud compute instances list


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

cd ~/monolith-to-microservices
./setup.sh

nvm install --lts

cd ~/monolith-to-microservices/monolith
npm start

참고✨
Docker 컨테이너를 빌드하고 레지스트리에 푸시하여 GKE가 가져올 이미지를 저장하는 2단계 방식을, Cloud Build를 사용하여 단일 명령어로 Docker 컨테이너 빌드 및 이미지를 Artifact Registry에 넣을 수 있다.

gcloud services enable cloudbuild.googleapis.com

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .
참고✨
🚀 이 명령어를 실행하면 일어나는 일
- 소스 업로드: 현재 폴더(
.)의 파일들을 구글 클라우드 스토리지로 압축해서 보낸다.- 클라우드 빌드: 구글 서버 내에서
Dockerfile을 읽어 컨테이너 이미지를 만든다.- 이미지 저장: 완성된 이미지를
gcr.io라는 저장소에 업로드한다.
- 확인: 빌드가 성공하면 나중에 이 이미지를 가져다가 GKE(Kubernetes)나 Cloud Run 같은 서비스에서 바로 실행할 수 있다.
➡️ 웹사이트를 컨테이너화하고, 컨테이너를 Artifact Registry에 푸시하는 과정을 한 것이다!

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0
➡️ 지정된 컨테이너 이미지를 기반으로, 쿠버네티스 클러스터 내에 monolith라는 이름의 Deployment 리소스를 생성하여 앱을 가동시킨다.
참고✨
GKE 클러스터에서 애플리케이션을 배포하고 관리하려면 Kubernetes 클러스터 관리 시스템과 통신해야 한다. 일반적으로는
kubectl명령줄 도구를 사용하여 이 작업을 수행한다.
- Kubernetes에서는 애플리케이션을 Pods로 나타낸다.
- Pods는 Kubernetes에서 배포 가능한 최소 단위이다.

kubectl get all
➡️ 현재 배포
➡️ 원하는 포드 수가 1인 ReplicaSet
➡️ 실행 중인 Pod

# Show pods
kubectl get pods
# Show deployments
kubectl get deployments
# Show replica sets
kubectl get rs
# 여러가지 한 번에 보기
kubectl get pods,deployments
참고
GKE에 애플리케이션을 배포했지만, GKE에서 실행하는 컨테이너에는 외부 IP 주소가 없으므로 인터넷에서 이 컨테이너에 액세스할 수 없다.
Service Resource를 통해 애플리케이션을 인터넷 트래픽에 명시적으로 노출시켜야 한다.

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

kubectl get service

➡️ 애플리케이션의 외부 IP 주소를 확인한 후, IP 주소를 복사한 다음 브라우저에서 URL(예: http://x.x.x.x)로 접속하여 애플리케이션에 액세스할 수 있는지 확인한다.
➡️ 동일한 웹사이트가 표시되면 정상!
kubectl scale deployment monolith --replicas=3
➡️ monolith라는 이름으로 실행 중인 배포의 규모를 조절
➡️ --replicas=3: 실행할 복제본(Pod)의 총 개수를 3개로 맞추기
➡️ 트래픽 대응(부하분산) 및 고가용성 확보를 위하여 적용한다.

kubectl get all

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js

cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

cd ~/monolith-to-microservices/react-app
npm run build:monolith

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

kubectl get pods

npm start


cd ~
rm -rf monolith-to-microservices

# Delete the container image for version 1.0.0 of the monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet
# Delete the container image for version 2.0.0 of the monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

# The following command will take all source archives from all builds and delete them from cloud storage
# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'
gcloud builds list | grep 'SOURCE' | cut -d ' ' -f2 | while read line; do gsutil rm $line; done

kubectl delete service monolith
kubectl delete deployment monolith

gcloud container clusters delete fancy-cluster lab region