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 backendprodcatalog
.Product Catalog backend
prodcatalog
»»> calls »»> Catalog Detail backendproddetail
.
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/

이번에는 prodcatalog
와 proddetail
간의 연결을 확인합니다. (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
Was this helpful?