컨테이너를 활용하여 마이크로서비스를 구성할 때는 효과적으로 컨테이너 및 서비스를 관리할 수 있는 방법이 필요합니다. 본 세션에서는 유연하게 컨테이너 환경을 관리/모니터링 할 수 있는 Amazon EC2 Container Service 및 EC2 Container Registry를 소개합니다. 아울러 Amazon ECS/ECR 환경에서 효과적인 자원 및 로그 관리, 마이크로서비스 관리에 대해서 자세히 살펴봅니다.
2. 강연 중 질문하는 법
자신이 질문한 내역이 표시되며, 전체 공개로 답변된 내용은 검은색,
질문자 본인에게만 공개로 답변된 내용은 붉은 색으로 돌아옵니다.
3. 본 세션의 주요 주제
• 마이크로서비스 아키텍쳐 이해
• 도커 컨테이너에 대하여
• Amazon EC2 Container Service
• Amazon EC2 Container Registry
• AWS에서 Service Discovery 구성하기
• ECS/ECR 기반의 DevOps 환경
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. 마이크로서비스 구성 요소
Client Data
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
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
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
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에 대해 자세히
알아봅니다!
19. Amazon EC2 Container Service (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 아키텍쳐
ALB ALB
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
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
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 사용 가능
57. Amazon EC2 Container Registry (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 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
62. Service Discovery: ELB 사용
• CloudWatch Events, Lambda 및 Route53 private hosted zone을
사용하여 자동으로 구성
• Route53이 service registry로 사용됨
• ECS의 Service API에 따라 Lambda를 사용하여 레코드를 추가/삭제
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)