학습 과정: 모놀리식 앱을 GKE 앱으로 변환 - 모듈식 앱 컨테이너화


이 튜토리얼은 모놀리식 앱을 모듈화하고 컨테이너화하는 방법을 안내하는 학습 과정의 네 번째 튜토리얼입니다.

학습 과정은 다음 튜토리얼로 구성됩니다.

  1. 개요
  2. 모놀리식 이해하기
  3. 모놀리식 모듈화
  4. 컨테이너화를 위한 모듈식 앱 준비
  5. 모듈식 앱 컨테이너화 (이 튜토리얼)
  6. GKE 클러스터에 앱 배포

이전 튜토리얼인 컨테이너화 준비를 위한 모듈식 앱에서는 컨테이너화를 위해 Cymbal Books 앱의 모듈식 버전을 어떻게 변경해야 하는지 알아봤습니다. 이 튜토리얼에서는 앱을 컨테이너화합니다.

비용

이 튜토리얼은 비용 없이 완료할 수 있습니다. 하지만 이 시리즈의 다음 튜토리얼에 나온 단계를 따르면Google Cloud 계정에 요금이 청구됩니다. GKE를 사용 설정하고 Cymbal Books 앱을 GKE 클러스터에 배포하면 비용이 청구됩니다. 여기에는 가격 페이지에 설명된 대로 GKE의 클러스터당 요금과 Compute Engine VM 실행 요금이 포함됩니다.

불필요한 요금이 청구되지 않도록 하려면 이 튜토리얼을 완료한 후 GKE를 사용 중지하거나 프로젝트를 삭제하세요.

시작하기 전에

이 튜토리얼을 시작하기 전에 이 시리즈의 이전 튜토리얼을 완료했는지 확인하세요. 전체 시리즈의 개요와 특정 튜토리얼 링크는 학습 과정: 모놀리식을 GKE 앱으로 변환 - 개요를 참고하세요.

환경 설정

이 섹션에서는 모듈식 앱을 컨테이너화하는 환경을 설정합니다. 구체적으로 다음 단계를 실행합니다.

  1. Google Cloud 프로젝트 선택 또는 만들기
  2. 필요한 API 사용 설정
  3. Cloud Shell을 Google Cloud 프로젝트에 연결
  4. 기본 환경 변수 설정
  5. Artifact Registry에서 저장소 만들기
  6. Artifact Registry용 Docker 구성
  7. 튜토리얼 코드 가져오기

Google Cloud 프로젝트 선택 또는 만들기

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

    Go to project selector

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

필요한 API를 사용 설정합니다.

Google Cloud 프로젝트에서 컨테이너 이미지와 Kubernetes를 사용하려면 다음 API를 사용 설정해야 합니다.

  • Artifact Registry API: 이 API는 컨테이너 이미지를 저장하고 관리하는 서비스인 Artifact Registry를 사용 설정합니다.
  • Kubernetes Engine API: 이 API는 GKE에 대한 액세스를 제공합니다.

이러한 API를 사용 설정하려면 Google Cloud 콘솔에서 API를 사용 설정하세요.

Cloud Shell을 Google Cloud 프로젝트에 연결

이제 Google Cloud 프로젝트를 설정했으므로 Cloud Shell 인스턴스를 실행하고 Google Cloud프로젝트에 연결해야 합니다. Cloud Shell은 브라우저에서 직접 프로젝트 리소스를 만들고 관리할 수 있는 명령줄 도구입니다. Cloud Shell에는 두 가지 중요한 도구인 gcloud CLIkubectl CLI가 사전 설치되어 있습니다. 이 튜토리얼에서는 gcloud CLI를 사용하여 Google Cloud 와 상호작용하고 다음 튜토리얼에서는 kubectl CLI를 사용하여 GKE에서 실행되는 Cymbal Books 앱을 관리합니다.

Cloud Shell 인스턴스를 Google Cloud 프로젝트에 연결하려면 다음 단계를 따르세요.

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

    Google Cloud 콘솔

  2. 콘솔에서 Cloud Shell 활성화 버튼(Cloud Shell 활성화)을 클릭합니다.

    Console 하단의 프레임에서 Cloud Shell 세션이 열립니다.

  3. 다음 명령어를 사용하여 Google Cloud CLI에서 기본 프로젝트를 설정합니다.

    gcloud config set project PROJECT_ID
    

    PROJECT_ID를 이전 섹션의 프로젝트 선택 또는 생성 Google Cloud 에서 만들었거나 선택한 프로젝트의 프로젝트 ID로 바꿉니다. 프로젝트 ID는 Google Cloud에서 프로젝트를 다른 모든 프로젝트와 구분하는 고유한 문자열입니다. 프로젝트 ID를 찾으려면 프로젝트 선택기로 이동합니다. 이 페이지에서 각 프로젝트의 프로젝트 ID를 확인할 수 있습니다. Google Cloud

기본 환경 변수 설정

이 튜토리얼에서 실행하는 명령어를 간소화하기 위해 이제 Cloud Shell에서 몇 가지 환경 변수를 설정합니다. 이러한 변수는 프로젝트 ID, 저장소 리전, 이미지 태그와 같은 값을 저장합니다. 이러한 변수를 정의한 후에는 매번 값을 다시 입력하거나 대체하는 대신 변수 이름 (예: $REPOSITORY_NAME)을 참조하여 여러 명령어에서 재사용할 수 있습니다. 이 접근 방식을 사용하면 튜토리얼을 더 쉽게 따라 하고 오류의 위험을 줄일 수 있습니다.

Cloud Shell로 환경을 설정하려면 다음 단계를 따르세요.

export PROJECT_ID=$(gcloud config get project)
export REPOSITORY_REGION=REPOSITORY_REGION
export REPOSITORY_NAME=REPOSITORY_NAME
export REPOSITORY_DESCRIPTION="REPOSITORY_DESCRIPTION"
export TAG=TAG

다음을 바꿉니다.

  • REPOSITORY_REGION: Artifact Registry 저장소를 호스팅할 리전입니다. 예를 들면 us-central1(아이오와), us-west1 (오리건), europe-west1 (벨기에) 등이 있습니다. 전체 리전 목록은 리전 및 영역을 참고하세요.
  • REPOSITORY_NAME: 저장소 이름입니다. 예를 들면 book-review-service-repo입니다.
  • REPOSITORY_DESCRIPTION: 저장소의 목적에 관한 간단한 설명입니다. 예를 들면 "Repository for storing Docker images for the book review service"입니다.
  • TAG: 이미지에 적용할 태그입니다. 태그는 컨테이너 이미지의 특정 버전에 연결할 수 있는 라벨입니다. 다음과 같은 태그 이름 지정 규칙을 사용하여 이미지의 다양한 버전을 명확하게 표시할 수 있습니다.
    • v1
    • v1.2.3
    • 설명 태그(예: feature-x-dev)
    • 환경을 나타내는 태그(예: test)

Artifact Registry에서 저장소 만들기

다음으로 Artifact Registry에서 저장소를 만듭니다. 저장소는 컨테이너 이미지를 보관하는 저장소 위치입니다. 컨테이너 이미지를 빌드할 때 나중에 Kubernetes 클러스터에 배포할 수 있도록 저장할 위치가 필요합니다. Artifact Registry를 사용하면 Google Cloud 프로젝트 내에서 이러한 저장소를 만들고 관리할 수 있습니다.

Artifact Registry에 저장소를 만들려면 다음 명령어를 실행합니다.

gcloud artifacts repositories create ${REPOSITORY_NAME} \
    --repository-format=docker \
    --location=${REPOSITORY_REGION} \
    --description="${REPOSITORY_DESCRIPTION}"

명령어의 성공적인 출력은 다음과 같습니다.

Waiting for operation [...] to complete...done.
Created repository [book-review-service-repo].

Artifact Registry용 Docker 구성

다음으로 Docker가Google Cloud의 Artifact Registry와 안전하게 통신할 수 있도록 구성합니다. Docker는 다양한 환경에서 일관된 방식으로 소프트웨어를 패키징하고 실행하는 데 사용할 수 있는 도구입니다. 다음 섹션에서 Docker의 작동 방식을 자세히 알아봅니다. 지금은 Artifact Registry에 연결할 수 있도록 구성해야 합니다.

Docker를 이 방식으로 구성하지 않으면 컨테이너 이미지를 Artifact Registry로 푸시할 수 없습니다 (이 튜토리얼 후반부에서 수행하는 작업). Artifact Registry에서 컨테이너 이미지를 가져와 GKE 클러스터에 배포할 수도 없습니다 (다음 튜토리얼에서 수행하는 작업).

Artifact Registry로 인증하도록 Docker를 구성하려면 다음 명령어를 실행합니다.

gcloud auth configure-docker ${REPOSITORY_REGION}-docker.pkg.dev

튜토리얼 코드 가져오기

이제 Cloud Shell 환경이 구성되었으므로 Cloud Shell 내에서 튜토리얼 코드를 다운로드해야 합니다. 이전에 로컬 머신에서 저장소를 클론한 경우에도 Cloud Shell 인스턴스에서 다시 클론해야 합니다.

로컬 머신에서 이 튜토리얼을 완료할 수 있지만 Docker, kubectl, gcloud CLI와 같은 여러 도구를 수동으로 설치하고 구성해야 합니다. Cloud Shell은 이러한 모든 도구가 사전 구성되어 있으므로 더 쉽게 사용할 수 있습니다.

Cloud Shell 인스턴스에서 다음 명령어를 실행하여 GitHub 저장소를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git

컨테이너화 기본사항: 컨테이너 이미지, 컨테이너, Dockerfile

이제 환경을 설정하고 컨테이너화된 코드를 다운로드했으므로 앱을 컨테이너화할 준비가 되었습니다. 앱을 컨테이너화하는 작업은 Dockerfile을 사용하여 Cymbal Books의 각 모듈 (홈페이지, 도서 세부정보, 이미지, 도서 리뷰)을 컨테이너 이미지로 패키징하는 것으로 구성됩니다. 애플리케이션이 GKE 클러스터에 배포되면 Kubernetes는 이러한 컨테이너 이미지를 사용하여 클러스터에서 실행 중인 컨테이너를 만듭니다.

다음 섹션에서 이러한 개념을 자세히 설명합니다.

컨테이너화란 무엇인가요?

컨테이너화는 모듈과 라이브러리, 구성 파일과 같은 모든 종속 항목을 컨테이너 이미지라는 단위로 패키징합니다. 개발자는 이 컨테이너 이미지를 사용하여 개발자 노트북에서 테스트 서버 또는 프로덕션 Kubernetes 클러스터에 이르기까지 모든 환경에서 컨테이너를 만들고 실행합니다.

컨테이너 이미지란 무엇인가요?

컨테이너 이미지에는 애플리케이션을 실행하는 데 필요한 모든 파일이 포함되어 있습니다. 이러한 파일에는 애플리케이션 코드 자체, 시스템 라이브러리, 런타임 환경 (예: Python 인터프리터), 정적 데이터, 기타 모든 종속 항목이 포함됩니다.

이 튜토리얼에서는 도서 리뷰 앱의 각 모듈에 관한 컨테이너 이미지를 만듭니다.

컨테이너란?

컨테이너는 컨테이너 이미지의 코드가 실행되는 격리된 환경입니다. 컨테이너는 두 가지 방법으로 만들 수 있습니다. 개발 중에 테스트하기 위해 docker run 명령어를 사용하거나 Kubernetes 클러스터에 컨테이너 이미지를 배포하는 것입니다.

Cymbal Books 앱의 컨테이너화된 버전에서는 모듈식 앱의 각 모듈이 자체 컨테이너에서 실행됩니다.

  • 홈페이지 컨테이너는 홈페이지 모듈을 실행하고 /에 대한 요청을 처리합니다.
  • 도서 세부정보 컨테이너는 도서 세부정보 모듈을 실행하고 /book/1 또는 /book/3와 같은 엔드포인트에 데이터를 제공합니다.
  • 책 리뷰 컨테이너는 책 리뷰 모듈을 실행하고 /book/2/reviews와 같은 엔드포인트에 대한 요청을 관리합니다.
  • 이미지 컨테이너는 이미지 모듈을 실행하고 /images/fungi_frontier.jpg와 같은 엔드포인트에 도서 표지 이미지를 제공합니다.

컨테이너의 주요 이점은 Kubernetes가 필요할 때 더 많은 컨테이너를 자동으로 만들 수 있다는 것입니다. 예를 들어 많은 사용자가 서평을 읽고 있다면 Kubernetes는 부하를 처리하기 위해 서평 컨테이너를 추가로 시작할 수 있습니다.

컨테이너를 사용하지 않는 모듈식 앱에서 확장을 구현하려면 맞춤 코드를 작성하여 모듈의 새 인스턴스를 실행하고 인스턴스 간에 트래픽을 배포해야 합니다. Kubernetes에서는 이러한 확장 기능이 기본 제공되므로 맞춤 확장 코드를 작성할 필요가 없습니다.

Dockerfile이란 무엇인가요?

Dockerfile은 모듈을 컨테이너 이미지로 패키징하는 방법을 정의하는 스크립트입니다. 이 튜토리얼에서는 Dockerfile을 만들 필요가 없습니다. 이전에 클론한 GitHub 저장소에 이미 제공되어 있습니다. kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/의 로컬 사본에 있는 각 모듈의 디렉터리에는 자체 Dockerfile이 포함되어 있습니다.

예를 들어 Cloud Shell 인스턴스의 kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/home_app/Dockerfile에서 home_app 모듈의 Dockerfile을 찾을 수 있습니다. 이 Dockerfile은 다음과 같습니다.

# Dockerfile for home_app
FROM python:3.9-slim #line 1
WORKDIR /app #line 2
COPY requirements.txt . #line 3
RUN pip install --no-cache-dir -r requirements.txt #line 4
COPY home_app.py . #line 5
COPY templates/ ./templates/ #line 6
COPY static/ ./static/ #line 7
CMD ["python", "home_app.py"] #line 8

이 Dockerfile은 다음 단계를 실행하여 home_app 모듈의 컨테이너 이미지를 만듭니다.

  • 1번 줄: FROM python:3.9-slim가 Python 3.9 인터프리터와 필요한 파일을 컨테이너 이미지에 다운로드합니다. 이 파일은 모듈을 실행할 수 있도록 합니다.
  • 2번 줄: WORKDIR /app은 컨테이너 내에 /app라는 디렉터리를 만들고 이 디렉터리를 현재 작업 디렉터리로 설정합니다. 컨테이너 내에서 실행되는 모든 명령어는 이 디렉터리 내에서 실행됩니다.
  • 3~4번 줄: COPY requirements.txt .는 로컬 머신의 requirements.txt 파일을 컨테이너 이미지의 /app 디렉터리에 복사합니다. requirements.txt 파일에는 home_app.py에 필요한 모든 Python 라이브러리가 나열됩니다. RUN pip install 행은 이러한 라이브러리를 컨테이너 이미지에 설치합니다.
  • 5~7번 줄: 이 줄에 표시된 COPY 명령어는 모듈의 코드 (home_app.py)와 지원 파일 (템플릿 및 정적 애셋)을 컨테이너 이미지 내의 /app 디렉터리로 복사합니다.
  • 8번 줄: CMD는 컨테이너가 시작될 때 Docker가 실행하는 기본 명령어를 지정합니다. 이 Dockerfile에서 CMD ["python", "home_app.py"]는 컨테이너가 실행될 때 Python 인터프리터를 사용하여 home_app.py 모듈을 자동으로 실행하도록 Docker에 지시합니다.

컨테이너화로 더 엄격한 데이터 격리를 적용하는 방법

이전 섹션에서 설명한 Dockerfile의 5~7번 줄은 컨테이너화로 모듈식 버전의 앱보다 더 엄격한 데이터 격리를 적용할 수 있는 방법을 보여줍니다. 이전 튜토리얼의 각 모듈에 필요한 데이터에만 액세스 권한 부여 섹션에서는 앱의 모듈식 버전은 데이터를 별도의 디렉터리로 구성하지만 모듈은 여전히 동일한 파일 시스템을 공유하고 서로의 데이터에 액세스할 수 있다는 것을 배웠습니다.

여기서 앱의 컨테이너화된 버전에서는 각 모듈의 컨테이너에 필요한 파일만 포함됩니다. 예를 들어 home_app 모듈이 서평 데이터에 액세스할 필요가 없는 경우 해당 데이터는 home_app 컨테이너 내에 존재하지 않습니다. 기본적으로 컨테이너는 명시적으로 구성되지 않는 한 다른 컨테이너의 파일에 액세스할 수 없습니다. 이렇게 하면 각 모듈이 완전히 격리되고 실수로 또는 승인되지 않은 방식으로 데이터에 액세스하는 것을 방지할 수 있습니다.

다음 섹션에서는 docker build 명령어가 Dockerfile을 입력으로 사용하고 Dockerfile의 안내에 따라 컨테이너 이미지를 만드는 방법을 확인합니다.

Docker를 사용하여 컨테이너 이미지 빌드

이 섹션에서는 각 도서 리뷰 모듈의 Docker 컨테이너 이미지를 빌드하고 Artifact Registry 저장소에 푸시합니다. 다음 튜토리얼에서는 이러한 컨테이너 이미지를 사용하여 Kubernetes에서 Cymbal Books 샘플 앱을 배포하고 실행합니다.

  1. 컨테이너화된 애플리케이션의 루트 디렉터리로 이동합니다.

    cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
    
  2. docker build 명령어를 사용하여 컨테이너 이미지를 만듭니다.

    docker build -t ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/home-app:${TAG} ./home_app
    docker build -t ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-details-app:${TAG} ./book_details_app
    docker build -t ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-reviews-app:${TAG} ./book_reviews_app
    docker build -t ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/images-app:${TAG} ./images_app
    
  3. Cloud Shell 인스턴스 내에서 빌드된 컨테이너 이미지를 확인합니다.

    docker images
    

    다음 이미지가 목록에 표시되는지 확인합니다.

    • home-app
    • book-details-app
    • book-reviews-app
    • images-app

    네 이미지가 모두 표시되면 컨테이너 이미지가 생성된 것입니다.

Cloud Shell에서 컨테이너 테스트

컨테이너 이미지가 올바르게 빌드되었는지 확인하려면 컨테이너로 실행하고 Cloud Shell에서 엔드포인트를 테스트하면 됩니다.

book_details_app, book_reviews_app, images_app 컨테이너는 서로 통신할 필요가 없으므로 개별적으로 테스트할 수 있습니다. 그러나 Docker를 사용하여 home_app 컨테이너를 테스트하는 것은 어렵습니다. home_apphttp://book-details-service:8081와 같은 서비스 이름을 사용하는 다른 컨테이너를 찾도록 구성되어 있기 때문입니다.

각 컨테이너의 IP 주소를 찾아 서비스 이름 대신 이를 사용하도록 home_app를 구성하여 home_app 컨테이너를 테스트할 수는 있지만, 이 접근 방식은 많은 노력이 필요합니다. 대신 Kubernetes 클러스터에 애플리케이션을 배포한 후에 home_app 컨테이너 테스트를 연기하는 것이 좋습니다. 앱이 클러스터에 있으면 홈 모듈이 올바르게 작동하는지 확인할 수 있습니다.

컨테이너를 테스트하려면 다음 단계를 따르세요.

  1. book_details_app, book_reviews_app, images_app 컨테이너를 시작합니다.

    docker run -d -p 8081:8080 ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-details-app:${TAG}
    docker run -d -p 8082:8080 ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-reviews-app:${TAG}
    docker run -d -p 8083:8080 ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/images-app:${TAG}
    
  2. 활성 컨테이너를 모두 나열하여 컨테이너가 실행 중인지 확인합니다.

    docker ps
    

    이 명령어의 출력에는 Up 상태로 실행 중인 컨테이너 3개가 표시됩니다.

    CONTAINER ID   IMAGE                PORTS                        STATUS
    a1b2c3d4e5f6   REGION/.../details   0.0.0.0:8081->8080/tcp       Up
    g7h8i9j0k1l2   REGION/.../reviews   0.0.0.0:8082->8080/tcp       Up
    m3n4o5p6q7r8   REGION/.../images    0.0.0.0:8083->8080/tcp       Up
    
  3. book_details_app 컨테이너의 엔드포인트를 테스트하려면 다음 curl 명령어를 사용합니다.

    curl http://localhost:8081/books
    curl http://localhost:8081/book/1
    curl http://localhost:8081/book/2
    curl http://localhost:8081/book/3
    

    이러한 각 명령어는 JSON 형식으로 데이터를 반환합니다. 예를 들어 curl http://localhost:8081/book/1 명령어의 출력은 다음과 같습니다.

    {"author":"Aria Clockwork","description":"In a world where time is a tangible substance, a young clockmaker discovers she can manipulate the fabric of time itself, leading to unforeseen consequences in her steampunk-inspired city.","id":1,"image_url":"zephyrs_timepiece.jpg","title":"Zephyr's Timepiece","year":2023}
    
  4. 다음 curl 명령어를 사용하여 book_reviews_app 컨테이너에서 서평을 가져옵니다.

    curl http://localhost:8082/book/1/reviews
    

    이 명령어는 도서 1에 대한 리뷰 20개 목록을 JSON 형식으로 반환합니다. 다음은 목록에 있는 리뷰의 예입니다.

    {
    "content": "The concept of time as a tangible substance is brilliantly explored in 'Zephyr's Timepiece'.",
    "rating": 5
    }
    
  5. images_app 컨테이너를 테스트합니다.

    1. **Web Preview** 버튼을 클릭합니다. 웹 미리보기 버튼

    2. 포트 변경을 선택하고 8083을 입력합니다. 다음과 유사한 URL이 포함된 브라우저 창이 열립니다.

      https://8083-your-instance-id.cs-your-region.cloudshell.dev/?authuser=0
      
    3. URL 끝에서 ?authuser=0를 삭제하고 이미지 파일(예: /images/fungi_frontier.jpg)의 경로를 추가합니다. 다음은 그 예시입니다.

      https://8083-your-instance-id.cs-your-region.cloudshell.dev/images/fungi_frontier.jpg
      

      브라우저에 Fungi Frontier의 도서 표지 이미지가 표시됩니다.

  6. 테스트 후 컨테이너를 중지하여 리소스를 해제합니다.

    1. 실행 중인 컨테이너를 나열하고 컨테이너 ID를 찾습니다.

      docker ps
      
    2. 각 컨테이너를 중지합니다.

      docker stop CONTAINER_ID
      

      CONTAINER_ID를 중지하려는 컨테이너의 ID로 바꿉니다.

컨테이너 이미지를 Artifact Registry에 푸시

앱을 Kubernetes 클러스터에 배포하려면 먼저 컨테이너 이미지를 클러스터에서 액세스할 수 있는 위치에 저장해야 합니다. 이 단계에서는 이전에 만든 Artifact Registry 저장소에 이미지를 푸시합니다. 다음 튜토리얼에서는 Artifact Registry 저장소에서 GKE 클러스터로 이러한 이미지를 배포합니다.

  1. 컨테이너 이미지를 Artifact Registry에 푸시하려면 다음 명령어를 실행합니다.

    docker push ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/home-app:${TAG}
    docker push ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-details-app:${TAG}
    docker push ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-reviews-app:${TAG}
    docker push ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/images-app:${TAG}
    
  2. 이미지를 푸시한 후 이미지를 나열하여 이미지가 성공적으로 업로드되었는지 확인합니다.

    gcloud artifacts docker images list ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}
    

    다음과 비슷한 출력이 표시됩니다.

    Listing items under project ${PROJECT_ID}, location ${REPOSITORY_REGION}, repository ${REPOSITORY_NAME}.
    
    IMAGE: ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-details-app
    DIGEST: sha256:f7b78f44d70f2eedf7f7d4dc72c36070e7c0dd05daa5f473e1ebcfd1d44b95b1
    CREATE_TIME: 2024-11-14T00:38:53
    UPDATE_TIME: 2024-11-14T00:38:53
    SIZE: 52260143
    
    IMAGE: ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/book-reviews-app
    DIGEST: sha256:875ac8d94ef54db2ff637e49ad2d1c50291087623718b854a34ad657748fac86
    CREATE_TIME: 2024-11-14T00:39:04
    UPDATE_TIME: 2024-11-14T00:39:04
    SIZE: 52262041
    
    IMAGE: ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/home-app
    DIGEST: sha256:70ddc54ffd683e2525d87ee0451804d273868c7143d0c2a75ce423502c10638a
    CREATE_TIME: 2024-11-14T00:33:56
    UPDATE_TIME: 2024-11-14T00:33:56
    SIZE: 52262412
    
    IMAGE: ${REPOSITORY_REGION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY_NAME}/images-app
    DIGEST: sha256:790f0d8c2f83b09dc3b431c4c04d7dc68254fecc76c48f00a83babc2a5dc0484
    CREATE_TIME: 2024-11-14T00:39:15
    UPDATE_TIME: 2024-11-14T00:39:15
    SIZE: 53020815
    

    출력에는 각 이미지에 관한 다음 세부정보가 포함됩니다.

    • IMAGE: 저장소 경로 및 이미지 이름입니다.
    • DIGEST: 이미지의 고유 식별자입니다.
    • CREATE_TIME 또는 UPDATE_TIME: 이미지가 생성되었거나 마지막으로 수정된 시간입니다.
    • SIZE: 이미지 크기(바이트)입니다.

컨테이너 이미지의 경로로 Kubernetes 매니페스트 업데이트

이전 튜토리얼인 컨테이너화용 모듈식 앱 준비에서 배운 것처럼 Kubernetes 매니페스트는 Kubernetes 클러스터에서 앱이 실행되는 방식을 정의하는 YAML 파일입니다. 여기에는 다음과 같은 세부정보가 포함됩니다.

  • 앱의 모듈 (예: home-app, book-details-app)
  • 컨테이너 이미지의 경로
  • 리소스 제한과 같은 구성 세부정보
  • 모듈 간에 요청을 라우팅하기 위한 서비스 정의

이 섹션에서는 이전 튜토리얼에서 검토한 것과 동일한 매니페스트 파일을 업데이트합니다. 이 파일은 kubernetes-manifest.yaml이며 이미지 경로의 자리표시자 값을 포함합니다. 이러한 자리표시자를 이전 섹션에서 Artifact Registry 저장소에 푸시한 컨테이너 이미지의 실제 경로로 바꿔야 합니다.

kubernetes-manifest.yaml Kubernetes 매니페스트 파일을 업데이트하려면 다음 단계를 따르세요.

  1. Cloud Shell에서 Kubernetes 매니페스트 파일 kubernetes-manifest.yaml가 포함된 containerized/ 디렉터리로 이동합니다.

    cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
    
  2. 텍스트 편집기에서 kubernetes-manifest.yaml 파일을 엽니다.

    vim kubernetes-manifest.yaml
    
  3. 다음과 같은 자리표시자가 포함된 image 필드를 찾습니다.

    image: REPOSITORY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY_NAME/home-app:TAG
    

    각 자리표시자를 Artifact Registry에 푸시한 컨테이너 이미지의 실제 경로로 바꿉니다.

    이러한 대체를 적용한 후의 경로는 다음과 같습니다.

    image:us-west1-docker.pkg.dev/your-project-id/book-review-service-repo/home-app:v1
    
  4. 모든 컨테이너 이미지의 경로를 업데이트합니다.

    • home-app
    • book-details-app
    • book-reviews-app
    • images-app
  5. 경로를 업데이트한 후 매니페스트 파일을 저장하고 편집기를 닫습니다. 예를 들어 vim을 사용하는 경우 Esc를 눌러 명령어 모드로 전환하고 wq를 입력한 다음 Enter 키를 눌러 저장하고 종료합니다.

이제 Kubernetes 매니페스트가 Artifact Registry 저장소에서 Kubernetes 클러스터로 컨테이너 이미지를 배포하도록 구성되었습니다.

요약

이 튜토리얼에서는 다음 작업을 실행하여 Kubernetes 클러스터에 배포할 모듈식 Cymbal Books 앱을 준비했습니다.

  1. 프로젝트를 설정하고 환경에 맞게 Cloud Shell을 구성합니다. Google Cloud
  2. 각 앱 모듈에 제공된 Dockerfile을 검토했습니다.
  3. Docker를 사용하여 앱 모듈의 컨테이너 이미지를 빌드했습니다.
  4. Cloud Shell에서 컨테이너를 테스트하여 기능을 확인했습니다.
  5. 저장을 위해 컨테이너 이미지를 Artifact Registry에 푸시했습니다.
  6. Artifact Registry의 올바른 컨테이너 이미지 경로를 사용하도록 Kubernetes 매니페스트를 업데이트했습니다.

다음 단계

다음 튜토리얼인 GKE 클러스터에 앱 배포에서는 컨테이너화된 애플리케이션을 GKE 클러스터에 배포합니다.