이 가이드에서는 웹 애플리케이션을 Docker 컨테이너 이미지에 패키징하고 Google Kubernetes Engine(GKE) 클러스터에서 이 컨테이너 이미지를 실행하는 방법을 설명합니다. 그러면 사용자는 사용자 니즈에 따라 확장 가능한 부하 분산된 복제본 세트로서 웹 애플리케이션을 배포하게 됩니다.
이 페이지는 클라우드 리소스를 프로비저닝 및 구성하고 앱과 서비스를 배포하는 운영자 및 개발자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반 역할과 예시 태스크에 대한 자세한 내용은 일반 GKE Enterprise 사용자 역할 및 태스크를 참조하세요.
목표
- 샘플 웹 애플리케이션을 Docker 이미지로 패키징합니다.
- Artifact Registry에 Docker 이미지를 업로드합니다.
- GKE 클러스터를 만듭니다.
- 샘플 앱을 클러스터에 배포합니다.
- 배포의 자동 확장을 관리합니다.
- 샘플 앱을 인터넷에 노출합니다.
- 샘플 앱의 새 버전 배포
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, Artifact Registry, and Google Kubernetes Engine APIs.
Cloud Shell 활성화
Cloud Shell에는 이 튜토리얼에서 사용되는 gcloud
, docker
, kubectl
명령줄 도구가 사전 설치되어 있습니다.
- Google Cloud 콘솔로 이동합니다.
Google Cloud 콘솔 창 상단의 Cloud Shell 활성화 버튼을 클릭합니다.
Google Cloud 콘솔 하단에 있는 새 프레임 내에 Cloud Shell 세션이 열리면서 명령줄 프롬프트가 표시됩니다.
저장소 만들기
이 튜토리얼에서는 Artifact Registry에 이미지를 저장하고 레지스트리에서 배포합니다. 이 빠른 시작에서는 hello-repo
라는 저장소를 만듭니다.
PROJECT_ID
환경 변수를 Google Cloud 프로젝트 ID(PROJECT_ID
)로 설정합니다. 컨테이너 이미지를 빌드하고 저장소에 푸시할 때 이 환경 변수를 사용합니다.export PROJECT_ID=PROJECT_ID
PROJECT_ID
환경 변수 값이 올바른지 확인합니다.echo $PROJECT_ID
Google Cloud CLI의 프로젝트 ID를 설정합니다.
gcloud config set project $PROJECT_ID
출력:
Updated property [core/project].
다음 명령어를 사용하여
hello-repo
저장소를 만듭니다.gcloud artifacts repositories create hello-repo \ --repository-format=docker \ --location=REGION \ --description="Docker repository"
REGION
을us-west1
과 같은 저장소의 리전으로 바꿉니다. 사용 가능한 위치 목록을 보려면 다음 명령어를 실행합니다.gcloud artifacts locations list
컨테이너 이미지 빌드
이 튜토리얼에서는 샘플 웹 애플리케이션인 hello-app
을 배포합니다. 이 애플리케이션은 Go로 작성된 웹 서버로, 모든 요청에 대해 포트 8080에서 Hello, World!
로 응답합니다.
GKE는 Docker 이미지를 애플리케이션 배포 형식으로 허용합니다.
hello-app
을 GKE에 배포하기 전에 hello-app
소스 코드를 Docker 이미지로 패키징해야 합니다.
Docker 이미지를 빌드하려면 소스 코드와 Dockerfile이 있어야 합니다. Dockerfile에는 이미지 빌드 방법에 대한 안내가 포함되어 있습니다.
다음 명령어를 실행하여
hello-app
소스 코드와 Dockerfile을 다운로드합니다.git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/quickstarts/hello-app
hello-app
의 Docker 이미지를 빌드하고 태그를 지정합니다.docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .
이 명령어는 현재 디렉터리에서
Dockerfile
을 사용하여 이미지를 빌드하고, 로컬 환경에 저장하고,us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1
과 같은 이름으로 태그를 지정하도록 Docker에 지시합니다. 다음 섹션에서 이미지가 Artifact Registry로 푸시됩니다.PROJECT_ID
변수는 컨테이너 이미지를 Google Cloud 프로젝트의hello-repo
저장소와 연결합니다.us-west1-docker.pkg.dev
프리픽스는 저장소의 리전 호스트인 Artifact Registry를 나타냅니다.
docker images
명령어를 실행하여 빌드가 성공했는지 확인합니다.docker images
출력:
REPOSITORY TAG IMAGE ID CREATED SIZE us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 seconds ago 54 MB
서비스 계정에 IAM 정책 바인딩을 추가합니다.
gcloud artifacts repositories add-iam-policy-binding hello-repo \ --location=REGION \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role="roles/artifactregistry.reader"
PROJECT_NUMBER
를 프로젝트의 프로젝트 번호로 바꿉니다.
로컬에서 컨테이너 실행(선택사항)
로컬 Docker 엔진을 사용하여 컨테이너 이미지를 테스트합니다.
docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
웹 미리보기 버튼 을 클릭한 다음
8080
포트 번호를 선택합니다. GKE의 새로운 브라우저 창이 열리고 프록시 서비스의 미리보기 URL이 표시됩니다.
Artifact Registry에 Docker 이미지 푸시
GKE 클러스터에서 컨테이너 이미지를 다운로드하고 실행할 수 있도록 컨테이너 이미지를 레지스트리에 업로드해야 합니다. 이 튜토리얼에서는 Artifact Registry에 컨테이너를 저장합니다.
Artifact Registry에 인증하도록 Docker 명령줄 도구를 구성합니다.
gcloud auth configure-docker REGION-docker.pkg.dev
방금 빌드한 Docker 이미지를 저장소로 푸시합니다.
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
GKE 클러스터 만들기
이제 Docker 이미지가 Artifact Registry에 저장되었으므로 GKE 클러스터를 만들어 hello-app
을 실행합니다. GKE 클러스터는 GKE를 구동하는 오픈소스 클러스터 조정 시스템인 Kubernetes를 실행하는 Compute Engine VM 인스턴스의 풀로 구성됩니다.
Cloud Shell
Compute Engine 리전을 설정합니다.
gcloud config set compute/region REGION
표준 영역 클러스터의 경우 Artifact Registry 저장소와 가장 가까운 Compute Engine 영역을 설정합니다.
hello-cluster
라는 클러스터를 만듭니다.gcloud container clusters create-auto hello-cluster
GKE 클러스터를 만들고 상태를 확인하는 데 몇 분 정도 걸립니다. GKE Standard 클러스터에서 이 튜토리얼을 실행하려면 대신
gcloud container clusters create
명령어를 사용합니다.
콘솔
Google Cloud 콘솔에서 Google Kubernetes Engine 페이지로 이동합니다.
add_box만들기를 클릭합니다.
GKE Autopilot에서 구성을 클릭합니다.
이름 필드에
hello-cluster
이름을 입력합니다.리전 드롭다운 목록에서
us-west1
과 같은 Compute Engine 리전을 선택합니다.만들기를 클릭합니다.
클러스터가 생성될 때까지 기다립니다. 클러스터가 준비되면 클러스터 이름 옆에 체크표시가 나타납니다.
GKE에 샘플 앱 배포
이제 빌드한 Docker 이미지를 GKE 클러스터에 배포할 준비가 되었습니다.
Kubernetes는 애플리케이션을 하나 이상의 컨테이너를 포함하는 확장 가능한 단위인 포드로 나타냅니다. 포드는 Kubernetes에서 배포 가능한 최소 단위입니다. 일반적으로 포드를 클러스터 전체에 걸쳐 함께 확장하고 배포할 수 있는 복제본 집합으로 배포합니다. 복제본 세트를 배포하는 한 가지 방법은 Kubernetes 배포를 사용하는 것입니다.
이 섹션에서는 클러스터에서 hello-app
이 실행되도록 Kubernetes 배포를 만듭니다. 이 배포에는 복제본(포드)이 있습니다. 배포 포드 하나에는 컨테이너 하나(hello-app
Docker 이미지)만 포함됩니다.
또한 CPU 부하를 기준으로 포드 수를 3개부터 1~5개까지 확장하는 HorizontalPodAutoscaler 리소스를 만듭니다.
Cloud Shell
GKE 클러스터에 연결되어 있는지 확인합니다.
gcloud container clusters get-credentials hello-cluster --region REGION
hello-app
Docker 이미지의 Kubernetes 배포를 만듭니다.kubectl create deployment hello-app --image=REGION-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
출력:
NAME READY STATUS RESTARTS AGE hello-app-784d7569bc-hgmpx 1/1 Running 0 90s hello-app-784d7569bc-jfkz5 1/1 Running 0 90s hello-app-784d7569bc-mnrrl 1/1 Running 0 95s
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
add_box 배포를 클릭합니다.
컨테이너 지정 섹션에서 기존 컨테이너 이미지를 선택합니다.
이미지 경로 필드에서 선택을 클릭합니다.
컨테이너 이미지 선택 창에서 Artifact Registry에 푸시한
hello-app
이미지를 선택하고 선택을 클릭합니다.컨테이너 섹션에서 완료를 클릭한 후 계속을 클릭합니다.
구성 섹션의 라벨에서 키에
app
을, 값에hello-app
을 입력합니다.구성 YAML에서 YAML 보기를 클릭합니다. 그러면 클러스터에 배포할 Kubernetes API 리소스 두 개(배포 하나, 배포의
HorizontalPodAutoscaler
하나)를 나타내는 YAML 구성 파일이 열립니다.닫기를 클릭한 후 배포를 클릭합니다.
배포 포드가 준비되면 배포 세부정보 페이지가 열립니다.
관리형 포드에서
hello-app
배포를 위해 3개의 실행 중인 포드를 확인합니다.
샘플 앱을 인터넷에 노출
포드에는 개별적으로 할당된 IP 주소가 있지만 클러스터 내에서만 이러한 IP에 연결할 수 있습니다. 또한 GKE 포드는 확장 요구에 따라 시작 또는 중지할 수 있도록 임시 설계되었습니다. 또한 오류로 인해 포드가 다운되면 GKE는 해당 포드를 자동으로 다시 배포하여 매번 새 포드 IP 주소를 할당합니다.
즉, 모든 배포에서 활성 포드 집합에 해당하는 IP 주소 집합은 동적입니다. 1) 포드를 하나의 정적 호스트 이름으로 그룹화하고 2) 클러스터 외부의 포드 그룹을 인터넷에 노출하는 방법이 필요합니다.
Kubernetes 서비스는 이 두 가지 문제를 해결합니다.
서비스 그룹 포드는 클러스터 내의 모든 포드에서 연결할 수 있는 하나의 고정 IP 주소로 그룹화됩니다.
또한 GKE는 고정 IP에 DNS 호스트 이름을 할당합니다. 예를 들면 hello-app.default.svc.cluster.local
입니다.
GKE의 기본 서비스 유형을 ClusterIP라고 하며, 여기서 서비스는 클러스터 내부에서만 연결할 수 있는 IP 주소를 가져옵니다.
클러스터 외부에서 Kubernetes 서비스를 노출하려면 LoadBalancer
유형의 서비스를 만듭니다.
이 유형의 서비스는 인터넷을 통해 연결할 수 있는 포드 모음에 외부 부하 분산기 IP를 생성합니다.
이 섹션에서는 LoadBalancer
유형의 서비스를 사용하여 hello-app
배포를 인터넷에 노출합니다.
Cloud Shell
kubectl expose
명령어를 사용하여hello-app
배포를 위한 Kubernetes 서비스를 생성합니다.kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080
여기에서
--port
플래그는 부하 분산기에 구성된 포트 번호를 지정하고--target-port
플래그는hello-app
컨테이너가 리슨하는 포트 번호를 지정합니다.다음 명령어를 실행하여
hello-app-service
의 서비스 세부정보를 가져옵니다.kubectl get service
출력:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s
EXTERNAL_IP
주소를 클립보드에 복사합니다(예:203.0.113.0
).
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
hello-app을 클릭합니다.
배포 세부정보 페이지에서 list 작업 > 노출을 클릭합니다.
노출 대화상자에서 대상 포트를
8080
으로 설정합니다.hello-app
컨테이너가 리슨하는 포트입니다.서비스 유형 드롭다운 목록에서 부하 분산기를 선택합니다.
노출을 클릭하여
hello-app
용 Kubernetes 서비스를 만듭니다.부하 분산기가 준비되면 서비스 세부정보 페이지가 열립니다.
외부 엔드포인트 필드까지 아래로 스크롤하고 IP 주소를 복사합니다.
hello-app
포드가 Kubernetes 서비스를 통해 인터넷에 노출됩니다. 이제 새 브라우저 탭을 열고 클립보드에 복사한 서비스 IP 주소로 이동할 수 있습니다. Hello, World!
메시지가 Hostname
필드와 함께 표시됩니다. Hostname
은 브라우저에 HTTP 요청을 제공하는 hello-app
포드 세 개 중 하나에 해당합니다.
샘플 앱의 새 버전 배포
이 섹션에서는 새 Docker 이미지를 빌드하고 GKE 클러스터에 배포하여 hello-app
을 새 버전으로 업그레이드합니다.
Kubernetes 순차적 업데이트를 사용하면 다운타임 없이 배포를 업데이트할 수 있습니다. 순차적 업데이트 중에 GKE 클러스터는 기존 hello-app
포드를 새 버전의 Docker 이미지가 포함된 포드로 점진적으로 대체합니다.
업데이트하는 동안 부하 분산기 서비스가 트래픽을 이용 가능한 포드로만 라우팅합니다.
hello 앱 소스 코드와 Dockerfile을 클론한 Cloud Shell로 돌아갑니다.
main.go
파일의hello()
함수를 업데이트하여 새 버전2.0.0
을 보고하세요.새
hello-app
Docker 이미지를 빌드하고 태그를 지정합니다.docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .
이미지를 Artifact Registry로 내보내기
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
이제 새 Docker 이미지를 사용하도록 hello-app
Kubernetes 배포를 업데이트할 준비가 되었습니다.
Cloud Shell
kubectl set image
명령어를 사용하여 이미지 업데이트로 기존hello-app
배포에 순차적 업데이트를 적용합니다.kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
v1
이미지 중지를 실행하는 실행 중인 포드와v2
이미지 시작을 실행하는 새 포드를 확인합니다.watch kubectl get pods
출력:
NAME READY STATUS RESTARTS AGE hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s hello-app-89dc45f48-scm66 1/1 Running 0 2m40s
별도의 탭에서
hello-app-service
외부 IP로 다시 이동합니다. 이제Version
이2.0.0.
로 설정됩니다.
콘솔
Google Cloud 콘솔에서 워크로드 페이지로 이동합니다.
hello-app을 클릭합니다.
배포 세부정보 페이지에서 list 작업 > 순차적 업데이트를 클릭합니다.
순차적 업데이트 대화상자에서 hello-app 이미지 필드를
REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2
로 설정합니다.업데이트를 클릭합니다.
배포 세부정보 페이지에서 활성 버전 섹션을 검사합니다. 이제 두 가지 버전인 1과 2가 표시됩니다. 버전 1은 앞서 만든 초기 배포에 해당하며, 버전 2는 방금 시작한 순차적 업데이트입니다.
잠시 후 페이지를 새로고침합니다. 관리형 포드에서 이제 모든
hello-app
복제본이 버전 2에 해당합니다.별도의 탭에서 복사한 서비스 IP 주소로 다시 이동합니다.
Version
은2.0.0.
이어야 합니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
서비스 삭제: 서비스용으로 생성된 Cloud 부하 분산기를 할당 해제합니다.
kubectl delete service hello-app-service
클러스터 삭제: 컴퓨팅 인스턴스, 디스크, 네트워크 리소스와 같이 클러스터를 구성하는 리소스를 삭제합니다.
gcloud container clusters delete hello-cluster --region REGION
컨테이너 이미지 삭제: Artifact Registry에 푸시한 Docker 이미지를 삭제합니다.
gcloud artifacts docker images delete \ REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 \ --delete-tags --quiet gcloud artifacts docker images delete \ REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 \ --delete-tags --quiet
다음 단계
웹 애플리케이션의 고급 부하 분산 구성을 보여 주는 부하 분산기 튜토리얼 읽기
애플리케이션의 고정 IP와 도메인 이름 구성하기
다른 Kubernetes Engine 튜토리얼 살펴보기
Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터를 확인하세요.
직접 사용해 보기
Google Cloud를 처음 사용하는 경우 계정을 만들어 실제 시나리오에서 GKE의 성능을 평가할 수 있습니다. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
GKE 무료로 사용해 보기