마이크로서비스와 컨테이너는 현대 애플리케이션이 클라우드에서 구축, 배포 및 관리되는 방식을 혁신하고 있습니다. 그러나 마이크로서비스를 개발하고 운영하는 것은 상당한 복잡성을 도입할 수 있으며 종종 서비스 디스커버리, 상태 관리 및 관찰성과 같은 교차 관심사에 개발자가 유용한 시간을 소비해야 합니다.
Dapr 또는 분산 애플리케이션 런타임은 클라우드 및 엣지 환경에서 마이크로서비스를 구축하기 위한 오픈 소스 런타임입니다. 서비스 디스커버리, 상태 관리, 발행/구독 메시징 및 관찰성과 같은 플랫폼에 독립적인 빌딩 블록을 기본으로 제공합니다. Dapr은 CNCF (Cloud Native Computing Foundation)의 성숙도 수준으로 이동했으며 현재 많은 기업에서 사용 중입니다.
Amazon Elastic Kubernetes Service (Amazon EKS)와 결합하면 AWS의 관리형 Kubernetes 서비스로 마이크로서비스와 컨테이너의 채택을 가속화할 수 있으며, 인프라 플러밍에 대해 걱정하지 않고 개발자가 비즈니스 로직 작성에 집중할 수 있습니다. Amazon EKS는 Kubernetes 클러스터 관리를 쉽게 만들어 작업 부하가 변경될 때 쉬운 확장을 가능하게 합니다.
이 블로그 포스트에서는 Dapr이 Amazon EKS에서 마이크로서비스 개발을 어떻게 간소화하는지 살펴보겠습니다. 두 가지 필수 빌딩 블록인 서비스 호출와 상태 관리에 대해 자세히 알아보겠습니다.
서비스 호출
마이크로서비스 간의 원활하고 신뢰할 수 있는 통신은 매우 중요합니다. 그러나 개발자들은 종종 서비스 검색, API 표준화, 통신 채널 보안, 실패 처리 및 관측성 구현과 같은 복잡한 작업에 어려움을 겪습니다.
Dapr의 서비스 호출을 사용하면 이러한 문제들은 과거의 일이 됩니다. 귀하의 서비스는 gRPC 및 HTTP/HTTPS와 같은 산업 표준 프로토콜을 사용하여 서로 쉽게 통신할 수 있습니다. 서비스 호출은 서비스 등록 및 검색부터 요청 재시도, 암호화, 접근 제어 및 분산 추적까지 모든 무거운 작업을 처리합니다.
상태 관리
Dapr의 상태 관리 빌딩 블록은 개발자가 애플리케이션에서 상태를 다루는 방법을 간소화합니다. 백그라운드 상태 저장소(예: Redis, AWS DynamoDB, Azure Cosmos DB)에 관계없이 상태 데이터를 저장하고 검색하기 위한 일관된 API를 제공합니다.
이 추상화를 통해 개발자는 상태 저장소의 관리와 확장에 대한 복잡성을 걱정하지 않고 상태를 가진 애플리케이션을 구축할 수 있습니다.
전제 조건
이 문서를 따라가기 위해 다음이 필요합니다:
- AWS 계정. 계정이 없는 경우 하나를 등록할 수 있습니다.
- 적절한 권한을 가진 IAM 사용자. 사용 중인 IAM 보안 주체는 Amazon EKS IAM 역할, 서비스 연결 역할, AWS CloudFormation, VPC 및 관련 리소스와 작업할 수 있는 권한이 있어야 합니다. 자세한 내용은 Amazon Elastic Container Service for Kubernetes의 작업, 리소스 및 조건 키와 서비스 연결 역할 사용을 AWS Identity and Access Management 사용자 가이드에서 참조하십시오.
애플리케이션 아키텍처
아래 다이어그램에는 두 개의 마이크로서비스가 있습니다: Python 앱과 Node.js 앱. Python 앱은 주문 데이터를 생성하고 Node.js 앱에서 제공하는 /neworder
엔드포인트를 호출합니다. Node.js 앱은 수신된 주문 데이터를 상태 저장소(이 경우 Amazon ElastiCache)에 기록하고 Python 앱에 주문 ID를 응답으로 반환합니다.
Dapr의 서비스 호출 빌딩 블록을 활용하여 Python 앱은 서비스 검색, API 표준화, 통신 채널 보안, 실패 처리 또는 가시성에 대해 걱정하지 않고 Node.js 앱과 원활하게 통신할 수 있습니다. mTLS를 구현하여 서비스 간 안전한 통신을 제공합니다.
Dapr는 이러한 횡단 관심사를 처리하여 개발자가 핵심 비즈니스 로직 작성에 집중할 수 있도록 합니다.
게다가 Dapr의 상태 관리 빌딩 블록은 Node.js 앱이 상태 저장소 (Amazon ElastiCache)와 상호 작용하는 방식을 간소화합니다. Dapr은 상태 데이터를 저장하고 검색하는 일관된 API를 제공하여 기존 상태 저장소의 관리와 확장을 추상화합니다. 이러한 추상화는 개발자가 상태 저장소 관리의 복잡성을 걱정하지 않고 상태를 가지는 애플리케이션을 구축할 수 있도록 합니다.
Amazon EKS 클러스터는 Dapr 제어 평면 구성 요소가 포함된 dapr-system
이라는 네임스페이스를 호스트합니다. dapr-sidecar-injector
는 Dapr를 활성화한 마이크로서비스의 팟에 자동으로 Dapr 런타임을 주입합니다.
서비스 호출 단계
- 주문 생성기 서비스 (Python 앱)은 Node 앱의
/neworder
메서드를 호출합니다. 이 요청은 로컬 Dapr 사이드카로 전송되며, 이는 Python 앱과 동일한 팟에서 실행됩니다. - Dapr은 Amazon EKS 클러스터의 DNS 공급자를 사용하여 대상 앱을 해결하고 Node 앱의 사이드카로 요청을 전송합니다.
- Node 앱의 사이드카는 요청을 Node 앱 마이크로서비스로 전송합니다.
- Node 앱은 그런 다음 Python 앱에서 받은 주문 ID를 Amazon ElasticCache에 기록합니다.
- Node 앱은 응답을 로컬 Dapr 사이드카로 전송합니다.
- Node 앱의 사이드카는 응답을 Python 앱의 Dapr 사이드카로 전달합니다.
- Python 앱 사이드카는 Node 앱의
/neworder
메서드로 요청을 시작한 Python 앱에 응답을 반환합니다.
배포 단계
EKS 클러스터 생성 및 확인
Amazon EKS(Elastic Kubernetes Service) 클러스터를 설정하기 위해 여러 단계를 따라야 합니다. 프로세스에 대한 개요는 다음과 같습니다:
사전 준비 사항
- AWS CLI 설치 및 구성
eksctl
,kubectl
, AWS IAM Authenticator 설치
1. EKS 클러스터를 생성합니다. eksctl
를 사용하여 다음과 같은 명령으로 기본 클러스터를 생성합니다:
eksctl create cluster --name my-cluster --region us-west-2 --node-type t3.medium --nodes 3
2. kubectl을 구성합니다. 새 클러스터에 연결하기 위해 kubeconfig
를 업데이트합니다:
aws eks update-kubeconfig --name my-cluster --region us-west-2
3. 클러스터를 확인합니다. 노드가 준비되었는지 확인합니다:
kubectl get nodes
EKS 클러스터에 DAPR 설치하기
1. DAPR CLI 설치:
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
2. 설치 확인:
dapr -h
3. DAPR 설치 및 검증:
dapr init -k --dev
dapr status -k
Dapr 구성 요소 statestore
및 pubsub
는 기본 네임스페이스에 생성됩니다. 아래 명령어를 사용하여 확인할 수 있습니다:
dapr components -k
Amazon ElastiCache를 Dapr StateStore로 구성하기
마이크로서비스의 상태를 저장하기 위해 Amazon ElastiCache를 생성합니다. 이 예제에서는 관리할 서버 없이 애플리케이션 트래픽 수요에 맞춰 자동으로 확장되는 캐시를 빠르게 생성하는 ElastiCache 서버리스 버전을 사용하고 있습니다.
ElastiCache의 보안 그룹을 구성하여 EKS 클러스터에서의 연결을 허용하십시오. 간단히 유지하기 위해 EKS 클러스터와 동일한 VPC에 유지하십시오. 이후 단계에서 필요한 캐시 엔드포인트를 확인하십시오.
샘플 애플리케이션 실행
1. 샘플 애플리케이션의 Git 레포지토리를 복제하십시오:
git clone https://github.com/dapr/quickstarts.git
2. redis-state.yaml
을 생성하고 redisHost
에 Amazon ElasticCache 엔드포인트를 제공하십시오:
apiVersion dapr.io/v1alpha1
kind Component
metadata
name statestore
namespace default
spec
type state.redis
version v1
metadata
name redisHost
value redisdaprd-7rr0vd.serverless.use1.cache.amazonaws.com6379
name enableTLS
value true
kubectl
을 사용하여 상태 저장소 구성을 적용하십시오.
kubectl apply -f redis-state.yaml
3. 사이드카를 사용하여 마이크로서비스를 배포하십시오.
마이크로서비스 노드 앱을 배포하려면 /quickstarts/tutorials/hello-kubernetes/deploy/node.yaml
파일로 이동하고 아래 주석을 확인하십시오. 이는 Dapr 제어 플레인에 사이드카를 주입하고 Dapr 애플리케이션에 이름을 할당하는 것을 알려줍니다.
annotations
dapr.io/enabled"true"
dapr.io/app-id"nodeapp"
dapr.io/app-port"3000"
node.yaml
에 service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
주석을 추가하여 AWS ELB를 생성하십시오.
kind Service
apiVersion v1
metadata
name nodeapp
annotations
service.beta.kubernetes.io/aws-load-balancer-scheme"internet-facing"
labels
app node
spec
selector
app node
ports
protocol TCP
port80
targetPort3000
type LoadBalancer
kubectl
을 사용하여 노드 앱을 배포하십시오. /quickstarts/tutorials/hello-kubernetes/deploy
디렉토리로 이동하고 아래 명령을 실행하십시오.
kubectl apply -f node.yaml
아래 명령의 출력에서 외부 IP 하에 나타나는 AWS NLB를 획득하십시오.
kubectl get svc nodeapp http://k8s-default-nodeapp-3a173e0d55-f7b14bedf0c4dd8.elb.us-east-1.amazonaws.com
/quickstarts/tutorials/hello-kubernetes
디렉토리로 이동하십시오. 이 디렉토리에는 sample.json
파일이 있어 아래 단계를 실행할 수 있습니다.
curl --request POST --data "@sample.json" --header Content-Type:application/json http://k8s-default-nodeapp-3a173e0d55-f14bedff0c4dd8.elb.us-east-1.amazonaws.com/neworder
브라우저에서 로드 밸런서를 사용하여 /order
엔드포인트에 액세스하여 출력을 확인할 수 있습니다.
http://k8s-default-nodeapp-3a173e0d55-f7b14bedff0c4dd8.elb.us-east-1.amazonaws.com/order
당신은 다음과 같은 출력을 보게 될 것입니다: {“OrderId”:“42”}
다음으로, 매초 새로운 주문 ID를 생성하고 Node 앱의 메서드 /neworder
를 호출하는 비즈니스 로직을 가진 두 번째 마이크로서비스 Python 앱을 배포합니다.
디렉토리 /quickstarts/tutorials/hello-kubernetes/deploy
로 이동하여 아래 명령어를 실행합니다.
kubectl apply -f python.yaml
4. 애플리케이션 배포 검증 및 테스트.
이제 두 개의 마이크로서비스가 배포되었습니다. Python 앱은 주문을 생성하고 아래의 로그에서 알 수 있듯이 /neworder
를 호출하고 있습니다.
kubectl logs --selector=app=python -c daprd --tail=-1
time"2024-03-07T12:43:11.556356346Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
time"2024-03-07T12:43:12.563193147Z" levelinfo msg"HTTP API Called" app_idpythonapp instancepythonapp974db9877dljtw method"POST /neworder" scopedapr.runtime.httpinfo typelog useragentpythonrequests2.31.0 ver1.12.5
Node 앱이 요청을 받고 상태 저장소 Amazon ElasticCache에 기록하고 있음을 볼 수 있습니다.
kubectl logs —selector=app=node -c node —tail=-1
Got a new order Order ID: 367
Successfully persisted state for Order ID: 367
Got a new order Order ID: 368
Successfully persisted state for Order ID: 368
Got a new order Order ID: 369
Successfully persisted state for Order ID: 369
Amazon ElasticCache에 데이터가 지속적으로 저장되었는지 확인하기 위해 아래의 엔드포인트 /order
에 접근합니다. 이는 Python 앱에 의해 생성된 최신 주문 ID를 반환합니다.
http://k8s-default-nodeapp-3a173e0d55-f7b14beff0c4dd8.elb.us-east-1.amazonaws.com/order
당신은 가장 최근의 주문으로 {“OrderId”:“370”}
를 포함한 출력을 보게 될 것입니다.
정리
아래 명령어를 실행하여 Node 앱과 Python 앱, 그리고 상태 저장소 구성 요소를 삭제합니다.
아래 명령어를 실행하기 위해 /quickstarts/tutorials/hello-kubernetes/deploy
디렉토리로 이동합니다.
kubectl delete -f node.yaml
kubectl delete -f python.yaml
이제 eksctl
명령어를 사용하여 EKS 클러스터를 해체하고 Amazon ElastiCache를 삭제할 수 있습니다.
첫 번째 단계에서 클러스터를 생성하는 데 사용된 cluster.yaml
파일이 있는 디렉토리로 이동합니다.
eksctl delete cluster -f cluster.yaml
결론
Dapr와 Amazon EKS는 마이크로서비스 개발을 위한 강력한 동맹을 형성합니다. Dapr는 교차 절단 문제를 간소화하고, EKS는 Kubernetes 인프라를 관리하여 개발자들이 핵심 비즈니스 로직에 집중하고 생산성을 높일 수 있도록 합니다.
이 조합은 확장 가능하고 탄력적이며 관찰 가능한 애플리케이션의 생성을 가속화하여 운영 오버헤드를 상당히 줄입니다. 이는 마이크로서비스 여정을 위한 이상적인 기반입니다. Dapr와 EKS의 분산 추적 및 관찰 가능성에 대한 기능을 탐구하는 다가오는 게시물을 주목해 주세요. 더 깊은 통찰력과 모범 사례를 제공합니다.
Source:
https://dzone.com/articles/streamline-microservices-development-with-dapr-amazon-eks