Product Catalog App 배포

AWS App Mesh를 이해하려면 위에서 실행되는 모든 애플리케이션을 이해하는 것이 가장 좋습니다. 이 실습에서는 애플리케이션 설정 및 배포의 다음 부분에 대해 설명합니다.

  • 애플리케이션 아키텍처에 대해 설명합니다.

  • Application Services 컨테이너 이미지를 작성합니다.

  • 컨테이너 이미지를 Amazon ECR에 푸시합니다.

  • 처음에는 AWS 앱 메시 없이 Amazon EKS 클러스터에 애플리케이션 서비스를 배포합니다.

  • 서비스 간의 연결을 테스트합니다.

1. Application Architecture

App Mesh를 생성하는 과정을 안내할 애플리케이션 아키텍처의 예는 Product Catalog라고 하며 모든 eCommerce 애플리케이션에 사용됩니다. 이 애플리케이션은 세 가지 마이크로 서비스로 구성됩니다.

프런트엔드

  • 프런트엔드 서비스 frontend-node 는 제품 카탈로그 기능에 대한 UI를 보여줍니다.

  • ejs 템플레이팅과 함께 Nodejs에서 개발되었습니다.

  • EKS 관리 노드 그룹에 배포되었습니다.

제품 카탈로그 백엔드

  • 백엔드 서비스 prodcatalog는 다음 작업을 수행하는 REST API 서비스입니다.

    • 제품 카탈로그에 제품을 추가합니다.

    • 제품 카탈로그에서 제품을 가져옵니다.

    • 카탈로그 세부 정보 백엔드 서비스 proddetail를 호출하여 벤더와 같은 제품 카탈로그 세부 정보를 가져옵니다.

    • 제품 카탈로그에서 모든 제품을 가져옵니다.

  • Python Fask Restplus와 Rest API용 Swagger UI가 함께 제공됩니다.

  • EKS 파게이트에 배치되었습니다.

Catalog Detail 백엔드

  • 백엔드 서비스 proddetail은 다음 작업을 수행하는 REST API 서비스입니다.

    • 버전 번호 및 공급업체 이름이 포함된 카탈로그 세부 정보를 가져옵니다.

  • Nodejs로 배포됩니다.

  • EKS 관리 노드 그룹에 배포되었습니다.

위의 다이어그램에서 Product Catalog 애플리케이션의 서비스 간 service-call 관계를 다음과 같이 요약할 수 있습니다.

  • Frontend frontend-node »»> calls »»> Product Catalog backend prodcatalog.

  • Product Catalog backend prodcatalog »»> calls »»> Catalog Detail backend proddetail.

2. Catalog 애플리케이션 생성

3가지 서비스에 대한 Container 이미지를 빌드하여 ECR에 푸시합니다. (약 5분 소요됩니다.)

cd eks-app-mesh-polyglot-demo
aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com
PROJECT_NAME=eks-app-mesh-demo
export APP_VERSION=1.0
for app in catalog_detail product_catalog frontend_node; do
  aws ecr describe-repositories --repository-name $PROJECT_NAME/$app >/dev/null 2>&1 || \
  aws ecr create-repository --repository-name $PROJECT_NAME/$app >/dev/null
  TARGET=$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$PROJECT_NAME/$app:$APP_VERSION
  docker build -t $TARGET apps/$app
  docker push $TARGET
done

콘솔에서 ECR내의 이미지를 확인할 수 있습니다.

애플리케이션을 EKS 클러스터에 배포합니다. (Fargate pod 가 생성되기 까지는 약 4분이 소요됩니다.)

envsubst < ./deployment/base_app.yaml | kubectl apply -f -

배포된 정보를 확인합니다.

kubectl get deployment,pods,svc -n prodcatalog-ns -o wide

Product Catalog 서비스는 Fargate에 배포되어야 하며(네임스페이스 productlog-ns, label : app= productlog) 백엔드와 Catalog Product Detail은 Mnaged Nodegroup에 배포됩니다.

fargate pod가 service account role을 사용하는지 확인합니다.

export BE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=prodcatalog -o jsonpath='{.items[].metadata.name}') 

kubectl describe pod ${BE_POD_NAME} -n  prodcatalog-ns | grep 'AWS_ROLE_ARN\|AWS_WEB_IDENTITY_TOKEN_FILE\|serviceaccount' 

fargate pod 로깅이 활성화 되었는지 확인합니다.

kubectl describe pod ${BE_POD_NAME} -n  prodcatalog-ns | grep LoggingEnabled

3. 애플리케이션 테스트

Fargate 와 Nodegroup 간에 연결을 확인하여 위해 frontend-node 컨테이너에 접속하여 prodcatalog 백엔트 서비스 엔드포인트를 호출합니다.

export FE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=frontend-node -o jsonpath='{.items[].metadata.name}') 

kubectl -n prodcatalog-ns exec -it ${FE_POD_NAME} -c frontend-node bash
curl http://prodcatalog.prodcatalog-ns.svc.cluster.local:5000/products/ 

이번에는 prodcatalogproddetail 간의 연결을 확인합니다. (ctrl+d 로 container에서 빠져나옵니다.)

export BE_POD_NAME=$(kubectl get pods -n prodcatalog-ns -l app=prodcatalog -o jsonpath='{.items[].metadata.name}') 

kubectl -n prodcatalog-ns exec -it ${BE_POD_NAME} -c prodcatalog bash
curl http://proddetail.prodcatalog-ns.svc.cluster.local:3000/catalogDetail

Last updated