본문 바로가기
CSP (Cloud Service Provider)/GCP

GCP에서 컨테이너화된 웹 애플리케이션 배포하기

by BTC_문돌이 2022. 5. 4.

안녕하세요~! BTC Hallo팀입니다. 오늘은 GCP에서 컨테이너화 된 웹 애플리케이션 배포하기 실습에 대해 소개해 드리겠습니다.

 

GCP 문서를 참고하여 웹 애플리케이션을 Docker 컨테이너 이미지에 패키징하고 GKE 클러스터에서 컨테이너 이미지를 실행하고, 사용자 니즈에 따라 확장 가능한 부하 분산된 복제본 세트로서 웹 애플리케이션을 배포했습니다.

저장소 만들기

Artifact Registry에 이미지를 저장하고 레지스트리에서 배포합니다. Artifact Registry는 Google Cloud에서 권장되는 Container Registry입니다. hello-repo라는 저장소를 만들었습니다.

gcloud artifacts repositories create hello-repo \
   --repository-format=docker \
   --location=us-west1 \
   --description="Docker repository"

 

컨테이너 이미지 빌드

모든 요청에 대해 포트 8080에서 Hello, World!로 응답하는 샘플 웹 애플리케이션인 hello-app을 배포합니다.
hello-app을 GKE에 배포하기 전에 hello-app 소스 코드를 Docker 이미지로 패키징해야 합니다. Docker 이미지를 빌드하려면 소스 코드와 Dockerfile이 있어야 합니다.

#hello-app 소스 코드와 Dockerfile 다운로드
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples		
cd kubernetes-engine-samples/hello-app	

#hello-app Docker 이미지 빌드
docker build -t us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .

#빌드 확인
docker images

 

Artifact Registry에 Docker 이미지 푸시

GKE 클러스터에서 컨테이너 이미지를 다운로드하고 실행할 수 있도록 컨테이너 이미지를 레지스트리에 업로드합니다.

#Artifact Registry에 인증
gcloud auth configure-docker us-west1-docker.pkg.dev

#Docker 이미지를 저장소로 푸시
docker push us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1

 

GKE 클러스터 만들기

GKE 클러스터를 만들어 hello-app을 실행합니다.

#hello-cluster 클러스터 생성
gcloud config set compute/zone us-west1
gcloud container clusters create hello-cluster

#노드 확인
kubectl get nodes

 

GKE에 샘플 앱 배포

클러스터에서 hello-app이 실행되도록 Kubernetes 배포를 만듭니다. 이 배포에는 복제본(포드)이 있으며, 배포 포드 하나에는 컨테이너 하나(hello-app Docker 이미지)만 포함됩니다. 또한 CPU 부하를 기준으로 포드 수를 3개부터 1~5개까지 확장하는 HorizontalPodAutoscaler 리소스를 만듭니다.

#GKE 클러스터에 연결되어 있는지 확인
gcloud container clusters get-credentials hello-cluster --zone us-west1
	
#'hello-app' Docker 이미지의 Kubernetes 배포 생성
kubectl create deployment hello-app --image=us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1

# 배포 복제본의 기준 수를 3으로 설정
kubectl scale deployment hello-app --replicas=3

#배포에 대한 HorizontalPodAutoscaler 리소스 생성
kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5

#포드 확인	
kubectl get pods

 

 

샘플 앱을 인터넷에 노출

포드에는 개별적으로 할당된 IP 주소가 있지만 클러스터 내에서만 이러한 IP에 연결할 수 있습니다. 그리고 모든 배포에서 활성 포드 집합에 해당하는 IP 주소 집합은 동적입니다.
따라서 포드를 하나의 정적 호스트 이름으로 그룹화하고 포드 그룹을 인터넷에 노출하는 방법이 필요합니다.
Kubernetes에서 서비스 그룹 포드는 클러스터 내의 모든 포드에서 연결할 수 있는 하나의 고정 IP 주소로 그룹화되고, GKE는 고정 IP에 DNS 호스트 이름을 할당합니다.
GKE의 기본 서비스 유형을 ClusterIP라고 하며, 여기서 서비스는 클러스터 내부에서만 연결할 수 있는 IP 주소를 가져옵니다. 클러스터 외부에서 Kubernetes 서비스를 노출하려면 LoadBalancer 유형의 서비스를 만들어야 하는데, 이 유형의 서비스는 인터넷을 통해 연결할 수 있는 포드 모음에 외부 부하 분산기 IP를 생성합니다.
LoadBalancer 유형의 서비스를 사용하여 hello-app 배포를 인터넷에 노출했습니다.

#hello-app 배포를 위한 kubernetes 서비스를 생성
#--port 플래그는 부하 분산기에 구성된 포트 번호를 지정
#--target-port 플래그는 hello-app 컨테이너가 리슨하는 포트 번호를 지정
kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080

#hello-app-service 서비스 확인
kubectl get service

#EXTERNAL_IP 주소로 확인

 

 

샘플 앱의 새 버전 배포

새 Docker 이미지를 빌드하고 GKE 클러스터에 배포하여 hello-app을 새 버전으로 업그레이드합니다. GKE의 순차적 업데이트 기능을 사용하면 다운타임 없이 배포를 업데이트할 수 있습니다. 순차적 업데이트 중에 GKE 클러스터는 기존 hello-app 포드를 새 버전의 Docker 이미지가 포함된 포드로 점진적으로 대체합니다. 업데이트하는 동안 부하 분산기 서비스가 트래픽을 이용 가능한 포드로만 라우팅합니다.

#main.go 파일을 업데이트 후 새로운 'hello-app' Docker 이미지를 빌드
docker build -t us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .

#이미지를 Afrtifact Registry로 내보내기
docker push us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2

#기존 hello-app 배포에 순차적으로 업데이트 적용
kubectl set image deployment/hello-app hello-app=us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2

#v1 이미지 중지를 실행하는 실행 중인 포드와 v2 이미지 시작을 실행하는 새 포드 확인
watch kubectl get pods

 

삭제

#서비스 삭제 : 서비스용으로 생성된 Cloud 부하 분산기를 할당 해제
kubectl delete service hello-app-service

#클러스터 삭제 : 컴퓨팅 인스턴스, 디스크, 네트워크 리소스와 같이 클러스터를 구성하는 리소스 삭제
gcloud container clusters delete hello-cluster --zone us-west1-a

#컨테이너 이미지 삭제 : Artficat Registry에 푸시한 Docker 이미지 삭제
gcloud artifacts docker images delete \
    us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 \
    --delete-tags --quiet
gcloud artifacts docker images delete \
    us-west1-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 \
    --delete-tags --quiet

 

 

[출처]
https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app?hl=ko

댓글