GKE 클러스터에 앱 배포


이 빠른 시작에서는 Google Kubernetes Engine(GKE) 클러스터에 간단한 웹 서버의 컨테이너화된 애플리케이션을 배포합니다. 클러스터를 만드는 방법과 사용자가 액세스할 수 있도록 애플리케이션을 클러스터에 배포하는 방법을 설명합니다.

이 페이지를 읽기 전에 Kubernetes를 미리 숙지해야 합니다.

시작하기 전에

다음 단계에 따라 Kubernetes Engine API를 사용 설정합니다.
  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry and Google Kubernetes Engine APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Artifact Registry and Google Kubernetes Engine APIs.

    Enable the APIs

Cloud Shell 실행

이 튜토리얼에서는 Google Cloud에서 호스팅되는 리소스를 관리하기 위한 셸 환경인 Cloud Shell을 사용합니다.

Cloud Shell에는 Google Cloud CLIkubectl 명령줄 도구가 사전 설치되어 있습니다. gcloud 도구는 Google Cloud의 기본 명령줄 인터페이스를 제공하며, kubectl은 Kubernetes 클러스터를 대상으로 명령어를 실행할 수 있는 기본 명령줄 인터페이스를 제공합니다.

Cloud Shell 시작:

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔

  2. 콘솔의 오른쪽 상단에서 Cloud Shell 활성화 버튼을 클릭합니다.

콘솔 하단의 프레임에서 Cloud Shell 세션이 열립니다. 이 셸을 사용하여 gcloudkubectl 명령어를 실행합니다. 명령어를 실행하기 전에 다음 명령어를 사용하여 Google Cloud CLI에서 기본 프로젝트를 설정합니다.

gcloud config set project PROJECT_ID

여기서 PROJECT_ID프로젝트 ID로 바꿉니다.

GKE 클러스터 만들기

클러스터는 한 개 이상의 클러스터 컨트롤 플레인 머신과 노드라는 작업자 머신 여러 개로 구성됩니다. 노드란 클러스터를 구성하기 위해 필요한 Kubernetes 프로세스를 실행하는 Compute Engine 가상 머신(VM) 인스턴스입니다. 클러스터에 애플리케이션을 배포하고 애플리케이션은 노드에서 실행됩니다.

hello-cluster라는 Autopilot 클러스터를 만듭니다.

gcloud container clusters create-auto hello-cluster \
    --location=us-central1

클러스터의 사용자 인증 정보 가져오기

클러스터를 만든 후 클러스터와 상호작용하려면 사용자 인증 정보를 가져와야 합니다.

gcloud container clusters get-credentials hello-cluster \
    --location us-central1

이 명령어는 생성한 클러스터를 사용하도록 kubectl을 구성합니다.

클러스터에 애플리케이션 배포

클러스터가 생성되었으므로 이제 클러스터에 컨테이너화된 애플리케이션을 배포할 수 있습니다. 이 빠른 시작에서는 예시 웹 애플리케이션(hello-app)을 배포 할 수 있습니다.

GKE는 Kubernetes 객체를 사용하여 클러스터의 리소스를 만들고 관리합니다. 웹 서버와 같은 스테이트리스(Stateless) 애플리케이션을 배포할 때는 Kubernetes에서 배포 객체를 사용합니다. 서비스 객체는 인터넷에서 애플리케이션에 액세스하기 위한 규칙과 부하 분산 방식을 정의합니다.

배포 만들기

클러스터에서 hello-app을 실행하려면 다음 명령어를 실행하여 애플리케이션을 배포해야 합니다.

kubectl create deployment hello-server \
    --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

이 Kubernetes 명령어 kubectl create deploymenthello-server라는 배포를 만듭니다. 배포의 포드hello-app 컨테이너 이미지를 실행합니다.

이 명령어에서

  • --image는 배포할 컨테이너 이미지를 지정합니다. 이 경우 명령어는 Artifact Registry 저장소 us-docker.pkg.dev/google-samples/containers/gke/hello-app에서 예시 이미지를 가져옵니다. :1.0은 가져올 특정 이미지 버전을 나타냅니다. 버전을 지정하지 않으면 기본 태그 latest의 이미지가 사용됩니다.

배포 노출

애플리케이션을 배포한 후에는 사용자가 액세스할 수 있도록 이를 인터넷에 노출해야 합니다. 애플리케이션을 외부 트래픽에 노출하는 Kubernetes 리소스인 서비스를 만들어 애플리케이션을 노출할 수 있습니다.

애플리케이션을 노출하려면 다음 kubectl expose 명령어를 실행합니다.

kubectl expose deployment hello-server \
    --type LoadBalancer \
    --port 80 \
    --target-port 8080

--type LoadBalancer 플래그를 전달하면 컨테이너의 Compute Engine 부하 분산기가 생성됩니다. --port 플래그는 인터넷에 공개 포트 80을 초기화하고 --target-port 플래그는 트래픽을 애플리케이션의 포트 8080으로 라우팅합니다.

부하 분산기는 Compute Engine의 부하 분산기 가격 책정에 따라 요금이 청구됩니다.

애플리케이션 검사 및 보기

  1. kubectl get pods를 사용하여 실행 중인 포드를 검사합니다.

    kubectl get pods
    

    클러스터에서 하나의 hello-server 포드가 실행 중임을 볼 수 있을 것입니다.

  2. kubectl get service를 사용하여 hello-server 서비스를 검사합니다.

    kubectl get service hello-server
    

    이 명령어의 출력에서 EXTERNAL-IP 열에 있는 서비스의 외부 IP 주소를 복사합니다.

  3. 외부 IP 주소와 노출된 포트를 사용하여 웹브라우저에서 애플리케이션을 확인합니다.

    http://EXTERNAL_IP
    

GKE에 컨테이너식 웹 애플리케이션을 배포했습니다.

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 수행합니다.

  1. kubectl delete를 실행하여 애플리케이션의 서비스를 삭제합니다.

    kubectl delete service hello-server
    

    이 명령어는 배포를 노출할 때 만든 Compute Engine 부하 분산기를 삭제합니다.

  2. gcloud container clusters delete를 실행하여 클러스터를 삭제합니다.

    gcloud container clusters delete hello-cluster \
        --location us-central1
    

선택사항: hello-app 코드 검토

hello-app은 간단한 웹 서버 애플리케이션으로 main.goDockerfile, 두 파일로 구성됩니다.

hello-appDocker 컨테이너 이미지로 패키징됩니다. 컨테이너 이미지는 Artifact Registry와 같은 Docker 이미지 레지스트리에 저장됩니다. hello-appus-docker.pkg.dev/google-samples/containers/gke/hello-app의 Artifact Registry 저장소에서 호스팅됩니다.

main.go

main.goGo 프로그래밍 언어로 작성된 웹 서버 구현입니다. 서버는 모든 HTTP 요청에 'Hello, world!'라는 메시지로 응답합니다.

package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	// register hello function to handle all requests
	mux := http.NewServeMux()
	mux.HandleFunc("/", hello)

	// use PORT environment variable, or default to 8080
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}

	// start the web server on port and accept requests
	log.Printf("Server listening on port %s", port)
	log.Fatal(http.ListenAndServe(":"+port, mux))
}

// hello responds to the request with a plain-text "Hello, world" message.
func hello(w http.ResponseWriter, r *http.Request) {
	log.Printf("Serving request: %s", r.URL.Path)
	host, _ := os.Hostname()
	fmt.Fprintf(w, "Hello, world!\n")
	fmt.Fprintf(w, "Version: 1.0.0\n")
	fmt.Fprintf(w, "Hostname: %s\n", host)
}

Dockerfile

Dockerfile은 모든 리소스와 종속 항목을 비롯하여 Docker가 빌드할 이미지를 설명하고 앱이 노출해야 하는 네트워크 포트를 지정합니다. 이 파일의 작동 방식에 대한 자세한 내용은 Docker 문서의 Dockerfile 참조를 확인하세요.

FROM golang:1.21.0 as builder
WORKDIR /app
RUN go mod init hello-app
COPY *.go ./
RUN CGO_ENABLED=0 GOOS=linux go build -o /hello-app

FROM gcr.io/distroless/base-debian11
WORKDIR /
COPY --from=builder /hello-app /hello-app
ENV PORT 8080
USER nonroot:nonroot
CMD ["/hello-app"]

다음 단계

직접 사용해 보기

Google Cloud를 처음 사용하는 경우 계정을 만들어 실제 시나리오에서 GKE의 성능을 평가할 수 있습니다. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.

GKE 무료로 사용해 보기