KEMBAR78
Amazon ECS/ECR을 활용하여 마이크로서비스 구성하기 - 김기완 (AWS 솔루션즈아키텍트) | PDF
© 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. Microservice
Libraries vs. Services
개별적인 기능별로 구성된 팀 vs. 비즈니스 중심의, 기능이 섞여 있는 서비스 단위 팀
차세대 vs. 소리소문 없는 끊임없는 기능 업데이트
마이크로서비스 아키텍쳐의 이점
• 빠른 개발 속도 : 개발 언어 선택의 자유로움, 서비스 팀의
역량만으로 가능
• 빠른 배포 속도 및 병렬 배포 : 각 마이크로서비스간 독립된 배포
파이프라인 (CI/CD)
• DevOps팀과 통합된 운영 : 서비스에 대한 Ownership!
• 확장성, 가용성 : 마이크로서비스 특성에 맞는 확장성/가용성 설계
• 비즈니스 도메인과 밀접하게 연결 : Lean Cycle
마이크로서비스 아키텍쳐 공통 구성 요소
• 모든 서비스들에 적용되는 공통 요소들 :
• 서비스 등록 및 제거 (Registration/Deregistration)
• 서비스 검색 (Discovery) 및 가용성 관리 (Healthiness)
• 서비스 메타데이터 관리 (Oauth, …)
• 서비스 버전 관리
• 서비스 별 Cache 관리
• 빠르고 효율적인 배포 환경 관리
• 자동화된 관리 및 모니터링
마이크로서비스 설계의 고려 사항
• 모든 마이크로서비스는 :
• 탄력적(Elastic)이어야 함 (다른 서비스들과는 무관한 스케일
업/다운)
• 단위 리소스의 장애를 견디어야 함 (Resilient)
• 통일된 API 인터페이스를 가져야 함 (Composable)
• 작게 유지되어야 함 (Minimal)
• 다른 서비스들과는 독립적이어야 함 (Complete)
마이크로서비스 구성 요소
Client Data
Store
DiscoveryGateway
Business
Domain
Microservices
API
마이크로서비스 구성 요소 + DevOps
Client Data
Store
DiscoveryGateway
Business
Domain
Version Control Repository
Continuous
Integration
Continuous
Delivery
Microservices
API
DevOps Pipeline
마이크로서비스 구성 요소 + DevOps
Client Data
Store
DiscoveryGateway
Business
Domain
Version Control Repository
Continuous
Integration
Continuous
Delivery
Microservices
API
DevOps Pipeline
API Gateway
Elastic Load
Balancing
Amazon ECSElastic
Beanstalk
Lambda
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 구성 요소: 클러스터
Docker
Task
EC2 instance
Container
Docker
Task
EC2 instance
Task
Docker
EC2 instance
Task
AZ 1 AZ 2
Container Container Container
Amazon ECS 구성 요소: 클러스터 관리 엔진
Docker
Task
EC2 instance
Container
Docker
Task
EC2 instance
Task
Docker
EC2 instance
Task
AZ 1 AZ 2
Container Container Container
Cluster Management Engine
Amazon ECS 구성 요소: 클러스터 관리 엔진
Docker
Task
EC2 instance
Container
Docker
Task
EC2 instance
Task
Docker
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
instance
Volume 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
CloudWatch
ECS Metrics
#docker top
CloudWatch
EC2 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 instances
Amazon
SNS
Auto Scaling
Lifecycle hook
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon
ECS
Lambda function
Amazon
SNS
Set (instance_ID, “draining”)
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon
ECS
Lambda function
Amazon
SNS
Set (instance_ID, “draining”)
If ECSDescribeTasks(instance_ID) == NULL
CompleteLifecycleAction(instance_ID)
Else
Print(“Still running some tasks”)
Amazon ECS: 오토 스케일링: 컨테이너 드레이닝
ECS cluster instances
Amazon
ECS
Lambda function
Amazon
SNS
Set (instance_ID, “draining”)
If ECSDescribeTasks(instance_ID) == NULL
CompleteLifecycleAction(instance_ID)
Else
Print(“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/HTTPS
TCP/SSL
ELB
example.com/app2
example.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 store
DynamoDB
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
더 나은 세미나를 위해
여러분의 의견을 남겨 주세요!

Amazon ECS/ECR을 활용하여 마이크로서비스 구성하기 - 김기완 (AWS 솔루션즈아키텍트)

  • 1.
    © 2016, AmazonWeb Services, Inc. or its Affiliates. All rights reserved. 김기완, 솔루션즈 아키텍트 2017년 11월 1일 Amazon ECS/ECR을 활용하여 마이크로서비스 구성하기
  • 2.
    강연 중 질문하는법 자신이 질문한 내역이 표시되며, 전체 공개로 답변된 내용은 검은색, 질문자 본인에게만 공개로 답변된 내용은 붉은 색으로 돌아옵니다.
  • 3.
    본 세션의 주요주제 • 마이크로서비스 아키텍쳐 이해 • 도커 컨테이너에 대하여 • Amazon EC2 Container Service • Amazon EC2 Container Registry • AWS에서 Service Discovery 구성하기 • ECS/ECR 기반의 DevOps 환경
  • 4.
  • 5.
    마이크로서비스 아키텍쳐란? 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. Microservice Libraries vs. Services 개별적인 기능별로 구성된 팀 vs. 비즈니스 중심의, 기능이 섞여 있는 서비스 단위 팀 차세대 vs. 소리소문 없는 끊임없는 기능 업데이트
  • 6.
    마이크로서비스 아키텍쳐의 이점 •빠른 개발 속도 : 개발 언어 선택의 자유로움, 서비스 팀의 역량만으로 가능 • 빠른 배포 속도 및 병렬 배포 : 각 마이크로서비스간 독립된 배포 파이프라인 (CI/CD) • DevOps팀과 통합된 운영 : 서비스에 대한 Ownership! • 확장성, 가용성 : 마이크로서비스 특성에 맞는 확장성/가용성 설계 • 비즈니스 도메인과 밀접하게 연결 : Lean Cycle
  • 7.
    마이크로서비스 아키텍쳐 공통구성 요소 • 모든 서비스들에 적용되는 공통 요소들 : • 서비스 등록 및 제거 (Registration/Deregistration) • 서비스 검색 (Discovery) 및 가용성 관리 (Healthiness) • 서비스 메타데이터 관리 (Oauth, …) • 서비스 버전 관리 • 서비스 별 Cache 관리 • 빠르고 효율적인 배포 환경 관리 • 자동화된 관리 및 모니터링
  • 8.
    마이크로서비스 설계의 고려사항 • 모든 마이크로서비스는 : • 탄력적(Elastic)이어야 함 (다른 서비스들과는 무관한 스케일 업/다운) • 단위 리소스의 장애를 견디어야 함 (Resilient) • 통일된 API 인터페이스를 가져야 함 (Composable) • 작게 유지되어야 함 (Minimal) • 다른 서비스들과는 독립적이어야 함 (Complete)
  • 9.
    마이크로서비스 구성 요소 ClientData Store DiscoveryGateway Business Domain Microservices API
  • 10.
    마이크로서비스 구성 요소+ DevOps Client Data Store DiscoveryGateway Business Domain Version Control Repository Continuous Integration Continuous Delivery Microservices API DevOps Pipeline
  • 11.
    마이크로서비스 구성 요소+ DevOps Client Data Store DiscoveryGateway Business Domain Version Control Repository Continuous Integration Continuous Delivery Microservices API DevOps Pipeline API Gateway Elastic Load Balancing Amazon ECSElastic Beanstalk Lambda DynamoDB RDS AWS CodeCommit Amazon ECR AWS CodeDeploy AWS CodeBuild AWS CodePipeline AWS CodeStar AWS X-Ray
  • 12.
  • 13.
    마이크로서비스 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), • 빠르게 병렬로 배포되며, • 스케일 업/다운이 쉽고 빨라야 하며, • 서비스간의 종속성이 없어야 함
  • 14.
    하지만,,, Server Guest OS Server Guest OS Server GuestOS 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
  • 15.
    도커를 마이크로서비스에 적용시고려사항 1. 도커 컨테이너에 대한 Orchestration 2. 마이크로서비스를 사용하기 위한 배포 파이프라인 구성 3. 마이크로서비스에 대한 서비스 Discovery 방법 4. 마이크로서비스에 대한 모니터링 (가용성, 성능관리)
  • 16.
    도커 컨테이너에 대한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에 대해 자세히 알아봅니다!
  • 17.
  • 18.
  • 19.
    Amazon EC2 ContainerService (ECS) 유연한 컨테이너 배치 기능 모든 규모의 컨테이너 관리 AWS 에서 플랫폼으로 통합 별도의 어플리케이션이 필요 없는 컨테이너 운영 매니지드 서비스
  • 20.
    Amazon ECS 구성요소 • 클러스터 • 작업이 실행되는 EC2 인스턴스의 함대 • 작업 정의 (Task Definitions) • 작업에 대한 컨테이너 및 환경의 정의 • 작업 (Task) • 인스턴스에서 실행되는 실제 컨테이너 작업 클러스터 관리 엔진 클러스터 리소스 및 작업 상태 관리 스케줄러 클러스터 상태를 고려한 작업 배치 에이전트 EC2 인스턴스 및 매니저와 통신
  • 21.
    Amazon ECS 구성요소: 클러스터 Docker Task EC2 instance Container Docker Task EC2 instance Task Docker EC2 instance Task AZ 1 AZ 2 Container Container Container
  • 22.
    Amazon ECS 구성요소: 클러스터 관리 엔진 Docker Task EC2 instance Container Docker Task EC2 instance Task Docker EC2 instance Task AZ 1 AZ 2 Container Container Container Cluster Management Engine
  • 23.
    Amazon ECS 구성요소: 클러스터 관리 엔진 Docker Task EC2 instance Container Docker Task EC2 instance Task Docker EC2 instance Task AZ 1 AZ 2 Container Container Container Cluster Management Engine ECS agentECS agentECS agent Agent Communication Service
  • 24.
    Amazon ECS 아키텍쳐 ALBALB AZ 1 AZ 2 user/scheduler Scheduler Cluster State Service Placement Engine Event Stream Internet ECS agent ECS agent ECS agent
  • 25.
    Amazon ECS 구성요소: 작업 정의 (Task Definition) Volume definitions Container definitions
  • 26.
    Amazon ECS 구성요소: 작업 정의 (Task Definition) ◉ AWS 관리 콘솔 u ECS u Task Definitions u Create new Task Definitions u Add container u Add volumes
  • 27.
    Amazon ECS 구성요소: 작업 정의 (Task Definition) ◉ AWS 관리 콘솔 u ECS u Task Definitions u Create new Task Definitions u Configure via JSON
  • 28.
    Amazon ECS 구성요소: 작업 (Task) Data Volume Containers 스케줄링 EC2 instance Volume definitions Container definitions • ECS 클러스터에서 업무를 수행하는 단위 • 관련 있는 하나 혹은 하나 이상의 컨테이너들의 모임 • ECS 클러스터에 속하는 인스턴스에 배포
  • 29.
    Amazon ECS 구성요소: 서비스 (Service) • 작업 정의와 작업 개수를 기반으로 클러스터 내 서비스 생성 • 설정한 작업 개수로 컨테이너 이상 시 자동 복구 • Elastic Load Balancing을 통한 컨테이너 부하 분산 설정 가능 • Auto Scaling 설정 가능
  • 30.
    Amazon ECS 구성요소: 서비스 (Service) ◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create
  • 31.
    Amazon ECS 구성요소: 서비스 (Service) ◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create
  • 32.
    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
  • 33.
    Amazon ECS: 스케줄링– 컨테이너 배치 전략 Binpacking Spread Affinity Distinct Instance
  • 34.
    Amazon ECS: 스케줄링– 컨테이너 배치 전략 (1) g2.2xlarge t2.small g2.2xlarge g2.2xlarge 특정 인스턴스 타입에 배치
  • 35.
    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
  • 36.
    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
  • 37.
    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
  • 38.
    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
  • 39.
    Amazon ECS: 스케줄링– 컨테이너 배치 예 ◉ AWS 관리 콘솔 u ECS u Clusters u Services u Create u Task Placement
  • 40.
    Amazon ECS: 모니터링로깅 – ECS 메트릭 • 2개 Dimensions • ClusterName • ServiceName • 4개 지표 • CPUReservation • MemoryReservation • CPUUtilization • MemoryUtilization Container Instance … Cluster Task definition Task Service CloudWatch ECS Metrics #docker top CloudWatch EC2 Metrics Container Instance
  • 41.
    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)
  • 42.
    Amazon ECS: 모니터링로깅 – ECS 클러스터 모니터링 ◉ AWS 관리 콘솔 u ECS u Clusters u Metrics
  • 43.
    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)
  • 44.
    Amazon ECS: 모니터링로깅 – ECS 서비스 모니터링 ◉ AWS 관리 콘솔 u ECS u Clusters u Services u Metrics
  • 45.
    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
  • 46.
    Amazon ECS: 모니터링로깅 – CloudWatch Logs logging driver
  • 47.
    Amazon ECS: 오토스케일링
  • 48.
    Amazon ECS: 오토스케일링: 컨테이너 드레이닝 ECS cluster instances Auto Scaling “scale in” event
  • 49.
    Amazon ECS: 오토스케일링: 컨테이너 드레이닝 ECS cluster instances Amazon SNS Auto Scaling Lifecycle hook
  • 50.
    Amazon ECS: 오토스케일링: 컨테이너 드레이닝 ECS cluster instances Amazon ECS Lambda function Amazon SNS Set (instance_ID, “draining”)
  • 51.
    Amazon ECS: 오토스케일링: 컨테이너 드레이닝 ECS cluster instances Amazon ECS Lambda function Amazon SNS Set (instance_ID, “draining”) If ECSDescribeTasks(instance_ID) == NULL CompleteLifecycleAction(instance_ID) Else Print(“Still running some tasks”)
  • 52.
    Amazon ECS: 오토스케일링: 컨테이너 드레이닝 ECS cluster instances Amazon ECS Lambda function Amazon SNS Set (instance_ID, “draining”) If ECSDescribeTasks(instance_ID) == NULL CompleteLifecycleAction(instance_ID) Else Print(“Still running some tasks”) Complete Lifecycle hook
  • 53.
    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 사용 가능
  • 54.
    Amazon ECS: 로드밸런싱: ELB & ALB HTTP/HTTPS TCP/SSL ELB example.com/app2 example.com/app1 app1 app2 app1/ app2 ELB EC2 Instance EC2 Instance EC2 Instance EC2 Instance EC2 Instance EC2 Instance ALB
  • 55.
    Amazon ECS: 로드밸런싱: ALB를 활용한 ECS 컨테이너 로드 밸런싱 Container Instance Container Container Target Group Container Container Target GroupALB
  • 56.
  • 57.
    Amazon EC2 ContainerRegistry (ECR) • 보안 • IAM 리소스 기반 정책 활용 • 전송 및 저장시 이미지 암호화 (HTTPS, SSE) • 손쉬운 이미지 관리 및 배포 • ECS와 통합 • 독립적인 서비스 • Docker CLI와 통합 • 관리 콘솔 & AWS CLI를 통한 제어 • 가용성 & 성능 • S3 기반 • Regional Endpoints • 수백 건의 동시 pull처리
  • 58.
    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
  • 59.
    Amazon ECR DockerCredential 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
  • 60.
  • 61.
    Service Discovery 구성요소 Registry Health Checks Metadata store
  • 62.
    Service Discovery: ELB사용 • CloudWatch Events, Lambda 및 Route53 private hosted zone을 사용하여 자동으로 구성 • Route53이 service registry로 사용됨 • ECS의 Service API에 따라 Lambda를 사용하여 레코드를 추가/삭제
  • 63.
    Service Discovery: ELB사용 https://github.com/awslabs/ecs-refarch-service-discovery
  • 64.
  • 65.
    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)
  • 66.
    Service Discovery: DNS사용 https://github.com/awslabs/service-discovery-ecs-dns
  • 67.
  • 68.
    Service Discovery: 여러AWS Service 활용 Route53Registry Health Checks Metadata store DynamoDB
  • 69.
    Service Discovery: 여러AWS Service 활용 Registry Health Checks Metadata store DynamoDB ELB Parameter Store
  • 70.
    Service Discovery: 3rdparty tools • Weaveworks • Consul • etcd • Zookeeper • Eureka • and more
  • 71.
  • 72.
  • 73.
  • 74.
    Amazon ECS ContinuousDeployment https://github.com/awslabs/ecs-refarch-continuous-deployment
  • 75.
    질문에 대한 답변드립니다. 발표자료/녹화영상 제공합니다. http://bit.ly/awskr-webinar 더 나은 세미나를 위해 여러분의 의견을 남겨 주세요!