컨테이너 이미지의 앱을 GKE 클러스터에 배포
이 페이지에서는 다음을 수행하는 방법을 보여줍니다.
- Hello World 앱을 만듭니다.
- Cloud Build를 사용하여 앱을 컨테이너 이미지로 패키징합니다.
- Google Kubernetes Engine(GKE)에서 클러스터를 만듭니다.
- 클러스터에 컨테이너 이미지를 배포합니다.
샘플이 몇 가지 언어로 표시되지만, 여기에 표시된 언어 외에 다른 언어도 사용할 수 있습니다.
Cloud Shell 편집기에서 이 태스크의 단계별 안내를 직접 수행하려면 둘러보기를 클릭합니다.
시작하기 전에
- Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
-
Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
-
API Artifact Registry, Cloud Build, and Google Kubernetes Engine 사용 설정
- Google Cloud CLI를 설치합니다.
-
gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.
gcloud init
-
Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
-
API Artifact Registry, Cloud Build, and Google Kubernetes Engine 사용 설정
- Google Cloud CLI를 설치합니다.
-
gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.
gcloud init
-
kubectl
은 GKE에서 사용하는 클러스터 조정 시스템인 Kubernetes를 관리하는 데 사용됩니다.gcloud
를 사용하여kubectl
을 설치할 수 있습니다.gcloud components install kubectl
샘플 앱 작성
GKE에서 실행되는 Hello World 앱을 만드는 방법을 보려면 원하는 언어를 클릭하세요.
Go
helloworld-gke
이라는 새 디렉터리를 만든 후 디렉터리를 다음으로 변경합니다.mkdir helloworld-gke cd helloworld-gke
example.com/helloworld
라는 새 모듈을 만듭니다.go mod init example.com/helloworld
helloworld.go
라는 새 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.이 코드는
PORT
환경 변수에 의해 정의된 포트를 리슨하는 웹 서버를 만듭니다.
앱이 완료되어 Docker 컨테이너에 패키징할 준비가 되고 Artifact Registry에 업로드됩니다.
Node.js
helloworld-gke
라는 새 디렉터리를 만든 후 이 디렉터리로 변경합니다.mkdir helloworld-gke cd helloworld-gke
다음 콘텐츠로
package.json
이라는 파일을 만듭니다.동일한 디렉터리에서
index.js
파일을 만들고 이 파일에 다음 줄을 복사하여 붙여넣습니다.이 코드는
PORT
환경 변수에 의해 정의된 포트를 리슨하는 웹 서버를 만듭니다.
앱이 완료되어 Docker 컨테이너에 패키징할 준비가 되고 Artifact Registry에 업로드됩니다.
Python
helloworld-gke
라는 새 디렉터리를 만든 후 이 디렉터리로 변경합니다.mkdir helloworld-gke cd helloworld-gke
app.py
라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.
자바
Spring Boot 앱을 만듭니다.
자바 SE 8 이상 JDK 및 cURL을 설치합니다. 자바 SE 및 cURL은 다음 단계에서 새 웹 프로젝트를 만들 때에만 필요합니다. 나중에 설명할 Dockerfile은 모든 종속 항목을 컨테이너에 로드합니다.
터미널에서 새로운 빈 웹 프로젝트를 만듭니다.
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d javaVersion=1.8 \ -d type=maven-project \ -d bootVersion=2.6.6 \ -d name=helloworld \ -d artifactId=helloworld \ -d baseDir=helloworld-gke \ -o helloworld-gke.zip unzip helloworld-gke.zip cd helloworld-gke
이제
helloworld-gke
에 새로운 Spring Boot 프로젝트가 준비되었습니다.src/main/java/com/example/helloworld/HelloworldApplication.java
파일에서/
매핑을 처리하도록@RestController
를 추가하여HelloworldApplication
클래스를 업데이트합니다.이 코드는
PORT
환경 변수에 의해 정의된 포트를 리슨하는 웹 서버를 만듭니다.
앱이 완료되어 Docker 컨테이너에 패키징할 준비가 되고 Artifact Registry에 업로드됩니다.
C#
.NET SDK를 설치합니다. .NET SDK는 다음 단계에서 새로운 웹 프로젝트를 만들 때에만 필요합니다. 나중에 설명할
Dockerfile
은 모든 종속 항목을 컨테이너에 로드합니다.터미널에서 새로운 빈 웹 프로젝트를 만듭니다.
dotnet new web -o helloworld-gke
디렉터리를
helloworld-gke
로 변경합니다.cd helloworld-gke
포트
8080
에서 리슨하도록Program.cs
를 업데이트합니다.
앱이 완료되어 Docker 컨테이너에 패키징할 준비가 되고 Artifact Registry에 업로드됩니다.
PHP
helloworld-gke
라는 새 디렉터리를 만든 후 이 디렉터리로 변경합니다.mkdir helloworld-gke cd helloworld-gke
index.php
라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.
앱이 완료되어 Docker 컨테이너에 패키징할 준비가 되고 Artifact Registry에 업로드됩니다.
Cloud Build로 앱 컨테이너화
샘플 앱을 컨테이너화하려면
Dockerfile
이라는 새 파일을 소스 파일과 동일한 디렉터리에 만들고 다음 콘텐츠를 복사합니다.Go
Node.js
로컬 파일이 컨테이너 빌드 프로세스에 영향을 미치지 않도록
.dockerignore
파일을 추가합니다.Python
로컬 파일이 컨테이너 빌드 프로세스에 영향을 미치지 않도록
.dockerignore
파일을 추가합니다.Java
C#
로컬 파일이 컨테이너 빌드 프로세스에 영향을 미치지 않도록
.dockerignore
파일을 추가합니다.PHP
로컬 파일이 컨테이너 빌드 프로세스에 영향을 미치지 않도록
.dockerignore
파일을 추가합니다.Google Cloud 프로젝트 ID를 가져옵니다.
gcloud config get-value project
이 빠른 시작에서는 Artifact Registry에 컨테이너를 저장하고 레지스트리에서 이를 클러스터에 배포합니다. 다음 명령어를 실행하여 클러스터와 동일한 위치에
hello-repo
라는 저장소를 만듭니다.gcloud artifacts repositories create hello-repo \ --project=PROJECT_ID \ --repository-format=docker \ --location=us-central1 \ --description="Docker repository"
다음 값을 바꿉니다.
PROJECT_ID
는 Google Cloud 프로젝트 ID입니다.
Cloud Build를 사용하여 컨테이너 이미지를 빌드합니다. 이는 Google Cloud에서 빌드된다는 점을 제외하고
docker build
및docker push
를 실행하는 것과 유사합니다.gcloud builds submit \ --tag us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke .
이미지는 Artifact Registry에 저장됩니다.
GKE 클러스터 만들기
GKE 클러스터는 단일 GKE 클러스터처럼 작동하는 관리형 Compute Engine 가상 머신 모음입니다.
클러스터를 만듭니다.
gcloud container clusters create-auto helloworld-gke \ --location us-central1
클러스터에 액세스할 수 있는지 확인합니다. 다음 명령어는 준비 및 실행 중이며 클러스터에 액세스할 수 있음을 나타내는 컨테이너 클러스터의 노드를 나열합니다.
kubectl get nodes
오류가 발생하면 Kubernetes 문제 해결 가이드를 참조하세요.
GKE에 배포
만든 GKE 클러스터에 앱을 배포하려면 두 개의 Kubernetes 객체가 필요합니다.
앱 배포
앱에는 웹 요청을 처리하는 프런트엔드 서버가 있습니다. deployment.yaml
이라는 새 파일에서 프런트엔드를 실행하는 데 필요한 클러스터 리소스를 정의합니다. 이러한 리소스는 배포로 설명됩니다. 배포를 통해 ReplicaSet
와 관련 포드를 만들고 업데이트합니다.
다른 파일과 동일한 디렉터리에
deployment.yaml
파일을 만들고 다음 콘텐츠를 복사합니다. 파일에서 다음 값을 바꿉니다.$GCLOUD_PROJECT
는 Google Cloud 프로젝트 ID입니다.$LOCATION
은 저장소 위치입니다(예:us-central1
).
클러스터에 리소스를 배포합니다.
kubectl apply -f deployment.yaml
배포 상태를 추적합니다.
kubectl get deployments
모든
AVAILABLE
배포가READY
상태가 되면 배포가 완료됩니다.NAME READY UP-TO-DATE AVAILABLE AGE helloworld-gke 1/1 1 1 20s
배포에 문제가 있으면
kubectl apply -f deployment.yaml
을 다시 실행하여 변경사항으로 배포를 업데이트합니다.배포가 완료되면 배포를 통해 생성된 포드를 확인할 수 있습니다.
kubectl get pods
서비스 배포
서비스는 포드 집합에 대한 단일 액세스 포인트를 제공합니다. 단일 포드에 액세스할 수 있지만 포드 수명이 짧으므로 서비스 주소를 사용해야 포드에 안정적으로 액세스할 수 있습니다. Hello World 앱에서 'hello' 서비스는 단일 IP 주소에서 hello-app
포드에 액세스하도록 부하 분산기를 정의합니다. 이 서비스는 service.yaml
파일에서 정의됩니다.
다음 콘텐츠로 다른 소스 파일과 같은 디렉터리에
service.yaml
파일을 만듭니다.포드는 포드를 사용하는 서비스와 별도로 정의됩니다. Kubernetes는 라벨을 사용하여 서비스에서 주소를 지정하는 포드를 선택합니다. 라벨을 사용하면 하나의 서비스에서 다양한 복제본 세트의 포드에 주소를 지정할 수 있고 여러 서비스에서 개별 포드를 가리킬 수도 있습니다.
Hello World 서비스를 만듭니다.
kubectl apply -f service.yaml
서비스의 외부 IP 주소를 가져옵니다.
kubectl get services
IP 주소를 할당하는 데 최대 60초가 걸릴 수 있습니다. 외부 IP 주소는
hello
서비스의EXTERNAL-IP
열 아래에 나열됩니다.NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello LoadBalancer 10.22.222.222 35.111.111.11 80:32341/TCP 1m kubernetes ClusterIP 10.22.222.1 <none> 443/TCP 20m
배포된 앱 보기
이제 GKE에서 Hello World 앱을 실행하는 데 필요한 모든 리소스를 배포했습니다.
이전 단계의 외부 IP 주소를 사용하여 웹브라우저에 앱을 로드하고 실행 중인 앱을 확인합니다.
http://EXTERNAL_IP
또는 서비스의 외부 IP 주소에 curl
을 호출할 수 있습니다.
curl EXTERNAL_IP
출력이 다음과 같이 표시됩니다.
Hello World!
삭제
이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.
Artifact Registry의 컨테이너 이미지뿐만 아니라 클러스터에서 실행 중인 Compute Engine 인스턴스에 대한 비용이 청구됩니다.프로젝트 삭제
Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.
클러스터 및 컨테이너 삭제
프로젝트를 보존하면서 이 튜토리얼에서 사용된 리소스만 삭제하려면 클러스터와 이미지를 삭제합니다.
Google Cloud CLI를 사용하여 클러스터를 삭제하려면 사용한 모드에 다음 명령어를 실행합니다.
gcloud container clusters delete helloworld-gke \
--location us-central1
Artifact Registry 저장소에서 이미지를 삭제하려면 다음 명령어를 실행합니다.
gcloud artifacts docker images delete \
us-central1-docker.pkg.dev/PROJECT_ID/hello-repo/helloworld-gke
다음 단계
Kubernetes에 대한 자세한 내용은 다음을 참조하세요.
- 클러스터 만드는 방법 자세히 알아보기
- Kubernetes에 대해 알아보기
kubectl
참조 문서 읽어보기
GKE에 배포하는 것에 대한 자세한 내용은 다음을 참조하세요.
- 간단한 웹 서버 애플리케이션을 패키징, 호스팅, 배포하는 방법 알아보기
- Redis 및 PHP를 사용하여 다중 계층 웹 애플리케이션 만들기
- 영구 디스크 및 Cloud SQL로 GKE에서 WordPress 배포하기
- GKE의 Cloud Run 설정하기
Cloud Code를 사용하여 IDE에서 직접 GKE에서 애플리케이션을 만들고 개발하고 실행하는 방법에 대한 자세한 내용은 다음을 참조하세요.