안녕하세요. Jeff 입니다.

이번에는 클라우드 플랫폼 중 잘 알려진 GCP(Google Cloud Platfrom) 에서 제공하는 GKE(Google Kubernetes Engine) 를 사용하여 컨테이너 웹 애플리케이션을 배포하는 방법을 알아보도록 하겠습니다.

1. GCP 환경 구축

GCP 홈페이지(https://cloud.google.com/) 에 접속하여 Console 로 이동합니다.프로젝트 이름을 임의로 설정하고 프로젝트를 만들어줍니다.
Google Kubernetes Engine API를 사용하기 위해서는 gcloud API, docker, kubernetes command-line tool 이 필요한데, 사용자 로컬을 이용하려면 모두 세팅을 해주어야합니다.<br/>  하지만 구글 클라우드에서는 프로젝트를 생성하게되면 이들이 모두 설정이 되어있는 Google Cloud Shell 을 기본적으로 제공하기 때문에 이를 활용하여 gke를 다루어 보겠습니다.대시보드 오른쪽 상단에 Google Cloud Shell 버튼을 클릭하면 하단에 Cloud-Shell 창이 보이게 됩니다.

2. 컨테이너 이미지 빌드하기

GKE 는 Docker Image를 애플리케이션 형태로 배포할 수 있는데, DockerFile과 애플리케이션이 필요로 합니다. GKE tutorial 에서 제공하는 Go 언어로 작성된 웹 애플리케이션 샘플을 사용하여 진행하도록 하겠습니다. cloud shell console 에서 샘플을 clone 하도록 합니다.gcloud config 에 등록되어 있는 프로젝트의 ID 를 검색해 등록하고, docker 이미지를 build 해줍니다.

Dockerfile 둘러보기

FROM golang:1.8-alpine # golang 1.8-apine 버전을 사용함
ADD . /go/src/hello-app
# 현재 경로에 있는 모든 것을 컨테이너의 /go/src/hello-app 에 추가한다
RUN go install hello-app # 명령어 실행
FROM alpine:latest
COPY --from=0 /go/bin/hello-app .
# 이전 이미지에서 컴파일 된 bin을 이미지로 복사함. --from 옵션은 파일을 복사할 스테이지 수.
ENV PORT 8080 # 8080 포트를 사용
CMD ["./hello-app"] # hello-app 실행

3. Container Registry 에 빌드한 이미지 업로드

GKE 에서 컨테이너 이미지를 사용할 수 있도록 Container Registry에 업로드해야 합니다.Container Registry 인증 및 업로드확인GCP 콘솔 상단 검색창에 Container Registry 를 검색 후 접속하면 이미지가 업로드 된 것이 보입니다.

4. 컨테이너 클러스터 만들기

컨테이너 이미지를 실행할 수 있는 컨테이너 클러스터를 만들어보도록 하겠습니다.

노드가 3개인 hello-cluster 라는 명의 클러스터를 생성합니다.

5. Static IP 할당 받기

서비스를 로드 밸런서를 통하여 노출 시키는 명렁어로 하면 랜덤으로 외부 IP 를 할당 해주게 되는데, 만약 서비스를 지우게 되었을 때 이전에 할당받은 IP로 다시 받을 수가 없습니다. <br/>이를 방지하기 위해 static ip 를 사용자 정의로 생성 후 로드 밸런서에 등록하도록 하겠습니다.static ip 생성 (gcloud shell 기준)

5. 애플리케이션 배포하기

위에서 할당 받은 static ip 를 이용하여 웹 애플리케이션을 배포해보도록 하겠습니다.

이렇게 적용을 시키면 helloweb 로드밸런서에서 외부 ip 를 노출시키는 작업을 하는데 몇분정도 소요됩니다.

$ kubectl get all 
NAME READY STATUS RESTARTS AGE 
pod/hello-web-676b4fd758-t4pm4 1/1 Running 0 40m 

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
service/helloweb LoadBalancer 10.23.249.228 34.97.185.145 80:32370/TCP 40m 
service/helloweb-backend NodePort 10.23.246.247 <none> 8080:30287/TCP 39m 
service/kubernetes ClusterIP 10.23.240.1 <none> 443/TCP 47h 

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
deployment.apps/hello-web 1 1 1 1 40m NAME DESIRED CURRENT READY AGE replicaset.apps/hello-web-676b4fd758 1 1 1 40m
배포한 애플리케이션 확인helloweb 의 외부 ip 주소로 접속해보면 홈페이지가 보이게 됩니다.

참조

ℹ️
Jeff(황윤후)
한국 서버 개발자