ECS(Elastic Container Service)
ECS란?
- 컨테이너 관리 서비스(Docker 컨테이너를 이용해 인프라 환경을 좀 더 편리하게 운영, 관리 할 수 있게 해주는 서비스)
- API 호출을 통해 컨테이너 기반 애플리케이션 시작/중지 가능(손쉬운 관리)
여기서 ** 컨테이너란?
원래 사용되던 VM의 아래와 같은 단점을 보완하기 위해 만들어진 서비스
- 머신 수준의 분리를 위해 하드웨어 가상화가 필요하다
- 다양한 부분의 가상화가 필요하므로 많은 리소스와 오버헤드가 수반됩니다
- OS의 이미지도 포함하기 때문에 가상 머신 이미지의 용량이 크다
- 서버의 일관된 운영이 힘들다(snowflake server)
컨테이너의 장점
- 하드웨어의 가상화를 하지 않고 커널만을 공유한다
- 하드웨어 에뮬레이션이 없기 때문에 빠른 속도로 빠르게 실행된다
- 이미지의 용량이 가상 머신에 비해 훨씬 작다
- 컨테이너 간에 영향을 주지 않으며 도커와 같이 이미지 기반으로 컨테이너를 실행하는 경우 특정 실행 환경을 쉽게 재사용 할 수 있다
- 실행/패치/업데이트 등 유지 관리와 관련하여 오버헤드가 감소한다
- 서비스가 세분화 되어 있는 마이크로 서비스 아키텍쳐(MSA)의 특성에 컨테이너의 서비스 별 격리나 확장성 등을 잘 활용할 수 있다
동작 방식
→ 이를 통해 하나의 서버에서 여러개의 컨테이너를 구동할 수 있게 됨.
ECS 구성 요소
- ECS 각 요소간의 관계
- Amozon ECR
- Amazon에서 제공하는 컨테이너 이미지 저장소
- ECR 레포지토리에서 이미지 URI를 이용해 빌드한 이미지를 푸쉬하고 가져올 수 있다.
- Task Definition
- 애플리케이션을 구성하는 컨테이너를 설명하는 텍스트(JSON)
- 시작 유형 호환성 선택(Fargate | EC2 | External)
- 사용할 컨테이너 이미지 설정
- 애플리케이션을 위해 개방할 포트 설정
- CPU/메모리 리소스 할당 설정
- 작업의 컨테이너에 사용할 데이터 볼륨 설정
- 위와 같이 JSON 형식으로 작업 정의를 설정할 수 있음
- Task
- 작업 정의에서 정의된 설정으로 인스턴스화하는 것.
- Task는 Cluster에 속한 컨테이너 인스턴스(EC2 인스턴스)나 Fargate에 배포하게 됨.
- 해당 task를 배치할 때, 어디에 어떻게 배치할지 전략과 제약을 선택할 수 있음.
- Service
- 클러스터에서 지정된 수의 작업을 동시에 실행하고 관리할 수 있게 해주는 구성
- 서비스는 Task를 포함하며, Task와 관련된 Auto Scaling과 Load Balancing을 관리.
- 시작 유형 선택(Fargate | EC2 | External)
- 작업 정의 선택
- 클러스터 선택
- 서비스 이름 설정
- 작업 개수 설정
- 배포 유형 설정(롤링 | 블루/그린 배포)
- 네트워크 구성(VPC, 서브넷, 보안그룹)
- Load Balancing 설정
- Auto Scaling 설정
- Cluster
- 작업 또는 서비스의 논리적 그룹
- 클러스터를 실행하여 작업을 실행할 수 있음.
- 클러스터 템플릿 선택(Fargate | EC2 | External)
** 계속 나오는 Fargate / EC2 / External 무엇인가?
컨테이너를 운영하는 호스트 형태에 따라 EC2, Fargate, External 로 나눠짐.
- EC2(기본 유형)
- 컨테이너가 운영되는 컴퓨터가 AWS EC2인 타입
- 지속적으로 높은 CPU 코어 및 메모리 사용량이 필요한 워크로드
- 가격에 최적화되어야 하는 대규모 워크로드
- 애플리케이션이 영구 스토리지에 액세스해야 함
- 인프라를 직접 관리해야 함
- Fargate
- 서버리스 유형으로, EC2를 배포하거나 관리할 필요 없이 그냥 서비스만 운영하면 되는 유형
- 즉, 컨테이너가 어디서 운영되는지 고민/관리할 필요 없는 타입
- 낮은 오버헤드를 위해 최적화해야 하는 대규모 워크로드
- 가끔 버스트가 발생하는 소규모 워크로드
- 작은 워크로드
- 배치 워크로드
- External (ECS AnyWhere)
- AWS인프라가 아닌 곳에 위치한 호스트에서도 ECS에서 정의한 서비스, 작업을 실핼 할 수 있도록 함
- 호스트&컨테이너 등 실제 서비스는 물리적으로 AWS밖에서 동작, 관리는 AWS콘솔에서 할 수 있는 타입
ECS 재배포 과정(type: instance)
- deploy를 통해 new ECS task가 시작
- 해당 task는 provisioning → pending → running 과정을 통해 시작
- 해당 task가 배포된 인스턴스를 target group에 등록
- 새로운 target은 target group에서 register 이후 initial → healthy의 health check 과정을 거침
- 기존의 target은 target group에서 draining의 status 이후 deregister 됨.
- 이후 기존 ECS task는 stop되어 제거
SIGTERM
- 해당 시그널이 ECS task에 전달. 이를 통해 해당 task는 shut down됨
전체 로직
출처
https://tech.cloud.nongshim.co.kr/2021/08/30/소개-amazon-ecs란/
https://pearlluck.tistory.com/114
https://bluese05.tistory.com/51
https://potato-yong.tistory.com/131
https://1mini2.tistory.com/123
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/Welcome.html
https://dev.classmethod.jp/articles/contaier-doceker-and-ecs-for-beginner-kr/
https://tomgregory.com/aws-ecs-deployments-step-by-step/