amazon ecs/ecr을 활용하여 마이크로서비스 구성하기 - 김기완 (aws...
TRANSCRIPT
© 2016, Amazon Web Services, Inc. or its Affiliates. All rights reserved.
김기완, 솔루션즈 아키텍트
2017년 11월 1일
Amazon ECS/ECR을 활용하여마이크로서비스 구성하기
강연 중 질문하는 법
자신이 질문한 내역이 표시되며, 전체 공개로 답변된 내용은 검은색,
질문자 본인에게만 공개로 답변된 내용은 붉은 색으로 돌아옵니다.
본 세션의 주요 주제
• 마이크로서비스 아키텍쳐 이해• 도커 컨테이너에 대하여• Amazon EC2 Container Service• Amazon EC2 Container Registry• AWS에서 Service Discovery 구성하기• ECS/ECR 기반의 DevOps 환경
마이크로서비스 아키텍쳐
마이크로서비스 아키텍쳐란?In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.
James Lewis & Martin Fowler, https://martinfowler.com/articles/microservices.html
Monolithic vs. MicroserviceLibraries vs. Services
개별적인 기능별로 구성된 팀 vs. 비즈니스 중심의, 기능이 섞여 있는 서비스 단위 팀차세대 vs. 소리소문 없는 끊임없는 기능 업데이트
마이크로서비스 아키텍쳐의 이점
• 빠른 개발 속도 : 개발 언어 선택의 자유로움, 서비스 팀의
역량만으로 가능
• 빠른 배포 속도 및 병렬 배포 : 각 마이크로서비스간 독립된 배포
파이프라인 (CI/CD)
• DevOps팀과 통합된 운영 : 서비스에 대한 Ownership!
• 확장성, 가용성 : 마이크로서비스 특성에 맞는 확장성/가용성 설계
• 비즈니스 도메인과 밀접하게 연결 : Lean Cycle
마이크로서비스 아키텍쳐 공통 구성 요소
• 모든 서비스들에 적용되는 공통 요소들 :
• 서비스 등록 및 제거 (Registration/Deregistration)
• 서비스 검색 (Discovery) 및 가용성 관리 (Healthiness)
• 서비스 메타데이터 관리 (Oauth, …)
• 서비스 버전 관리
• 서비스 별 Cache 관리
• 빠르고 효율적인 배포 환경 관리
• 자동화된 관리 및 모니터링
마이크로서비스 설계의 고려 사항
• 모든 마이크로서비스는 :
• 탄력적(Elastic)이어야 함 (다른 서비스들과는 무관한 스케일
업/다운)
• 단위 리소스의 장애를 견디어야 함 (Resilient)
• 통일된 API 인터페이스를 가져야 함 (Composable)
• 작게 유지되어야 함 (Minimal)
• 다른 서비스들과는 독립적이어야 함 (Complete)
마이크로서비스 구성 요소
Client DataStore
DiscoveryGateway BusinessDomain
MicroservicesAPI
마이크로서비스 구성 요소 + DevOps
Client DataStore
DiscoveryGateway BusinessDomain
Version Control Repository
Continuous Integration
Continuous Delivery
MicroservicesAPI
DevOps Pipeline
마이크로서비스 구성 요소 + DevOps
Client DataStore
DiscoveryGateway BusinessDomain
Version Control Repository
Continuous Integration
Continuous Delivery
MicroservicesAPI
DevOps Pipeline
API GatewayElastic LoadBalancing Amazon ECSElastic
BeanstalkLambda
DynamoDB RDS
AWS CodeCommit
Amazon ECR
AWS CodeDeploy
AWS CodeBuild
AWS CodePipeline
AWS CodeStar
AWS X-Ray
도커 컨테이너
마이크로서비스 vs. 도커 컨테이너“Capital One은 빠르게 클라우드에 최적화된 마이크로서비스 아키텍쳐를 받아들이고 있으며, 새로운 워크로드 및 기존의워크로드에도 적용해 나가고 있습니다. 마이크로서비스 적용을 고도화하고, 클라우드 자원들의 효율성을 높이며인프라스트럭쳐로부터 어플리케이션 레이어를 분리하기 위해서 Docker를 사용하여 워크로드들을 컨테이너화 (Containerize)하기시작하였고, Amazon EC2 Container 서비스를 사용하여 컨테이너들을 관리하고 있습니다.
도커를 통하여 과거에는 수 분, 여러 시간, 여러 날들이 걸리던 배포를 수 초만에 어디든지 원하는 곳에 (Dev/QA/Performance/Prod) 배포할 수 있게 되었습니다.”
https://aws.amazon.com/blogs/compute/microservice-delivery-with-amazon-ecs-and-application-load-balancers/
도커 컨테이너는:
• 작게 유지되고,
• 빠르게 배포되며,
• 스케일 업/다운이 쉽고 빠르며,
• 인프라스트럭쳐에 대한 종속성이 없음
마이크로서비스는:
• 작게 유지되어야 하고 (Minimal),
• 빠르게 병렬로 배포되며,
• 스케일 업/다운이 쉽고 빨라야 하며,
• 서비스간의 종속성이 없어야 함
하지만,,,
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
Server
Guest OS
도커를 마이크로서비스에 적용시 고려사항
1. 도커 컨테이너에 대한 Orchestration
2. 마이크로서비스를 사용하기 위한 배포 파이프라인 구성
3. 마이크로서비스에 대한 서비스 Discovery 방법
4. 마이크로서비스에 대한 모니터링 (가용성, 성능관리)
도커 컨테이너에 대한 Orchestration
• 도커 컨테이너에 대한 스케줄링 (배치? 서비스?)
• 컨테이너 클러스터에 대한 자원 사용량 모니터링 및 자원 분배
• Auto Scaling / Load Balancing
• 이미지 레파지토리 관리
Docker Swarm: https://docs.docker.com/docker-for-aws/
Kubernetes: https://aws.amazon.com/quickstart/architecture/heptio-kubernetes/
오늘은 Amazon EC2 Container Service, EC2 Container Registry에 대해 자세히
알아봅니다!
Amazon EC2 Container Service
시작하기 전에…
Amazon EC2 Container Service (ECS)
유연한 컨테이너배치 기능
모든 규모의컨테이너 관리
AWS 에서플랫폼으로 통합
별도의 어플리케이션이 필요 없는 컨테이너운영 매니지드 서비스
Amazon ECS 구성 요소
• 클러스터• 작업이 실행되는 EC2
인스턴스의 함대
• 작업 정의 (Task Definitions)• 작업에 대한 컨테이너 및
환경의 정의
• 작업 (Task)• 인스턴스에서 실행되는 실제
컨테이너 작업
클러스터 관리 엔진클러스터 리소스 및 작업 상태관리
스케줄러클러스터 상태를 고려한 작업배치
에이전트EC2 인스턴스 및 매니저와통신
Amazon ECS 구성 요소: 클러스터
DockerTask
EC2 instance
Container
DockerTask
EC2 instance
TaskDocker
EC2 instance
Task
AZ 1 AZ 2
Container Container Container
Amazon ECS 구성 요소: 클러스터 관리 엔진
DockerTask
EC2 instance
Container
DockerTask
EC2 instance
TaskDocker
EC2 instance
Task
AZ 1 AZ 2
Container Container Container
Cluster Management Engine
Amazon ECS 구성 요소: 클러스터 관리 엔진
DockerTask
EC2 instance
Container
DockerTask
EC2 instance
TaskDocker
EC2 instance
Task
AZ 1 AZ 2
Container Container Container
Cluster Management Engine
ECS agentECS agentECS agent
Agent Communication Service
Amazon ECS 아키텍쳐
ALB ALB
AZ 1 AZ 2
user/scheduler
Scheduler
Cluster State Service
Placement Engine
Event Stream
Internet
ECS agent ECS agent ECS agent
Amazon ECS 구성 요소: 작업 정의 (Task Definition)
Volume definitions
Container definitions
Amazon ECS 구성 요소: 작업 정의 (Task Definition)◉ AWS 관리 콘솔 u ECS u Task Definitions u Create new Task Definitions u Add container
u Add volumes
Amazon ECS 구성 요소: 작업 정의 (Task Definition)◉ AWS 관리 콘솔 u ECS u Task Definitions u Create new Task Definitions u Configure via JSON
Amazon ECS 구성 요소: 작업 (Task)
Data Volume
Containers
스케줄링EC2
instanceVolume definitions
Container definitions
• ECS 클러스터에서 업무를 수행하는 단위
• 관련 있는 하나 혹은 하나 이상의 컨테이너들의 모임
• ECS 클러스터에 속하는 인스턴스에 배포
Amazon ECS 구성 요소: 서비스 (Service)
• 작업 정의와 작업 개수를 기반으로 클러스터 내 서비스 생성
• 설정한 작업 개수로 컨테이너 이상 시 자동 복구
• Elastic Load Balancing을 통한 컨테이너 부하 분산 설정 가능
• Auto Scaling 설정 가능
Amazon ECS 구성 요소: 서비스 (Service)◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create
Amazon ECS 구성 요소: 서비스 (Service)◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create
Amazon ECS: 스케줄링 – 컨테이너 배치
클러스터 제약조건
커스텀 제약조건
배치 전략
필터 적용
CPU, 메모리 및 포트 요구 사항
위치, 인스턴스 유형, AMI, 사용자정의 속성 제약에 대한 필터링
배치 전략을 충족하는인스턴스 식별
배치 할 최종 컨테이너인스턴스 선택
Name Example
AMI ID attribute:ecs.ami-id == ami-eca289fb
Availability Zone
attribute:ecs.availability-zone == us-east-1a
Instance Type
attribute:ecs.instance-type == t2.small
Distinct Instances type=“distinctInstance”
Custom attribute:stack == prod
Amazon ECS: 스케줄링 – 컨테이너 배치 전략
Binpacking Spread Affinity Distinct Instance
Amazon ECS: 스케줄링 – 컨테이너 배치 전략 (1)
g2.2xlarge t2.small g2.2xlarge g2.2xlarge
특정 인스턴스 타입에 배치
Amazon ECS: 스케줄링 – 컨테이너 배치 전략 (2)
특정 인스턴스 타입 및 AZ를 선택하여 배포
g2.2xlarge t2.small t2.micro t2.medium
t2.medium t2.small g2.2xlarge
t2.small
t2.small t2.medium
us-east-1aus-east-1d
Amazon ECS: 스케줄링 – 컨테이너 배치 전략 (3)
Availability Zone별 분산 (spread)
g2.2xlarge t2.small t2.micro t2.medium
t2.medium t2.small g2.2xlarge t2.small
us-east-1aus-east-1d
g2.2xlarge t2.medium
t2.micro t2.small
us-east-1c
Amazon ECS: 스케줄링 – 컨테이너 배치 전략 (4)
Availability Zone별 분산 후 Binpack (메모리에 따라)
g2.2xlarge t2.small t2.micro t2.medium
t2.medium t2.small g2.2xlarge t2.small
us-east-1aus-east-1d
g2.2xlarge t2.medium
t2.micro t2.small
us-east-1c
Amazon ECS: 스케줄링 – 컨테이너 배치 전략 (6)
t2.medium g2.2xlarge t2.micro t2.small
t2.small t2.small g2.2xlarge t2.small
t2.small t2.small
g2.2xlarge t2.small
Amazon ECS: 스케줄링 – 컨테이너 배치 예
◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create u Task Placement
Amazon ECS: 모니터링 로깅 – ECS 메트릭
• 2개 Dimensions• ClusterName• ServiceName
• 4개 지표• CPUReservation• MemoryReservation• CPUUtilization• MemoryUtilization Container
Instance
…
Cluster
Task definition
Task
Service
CloudWatchECS Metrics
#docker top
CloudWatchEC2 Metrics
Container Instance
Amazon ECS: 모니터링 로깅 – ECS 클러스터 모니터링
• Reservation• 클러스터 인스턴스의 task들이 예약한 CPU,메모리의 백분율
• Utilization• 클러스터 인스턴스의 task들이 사용한 CPU,메모리의 백분율
(Total CPU units / MiB of memory used by tasks in cluster)------------------------------------------------------------------------------------------- x 100(Total CPU units / MiB of memory registered by container instances in cluster)
(Total CPU units / MiB of memory reserved by tasks in cluster)------------------------------------------------------------------------------------------- x 100(Total CPU units / MiB of memory registered by container instances in cluster)
Amazon ECS: 모니터링 로깅 – ECS 클러스터 모니터링
◉ AWS 관리 콘솔 u ECS u Clusters u Metrics
Amazon ECS: 모니터링 로깅 – ECS 서비스 모니터링
• Utilization• CPU, 메모리 기준 서비스에 지정된 Task가 사용하는 CPU 및 메모리의 백분율
예) c4.large 인스턴스 (2,048 CPU, 3,768 MiB)----------------------------------------------서비스 내 Task1개 (512 CPU, 1024MiB 예약)
일정 기간 Task가 CPU 단위 2,048개 사용, 메모리 512MiB 사용-> CPU 사용률 400%, 메모리 사용률 50% 보고됨
(Total CPU units / MiB of memory used by tasks in cluster)----------------------------------------------------------------------------------------------------- x 100
(Total CPU units / MiB of memory reserved in task definition) x (number of tasks in service)
Amazon ECS: 모니터링 로깅 – ECS 서비스 모니터링
◉ AWS 관리 콘솔 u ECS u Clusters u Services u Metrics
Amazon ECS: 모니터링 로깅 – CloudWatch Logs를 활용한 로그 처리
CloudWatch Logs Amazon S3
Amazon Kinesis
AWS Lambda
Amazon Elasticsearch Service
Amazon ECS Store
Stream
Process
Search
CloudWatch Logs
CloudWatch Logs
CloudWatch Logs
Amazon ECS: 모니터링 로깅 – CloudWatch Logs logging driver
Amazon ECS: 오토 스케일링
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Auto Scaling “scale in” event
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instancesAmazon
SNS
Auto Scaling Lifecycle hook
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon ECS
Lambda function
AmazonSNS
Set (instance_ID, “draining”)
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon ECS
Lambda function
AmazonSNS
Set (instance_ID, “draining”)
If ECSDescribeTasks(instance_ID) == NULL CompleteLifecycleAction(instance_ID)
ElsePrint(“Still running some tasks”)
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon ECS
Lambda function
AmazonSNS
Set (instance_ID, “draining”)
If ECSDescribeTasks(instance_ID) == NULL CompleteLifecycleAction(instance_ID)
ElsePrint(“Still running some tasks”)
Complete Lifecycle hook
Amazon ECS: 로드 밸런싱: ELB & ALB
• ELB port와 컨테이너 port의 고정적 관계 필요• 예) ELB port 80 -> 컨테이너 port 3030 매핑가능
ELB port 80 -> 컨테이너 port 3030과 다른 컨테이너port 4040 동시 매핑 불가
Classic Load Balancer
Application Load Balancer
동적 호스트 Port 매핑 지원
예) 컨테이너 port 80 지정 -> 호스트 port 0 지정 시 임시 포트범위 (Amazon ECS AMI 기준 32768 ~ 61000) 에서 포트 동적 할당
-> Port 기반 라우팅, 우선 순위 규칙 지원으로 다른여러 서비스에 단일 ALB 동일한 리스너 port 사용 가능
Amazon ECS: 로드 밸런싱: ELB & ALB
HTTP/HTTPSTCP/SSL
ELB
example.com/app2example.com/app1
app1
app2
app1/app2
ELB
EC2 Instance
EC2 Instance
EC2 Instance
EC2 Instance
EC2 Instance
EC2 Instance
ALB
Amazon ECS: 로드 밸런싱: ALB를 활용한 ECS 컨테이너 로드 밸런싱
Container Instance
Container
Container
Target Group
Container
Container
Target GroupALB
Amazon EC2 Container Registry
Amazon EC2 Container Registry (ECR)
• 보안• IAM 리소스 기반 정책활용• 전송및 저장시 이미지암호화 (HTTPS, SSE)
• 손쉬운 이미지 관리 및 배포• ECS와 통합• 독립적인 서비스• Docker CLI와 통합• 관리콘솔 & AWS CLI를 통한 제어
• 가용성 & 성능• S3 기반• Regional Endpoints• 수백 건의 동시 pull처리
Amazon ECR 셋업
# Authenticate Docker to your Amazon ECR registry> aws ecr get-login> docker login -u AWS -p <password> -e none https://<aws_account_id>.dkr.ecr.us-east-1.amazonaws.com> docker login -u AWS -p <password> -e none https://<aws_account_id>.dkr.ecr.us-east-1.amazonaws.com
# Create a repository called ecr-demo> aws ecr create-repository --repository-name ecr-demo
# Push an image to your repository> docker push <aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/ecr-demo:v1
Amazon ECR Docker Credential Helper
• https://github.com/awslabs/amazon-ecr-credential-helper
• docker-credential-ecr-login 바이너리를 PATH에 설정• ~/.docker/config.json 파일 설정:
{ "credsStore": "ecr-login" }
• Push and pull images from ECR without docker login
Service Discovery options on AWS
Service Discovery 구성 요소
Registry
Health Checks
Metadata store
Service Discovery: ELB 사용
• CloudWatch Events, Lambda 및 Route53 private hosted zone을
사용하여 자동으로 구성
• Route53이 service registry로 사용됨
• ECS의 Service API에 따라 Lambda를 사용하여 레코드를 추가/삭제
Service Discovery: ELB 사용
https://github.com/awslabs/ecs-refarch-service-discovery
Service Discovery: ELB 사용
Service Discovery: DNS 사용
• 컨테이너 인스턴스에 agent를 설치하여 사용 (open source,
ecssd_agent.go)
• Agent가 service name, IP, port를 route53 private hosted zone에
추가 (SRV record)
• lambda_health_check.py를 통해 문제가 있는 service를 cleanup
(scheduled lambda function)
Service Discovery: DNS 사용
https://github.com/awslabs/service-discovery-ecs-dns
Service Discovery: DNS 사용
Service Discovery: 여러 AWS Service 활용
Route53Registry
Health Checks
Metadata storeDynamoDB
Service Discovery: 여러 AWS Service 활용
Registry
Health Checks
Metadata store
DynamoDB
ELB
Parameter Store
Service Discovery: 3rd party tools
• Weaveworks
• Consul
• etcd
• Zookeeper
• Eureka
• and more
Service Discovery: Consul
Service Discovery: Consul
ECS/ECR 기반의 DevOps 환경
Amazon ECS Continuous Deployment
https://github.com/awslabs/ecs-refarch-continuous-deployment
질문에 대한 답변 드립니다.
발표자료/녹화영상 제공합니다.http://bit.ly/awskr-webinar
더 나은 세미나를 위해여러분의 의견을 남겨 주세요!