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


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

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

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

이전 튜토리얼인 모놀리식 모듈화에서는 Cymbal Books 앱을 독립적인 Flask 모듈로 분할하는 방법을 알아봤습니다. 이 튜토리얼에서는 모듈식 앱 컨테이너화를 준비하기 위해 앱에 적용해야 하는 단일 변경사항에 대해 알아봅니다.

비용

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

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

시작하기 전에

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

첫 번째 튜토리얼을 이미 완료했다면 GitHub 저장소를 클론한 상태입니다. Cymbal Books 앱의 세 가지 버전은 모두 해당 저장소의 다음 폴더에 있습니다.

  • monolith/
  • modular/
  • containerized/

계속하기 전에 이러한 폴더가 머신에 있는지 확인합니다.

모듈식 코드 변경

이전 튜토리얼에서는 홈페이지 모듈이 다른 모듈과 통신한다는 것을 배웠습니다. 다른 모듈의 엔드포인트에 요청을 전송하여 도서 세부정보, 리뷰, 이미지를 가져온 다음 이 데이터를 HTML 페이지에 표시합니다.

modular/ 폴더에서 엔드포인트는 다음과 같이 localhost를 사용하여 home.py에 하드코딩됩니다.

BOOK_SERVICE_URL = "http://localhost:8081"     # Book details module listens on port 8081
REVIEW_SERVICE_URL = "http://localhost:8082"   # Book reviews module listens on port 8082
IMAGE_SERVICE_URL = "http://localhost:8083"    # Image module listens on port 8083

이러한 URL은 모든 모듈이 동일한 머신에서 실행될 때 작동합니다. 하지만 Kubernetes 환경에서는 모듈을 다른 머신으로 이동하여 장애를 처리하거나 부하를 분산할 수 있으며, 이는 해당 모듈의 IP 주소가 변경될 수 있음을 의미합니다.

홈페이지 모듈이 다른 모듈에 계속 액세스할 수 있도록 하려면 URL에서 localhost 대신 Kubernetes 서비스 이름을 사용해야 합니다. 서비스 이름은 Kubernetes에서 실행 중인 위치에 관계없이 요청을 올바른 모듈로 라우팅하는 데 사용하는 별칭처럼 작동합니다. 예를 들어 홈페이지 모듈이 http://book-details-service/book/1에 요청을 전송하면 Kubernetes는 요청이 북 세부정보 모듈에 도달하도록 합니다.

이러한 URL은 직접 업데이트할 필요가 없습니다. containerized/ 폴더의 앱 버전에는 이미 이 변경사항이 포함되어 있습니다. 하드코딩된 localhost URL이 Kubernetes 서비스 이름으로 대체되었습니다. containerized/home_app/home_app.py에서 업데이트된 버전을 확인할 수 있습니다.

BOOK_SERVICE_URL = "http://book-details-service"
REVIEW_SERVICE_URL = "http://book-reviews-service"
IMAGE_SERVICE_URL = "http://images-service"

이 업데이트를 통해 앱이 Kubernetes 환경에서 실행될 때 올바르게 작동하도록 보장합니다.

Kubernetes 매니페스트

이전 섹션에서는 Kubernetes 서비스 이름을 사용하도록 모듈의 엔드포인트가 업데이트되는 방식을 살펴봤습니다. Kubernetes 매니페스트에서 서비스 이름을 정의합니다.

Kubernetes 매니페스트는 모듈식 앱을 호스팅하기 위해 생성하려는 Kubernetes 클러스터의 종류를 정의하는 구성 파일입니다. 매니페스트는 YAML 또는 JSON으로 작성됩니다. 여기에서 서비스(모듈 간 라우팅용), 각 모듈의 복제본(인스턴스) 수, 각 모듈에서 사용할 수 있는 CPU 및 메모리 양 등을 정의합니다.

전체 튜토리얼 시리즈를 Kubernetes 매니페스트에 대해 작성할 수 있습니다. 매니페스트는 구조, 동작, 기능 등 Kubernetes 클러스터에 대한 모든 것을 정의하므로 복잡합니다. 이 튜토리얼에서는 매니페스트의 서비스 이름이 모듈의 엔드포인트에 사용되는 이름과 일치하는 방식만 살펴봅니다. 이후 튜토리얼에서는 kubectl apply 명령어를 실행하여 매니페스트에 정의된 구성에 따라 GKE 클러스터를 만들지만 이 튜토리얼에서는 매니페스트만 검토합니다.

매니페스트를 확인합니다.

이 섹션에서는 작성된 Kubernetes 매니페스트에서 서비스가 정의되는 방식을 살펴봅니다. YAML 파일인 매니페스트 파일은 이 시리즈의 첫 번째 튜토리얼에서 클론한 GitHub 저장소의 containerized/ 폴더에 있습니다. 서비스 정의를 보려면 다음 단계를 따르세요.

  1. 터미널에서 클론된 저장소의 컨테이너화된 디렉터리로 이동합니다.

    cd containerized
    
  2. 텍스트 편집기에서 Kubernetes 매니페스트 파일을 엽니다.

    cat kubernetes_manifest.yaml
    
  3. book-details 모듈의 서비스 정의를 찾습니다. 예시는 다음과 같습니다.

    apiVersion: v1
    kind: Service
    metadata:
    name: book-details-service
    spec:
    selector:
        app: book-details-app
    ports:
        - protocol: TCP
        port: 80  # External traffic on port 80
        targetPort: 8080  # Targeting container port 8080
    type: ClusterIP
    

매니페스트의 book-details-service 서비스 이름은 모듈의 엔드포인트(http://book-details-service)에서 사용되는 이름과 일치합니다. 앱이 Kubernetes에서 실행되면 Kubernetes는 이러한 서비스 이름을 사용하여 요청을 올바른 모듈로 라우팅합니다.

Kubernetes 매니페스트는 요청 라우팅을 처리하는 서비스를 비롯하여 Kubernetes 클러스터의 기능을 정의합니다. 앱의 각 모듈에는 매니페스트에 정의된 상응하는 서비스가 있습니다. 모듈식 코드의 URL을 이러한 서비스 이름과 일치하도록 업데이트하면 앱이 클러스터에서 실행될 때 Kubernetes가 올바른 모듈로 요청을 라우팅할 수 있습니다.

요약

이 튜토리얼에서는 모듈식 코드의 URL이 http://book-details-service와 같은 Kubernetes 서비스 이름을 사용하도록 업데이트되는 방법을 살펴봤습니다. 이러한 서비스 이름을 사용하면 클러스터에서 모듈 위치가 변경되더라도 Kubernetes에서 모듈 간에 요청을 라우팅할 수 있습니다. 또한 Kubernetes 매니페스트를 살펴보고 모듈식 코드의 서비스 이름이 매니페스트에 정의된 이름과 일치하는 방식을 확인했습니다.

다음 단계

다음 튜토리얼인 모듈식 앱 컨테이너화에서는 모듈을 컨테이너 이미지라는 이름으로 패키징하여 컨테이너화하는 방법을 알아봅니다. 그런 다음 컨테이너 이미지를 컨테이너로 실행하고 기능을 테스트하고 컨테이너 이미지를 Google의 Artifact Registry로 푸시하는 방법을 알아봅니다.