학습 과정: 모놀리식 앱을 GKE 앱으로 변환 - GKE 클러스터에 앱 배포


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

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

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

이전 튜토리얼인 모듈식 앱 컨테이너화에서 배포를 위해 모듈식 Cymbal Books 앱을 준비했습니다. 앱의 모듈을 컨테이너화하고, 결과 컨테이너를 테스트하고, 컨테이너 이미지를 Artifact Registry에 푸시했습니다.

이 튜토리얼에서는 컨테이너화된 앱을 Google Kubernetes Engine 클러스터에 배포합니다. 이 단계에서는 Cymbal Books 앱을 Kubernetes 클러스터에서 실행되는 모듈식 확장형 시스템으로 변환합니다.

비용

이 튜토리얼의 단계를 따르면 Google Cloud계정에 비용이 청구됩니다. GKE를 사용 설정하고 Cymbal Books 샘플 앱을 배포하면 비용이 청구됩니다. 이러한 비용에는 가격 책정 페이지에 설명된 대로 GKE에 대한 클러스터당 요금과 Compute Engine VM 실행 요금이 포함됩니다.

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

시작하기 전에

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

특히 이전 튜토리얼인 모듈식 앱 컨테이너화의 단계를 실행해야 합니다.

GKE 클러스터 설정

모듈식 Cymbal Books 앱을 배포하려면 먼저 GKE 클러스터를 만들어야 합니다. 이 클러스터는 앱의 컨테이너가 실행될 인프라를 제공합니다.

이 튜토리얼에서는 gcloud CLI를 사용하여 클러스터를 만듭니다. 또는 GKE 클러스터와 같은 Google Cloud리소스를 만들고 관리하기 위한 그래픽 사용자 인터페이스(GUI)를 제공하는 Google Cloud 콘솔을 사용할 수 있습니다.

GKE 클러스터 만들기 및 확인

GKE 클러스터는 Kubernetes에서 컨테이너를 실행하는 데 필요한 컴퓨팅 리소스를 제공합니다. gcloud CLI를 사용하여 클러스터를 만들려면 다음 단계를 따르세요.

  1. 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를 찾으려면 프로젝트 선택기로 이동합니다. 이 페이지에서 각 Google Cloud프로젝트의 프로젝트 ID를 확인할 수 있습니다.

  4. GKE 클러스터를 만듭니다.

    gcloud container clusters create CLUSTER_NAME \
        --zone=ZONE \
        --num-nodes=2
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터 이름입니다(예: cymbal-cluster).

    • ZONE: 클러스터를 만들려는 영역입니다(예: us-central1-a 또는 europe-west1-b). 사용 가능한 영역의 전체 목록은 리전 및 영역을 참조하세요.

  5. kubectl CLI가 클러스터에 연결할 수 있도록 클러스터의 사용자 인증 정보를 검색합니다.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --zone=ZONE
    

    이 명령어는 기본적으로 ~/.kube/config에 저장되는 Kubernetes 구성 파일을 업데이트합니다. 이 구성 파일에는 kubectl이 GKE 클러스터와 상호작용하는 데 필요한 사용자 인증 정보가 포함되어 있습니다.

  6. 클러스터 노드를 나열하여 kubectl이 클러스터에 연결되어 있는지 확인합니다.

    kubectl get nodes
    

    설정이 성공하면 이 명령어는 GKE 클러스터의 노드를 나열합니다. --num-nodes=2로 클러스터를 만들었으므로 다음과 유사하게 두 노드에 관한 정보가 표시되어야 합니다.

    NAME                                         STATUS    ROLES    AGE    VERSION
    gke-nov18-default-pool-6a8f9caf-bryg   Ready     <none>   30s    v1.30.8-gke.1128000
    gke-nov18-default-pool-6a8f9caf-ut0i   Ready     <none>   30s    v1.30.8-gke.1128000
    

    이 예시에서 두 노드 모두 Ready 상태입니다. 이 상태는 GKE 클러스터가 컨테이너화된 워크로드를 호스팅할 준비가 되었다는 의미입니다.

앱 배포

이제 GKE 클러스터를 만들었으므로 클러스터에 Cymbal Books 앱을 배포할 수 있습니다. 클러스터에 앱을 배포하려면 Kubernetes 매니페스트를 클러스터에 적용합니다.

Kubernetes 매니페스트 적용

Cloud Shell에서 다음 명령어를 실행하여 GKE 클러스터에 앱을 배포합니다.

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

    cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
    
  2. Kubernetes 매니페스트를 적용합니다.

    kubectl apply -f kubernetes_manifest.yaml
    

이전 명령어는 Kubernetes에 kubernetes-manifest.yaml 파일에 지정된 리소스를 만들도록 지시합니다. 이러한 리소스에는 서비스, 배포, 포드가 포함됩니다.

컨테이너화를 위한 모듈식 앱 준비 튜토리얼의 모듈식 코드 변경 섹션에서 서비스를 처음 접했습니다. 이 튜토리얼에서는 localhost 대신 서비스 이름을 사용하도록 앱 코드를 업데이트했습니다. 이 업데이트를 통해 Kubernetes는 모듈 간에 요청을 라우팅하고 모듈이 클러스터 내에서 서로 통신할 수 있도록 합니다. 이제 매니페스트를 적용하면 Kubernetes가 클러스터 내에 서비스를 만듭니다.

배포는 클러스터에서 노드 간에 배포되는 여러 포드 복제본을 실행할 수 있는 Kubernetes API 객체입니다. 다음 섹션에서는 포드에 대해 설명합니다.

Kubernetes 포드란 무엇인가요?

이전 튜토리얼에서는 Cymbal Books 앱의 각 모듈에 관한 컨테이너 이미지를 만들었습니다. 예를 들어 home_appbook_details_app 모듈을 기반으로 컨테이너 이미지를 만들었습니다.

kubectl apply 명령어를 사용하여 Kubernetes 매니페스트를 배포하면 Kubernetes는 Artifact Registry에서 컨테이너 이미지를 클러스터로 가져옵니다. 클러스터에서 컨테이너 이미지는 컨테이너가 되고 컨테이너는 포드 내에서 실행됩니다.

포드는 컨테이너가 실행되는 격리된 환경이며 다음 작업을 실행합니다.

  • CPU 및 메모리 할당: 포드는 컨테이너가 작동하는 데 필요한 리소스를 제공합니다.
  • 네트워킹 제공: 각 포드에는 자체 IP 주소가 있습니다. 이렇게 하면 포드가 다른 포드와 통신할 수 있습니다.

포드는 클러스터에 컴퓨팅 성능을 제공하는 머신인 노드에서 실행됩니다. Kubernetes는 노드에 포드를 자동으로 할당하고 클러스터의 노드에 포드를 배포하여 단일 노드에 과부하가 발생할 위험을 줄입니다. 이러한 배포는 클러스터가 컴퓨팅 및 메모리 리소스를 효율적으로 사용하는 데 도움이 됩니다.

배포 확인

kubectl apply 명령어로 Kubernetes 매니페스트를 적용한 후 앱이 클러스터에 성공적으로 배포되었는지 확인합니다. 배포를 확인하려면 포드와 서비스가 올바르게 실행 중인지 확인합니다.

포드 확인

클러스터의 포드를 보려면 다음 명령어를 실행합니다.

kubectl get pods

이 명령어는 포드와 현재 상태를 나열합니다. 상태 열을 찾아 모든 포드가 Running으로 표시되는지 확인합니다. 이는 포드가 성공적으로 실행 중이며 요청을 처리할 준비가 되었음을 나타냅니다. 예상 출력은 다음과 같이 표시됩니다.

NAME                             READY   STATUS    RESTARTS   AGE
home-app-67d59c6b6d-abcde        1/1     Running   0          30s
book-details-app-6d8bcbc58f-xyz  1/1     Running   0          30s
book-reviews-app-75db4c4d7f-def  1/1     Running   0          30s
images-app-7f8c75c79c-ghi        1/1     Running   0          30s

포드의 상태는 생성 중이고 컨테이너가 시작되는 동안 포드 상태는 처음에 Pending으로 표시됩니다. 포드가 장시간 Pending 상태로 유지되면 클러스터에 포드가 정상적인 Running 상태로 전환하기에 충분한 리소스가 부족할 수 있습니다. 포드의 상태가 CrashLoopBackOff인 경우 컨테이너에 문제가 있을 수 있습니다. 문제 해결 단계는 튜토리얼 뒷부분에 제공됩니다.

서비스 확인

서비스는 포드 간의 통신을 사용 설정하고 외부 클라이언트(예: 사용자, 자동화 스크립트, 모니터링 도구)가 앱에 액세스하도록 허용합니다. 클러스터의 서비스를 보려면 다음 명령어를 실행합니다.

kubectl get services

이 명령어의 출력은 다음과 같이 표시됩니다.

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
home-app-service   LoadBalancer   10.12.3.4       35.185.1.2        80:30837/TCP   30s
details-service    ClusterIP      10.12.3.5       <none>            80/TCP         30s
reviews-service    ClusterIP      10.12.3.6       <none>            80/TCP         30s
images-service     LoadBalancer   10.12.3.7       34.125.6.3        80:32014/TCP   30s

출력에서 확인해야 할 주요 필드는 다음과 같습니다.

  • TYPE: 이 필드는 서비스가 노출되는 방식을 나타냅니다. LoadBalancer 유형의 서비스는 앱에 대한 외부 액세스를 제공합니다.
  • EXTERNAL-IP: LoadBalancer 유형의 서비스의 경우 EXTERNAL-IP 필드에는 사용자가 앱에 액세스하기 위해 웹 브라우저에 입력할 수 있는 공개 IP 주소가 표시됩니다. ClusterIP 유형의 서비스의 경우 ClusterIP 서비스는 클러스터 내에서만 액세스할 수 있으므로 이 필드는 비어 있습니다.

배포 테스트

Cymbal Books 앱을 GKE 클러스터에 배포한 후 앱에 액세스할 수 있는지, 컨테이너가 서로 통신할 수 있는지 확인합니다.

앱에 액세스하기

다음 단계에 따라 앱에 액세스할 수 있는지 확인합니다.

  1. home-app-service의 외부 IP 주소를 검색합니다.

    kubectl get services
    

    출력에서 **EXTERNAL-IP** 열을 찾아 home-app-service와 연결된 IP 주소를 확인합니다.

  2. 웹브라우저를 열고 다음 URL을 입력합니다.

    http://EXTERNAL-IP
    

    EXTERNAL-IP는 이전 단계에서 찾은 IP 주소로 바꿉니다.

  3. Cymbal Books 앱의 홈페이지가 올바르게 로드되는지 확인합니다.

서비스 간 통신 확인

Cymbal Books 앱의 컨테이너는 서비스를 사용하여 정보를 교환합니다. 다음 단계에 따라 컨테이너가 효과적으로 통신할 수 있는지 확인합니다.

  1. 앞에서 설명한 대로 home-app-service의 외부 IP 주소를 검색합니다.

  2. 앱의 인터페이스를 사용하여 컨테이너 간의 상호작용을 테스트합니다. 이렇게 하려면 앱 인터페이스에서 사용 가능한 모든 링크를 클릭하여 다음 기능이 작동하는지 확인합니다.

    • 도서 표지 이미지 확인: 홈페이지와 도서 세부정보 페이지 모두에서 도서 표지 이미지가 올바르게 로드되는지 확인합니다. 그렇다면 home_appbook_details_app 컨테이너가 images_app 컨테이너와 성공적으로 통신하고 있는 것입니다.
    • 도서 세부정보 보기: 홈페이지에서 도서 세부정보 페이지로 이동합니다. 도서 세부정보가 표시되면 home_app 컨테이너가 book_details_app와 올바르게 통신하고 있는 것입니다.
    • 도서 리뷰 보기: 도서 리뷰 링크를 클릭하여 home_app 컨테이너가 book_reviews_app 컨테이너와 통신할 수 있는지 확인합니다.

이제 앱이 GKE 클러스터에서 실행 중입니다.

수고하셨습니다. 모놀리식 앱을 라이브 GKE 클러스터에서 실행되는 모듈식의 컨테이너화된 시스템으로 변환하는 방법을 살펴보았습니다. 이와 함께 긴밀하게 결합된 코드를 독립적인 모듈로 분할하고, 컨테이너 이미지를 빌드 및 저장소에 푸시하고, Kubernetes 매니페스트를 정의하고, 저장소에서 GKE로 앱을 배포하는 방법을 살펴보았습니다. 이는 중요한 성과이며 팀이 클라우드용 애플리케이션을 현대화하기 위해 취하는 실제 단계를 반영합니다.

문제 해결

앱이 응답하지 않거나 컨테이너가 통신에 실패하는 경우 다음 문제 해결 단계에 따라 일반적인 문제를 진단하고 해결하세요.

포드의 상태를 확인합니다.

먼저 클러스터의 모든 포드를 나열하여 예상대로 실행 중인지 확인합니다.

kubectl get pods

출력을 검토하여 각 포드가 Running 상태인지 확인합니다. 실행 중이 아닌 포드가 있으면 추가 검사를 위해 이름을 기록합니다.

포드 로그 검사

포드가 요청을 올바르게 처리하지 않으면 로그를 확인하여 오류 메시지가 있는지 확인합니다.

kubectl logs POD_NAME

POD_NAME을 검사하려는 포드 이름으로 바꿉니다. 이 명령어는 시작 문제 또는 런타임 오류를 식별하는 데 유용합니다.

포드에 관한 자세한 정보 설명

포드가 Running 상태가 아닌 상태(예: Pending, ContainerCreating 또는 CrashLoopBackOff 상태)로 5분 이상 유지되는 경우 다음 명령어를 사용하여 포드의 상태 및 이벤트에 관한 자세한 정보를 확인할 수 있습니다.

kubectl describe pod POD_NAME

POD_NAME을 세부정보를 확인하려는 포드의 이름으로 바꿉니다.

출력의 Events 섹션은 리소스 제약 조건 또는 이미지 가져오기 관련 문제로 인해 포드가 제대로 시작되지 못하고 있음을 나타낼 수 있습니다.

서비스 구성 확인

서비스가 올바르게 설정되어 있는지, 특히 외부 IP 주소로 홈 모듈을 노출하는 서비스가 올바르게 설정되어 있는지 확인합니다. 다음 명령어를 사용하여 서비스를 나열합니다.

kubectl get services

홈 모듈의 서비스에 Pending으로 표시된 EXTERNAL-IP 주소가 있는 경우 다음 명령어를 실행합니다.

kubectl describe service SERVICE_NAME

SERVICE_NAME을 홈 모듈 서비스의 이름으로 바꿉니다.

이 명령어는 서비스 구성에 관한 자세한 정보를 제공하고 외부 IP 주소 할당 지연 또는 기타 구성 문제를 식별하는 데 도움이 됩니다.

클러스터 이벤트 확인

클러스터 이벤트를 검사하여 문제가 클러스터의 여러 구성요소에 영향을 미치는지 확인할 수 있습니다.

kubectl get events

이 명령어를 사용하면 더 광범위한 리소스 또는 네트워크 문제가 배포에 영향을 미치는지 확인할 수 있습니다.

리소스 삭제

GKE 클러스터를 실행하면 비용이 발생합니다. 이 튜토리얼을 완료한 후에는 추가 요금이 청구되지 않도록 리소스를 정리하세요. 다음 단계에 따라 클러스터를 제거하거나 원하는 경우 전체 프로젝트를 제거합니다.

GKE 클러스터 삭제

GKE 클러스터를 삭제하려면 다음 명령어를 사용합니다.

gcloud container clusters delete CLUSTER_NAME
    --zone=ZONE

다음을 바꿉니다.

  • CLUSTER_NAME: 만든 클러스터의 이름입니다(예: cymbal-cluster).

  • ZONE: 클러스터가 생성된 영역입니다(예: us-central1-a).

메시지가 표시되면 삭제를 확인합니다.

클러스터가 삭제되었는지 확인

클러스터가 삭제되었는지 확인하려면 다음 명령어를 실행합니다.

gcloud container clusters list

클러스터가 더 이상 출력에 표시되지 않아야 합니다. 그럴 경우 잠시 기다렸다가 다시 시도하세요.

(선택사항) Google Cloud 프로젝트 삭제

이 튜토리얼용으로 Google Cloud 프로젝트를 만들었으나 더 이상 필요하지 않은 경우 전체 Google Cloud 프로젝트를 삭제할 수 있습니다. 프로젝트를 삭제하면 모든 리소스가 삭제되고 프로젝트에 대한 청구가 중지됩니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지를 엽니다.
  2. 삭제할 프로젝트를 선택합니다.
  3. 프로젝트 삭제를 클릭하고 메시지에 따라 확인합니다.

시리즈 요약

수고하셨습니다. 이 학습 과정을 완료하면 모놀리식 앱을 Kubernetes 클러스터에서 실행되는 모듈식 컨테이너화된 앱으로 변환하는 기본사항을 배우게 됩니다. 다음 단계는 이 프로세스가 요약되어 있습니다.

  1. 모놀리식 이해하기

    • Cymbal Books 모놀리식 앱의 구조를 살펴보았습니다.
    • 모놀리식을 실행하기 위해 로컬 Python 환경을 설정하고 엔드포인트를 테스트했습니다.
    • 모듈화를 준비하기 위해 앱의 코드베이스를 이해했습니다.
  2. 모놀리식 모듈화

    • 모놀리식 코드를 별도의 모듈로 분할하는 방법을 알아봤습니다. 각 모듈은 도서 세부정보 또는 리뷰 표시와 같은 고유한 기능을 처리합니다.
    • 이러한 모듈이 서로 다른 포트에서 실행되는 독립적인 Flask 앱으로 구현되는 방식을 확인했습니다.
    • 모듈식 앱을 테스트했습니다.
  3. 컨테이너화를 위한 모듈식 코드 준비

    • localhost 대신 서비스 이름을 사용하려면 home.py의 URL을 업데이트해야 한다는 것을 알게 되었습니다.
    • Kubernetes 매니페스트에서 기존에 서로 통신하는 앱의 모듈이 Kubernetes 클러스터의 컨텍스트 내에서 상호 감지할 수 있게 하는 서비스를 정의하는 방법을 알아보았습니다.
  4. 모듈식 앱 컨테이너화

    • Google Cloud 프로젝트를 설정하고 GitHub에서 Cloud Shell로 앱을 클론했습니다.
    • Docker를 사용하여 각 모듈에 대한 컨테이너 이미지를 빌드하고 로컬에서 컨테이너를 테스트했습니다.
    • 클러스터에 배포할 앱을 준비하기 위해 컨테이너 이미지를 Artifact Registry에 푸시했습니다.
    • Artifact Registry의 컨테이너 이미지 경로를 참조하도록 Kubernetes 매니페스트를 업데이트했습니다.
  5. GKE 클러스터에 앱을 배포합니다(현재의 튜토리얼).

    • GKE 클러스터를 만들었습니다.
    • Artifact Registry에서 GKE 클러스터에 컨테이너 이미지를 배포했습니다.
    • 이제 확장 가능하고 Kubernetes 환경에서 실행되는 앱의 최종 버전을 테스트했습니다.

다음 단계

클러스터를 만드는 방법에 대한 추가 실습 교육은 학습 과정: 확장 가능한 애플리케이션 시리즈를 참조하세요.