[AWS] Elastic Container Service(feat. Docker)

AWS ECS

Container ?

PainPoint

단일 서버에서 여러 서비스를 실행하는 경우 Library나 Dependency에 대해서 관리하기가 어려웠다. 또 복수의 애플리케이션을 하나의 서버에서 실행시키기에도 어려움이 있다.

컨테이너란 ?

컨테이너는 애플리케이션의 코드, 설정, 의존성을 단일 개체로 패키징하는 방법을 제공한다.

컨테이너는 서버에 설치된 운영체제를 공유하며, 리소스가 격리된 프로세스로 실행하여 환경에 관계없이 빠르게 신뢰할 수 있으며 일관된 배포를 보장한다.

데스크탑이나 노트북이나, 운영환경까지도 컨테이너를 이용하면 동일한 환경을 제공한다.

Docker를 사용하면 필요한 모든 걸 패키징해서 Container로 실행하면 된다.

VM 관리하는 것은 어렵다. 특별히 다양한 버전의 패키지와 복수의 애플리케이션을 한대의 서버에서 실행하는 것은 어렵다. 컨테이너에서는 하나의 애플리케이션이 동작하는 데 필요한 Dependency를 충족한다. 이는 다른 애플리케이션의 Dependency를 고려할 필요 없이 Compact하게 가져갈 수 있다.

컨테이너는 개발자들의 작업속도를 향상시킨다. 도커 환경을 사용하면 도커파일에 필요한 모든 것을 저장하고, Artifact를 실행하면 도커가 실행되는 모든 환경에서 동일하게 동작한다.

자동화된 인프라 관리를 위해서 컨테이너를 사용한다. 컨테이너를 사용하는 것의 장점은

컨테이너의 장점

  1. 속도
  2. 워크로드 격리
  3. 로컬환경에서 프로덕션 환경까지 단일 아티팩트를 사용한 테스트, Drift를 피할 수 있다.

Docker ?

도커는 애플리케이션을 빠르게 빌드, 테스트, 배포 할 수 있도록 도와주는 소프트웨어 플랫폼이다. 도커는 소프트웨어들을 ‘컨테이너’ 단위로 애플리케이션이 실행하기 위해 필요한 모든 라이브러리, 시스템 도구, 코드, 런타임을 패키지화 한다. 리눅스, 윈도우, 맥 등 OS에 상관없이 컨테이너들을 실행시킬 수 있다.

Dockerfile

도커파일은 명령어의 연속이다. 패키지를 설치해야하는가 Runtime에 이 컨테이너가 무엇을 해야하는가

도커 이미지는 기본적으로 set of instructions 이다 컨테이너 이미지는 크기가 작은 OS와 비슷하다. 도커파일은 Simple 하다 동사 뒤에 명령어가 위치하는 구조를 가지고 있다.

VM을 설정하는것과 도커 컨테이너를 설정하는 걸 비교하면 도커는 정말 간단하다.

ECS?

Elastic Container Service Container Orchestration service

컨테이너 관리 소프트웨어를 대체한다. ECS를 사용하지 않으면 orchestration을 관리하는 leader node가 필요하다. ECS 는 완전관리형 서비스이며, Fargate를 사용하면 컨테이너를 사용하기만 하면 된다. Orchestration 은 healthcheck, 등등의 관리로직이 적용되며 ECS는 이를 자동으로 해준다.

또한 오토스케일링과 통합되어 동작한다. CloudWatch, AutoScailing, Loadbalancing, IAM 등등 IAM을 이용한 세분화된 관리가 가능하다. Granular 세부적인

EC2 backed Container와 Fargate backed Container가 동작하도록 설정할 수 있다.

Cluster

클러스터는 tasks 나 service 의 논리적인 집합이다. EC2를 사용하는 task나 Service를 실행중이라면, 클러스터 또한 컨테이너 인스턴스를 묶고 있다. Capacity Provider를 사용하는 경우, 클러스터는 Capacity Provider 의 논리적인 집합이다. 클러스터는 Fargate 나 EC2 실행 타입의 집합으로 구성될 수 있다.

Task Definition

ECS에서 애플리케이션을 실행하려면 Task Definition을 생성해야 한다. task definition 은 JSON 형식으로 된 텍스트 파일로, 애플리케이션을 구성하는 1개 ~ 최대 10개 까지의 컨테이너에 대한 정보를 가지고 있다. Task Definition 에서 애플리케이션에 대한 매개 변수를 지정해한다. 컨테이너에 대한 정의, 네트워크 포트 등에 대한 변수를 지정할 수 있다.

Tasks and Scheduling

task 작업이란 클러스터 내에서 task definition이 인스턴스화 된 것이다. ECS안에서 Task Definition을 만든 후에 클러스터에서 실행되는 Task의 수를 지정할 수 있다.

Fargate를 이용하면 각각의 task는 분리된 경계를 가지고 있으며 밑에 깔린 커널, CPU 자원, 메모리 자원 또는 ENI를 다른 task와 공유하지 않는다.

Task Scheduler는 task들을 클러스터 안에 위치시키는 역할을 한다. 몇가지 스케쥴링 옵션이 가능하다.

Services

ECS에서는 클러스터 내에서 지정된 수의 Task Definition 인스턴스들을 동시에 실행하고 유지할 수 있다. 이를 서비스라고 하며, 어떤 task가 멈추거나 장애가 발생하면 ECS 서비스 스케쥴러가 스케쥴 전략에 따라 다른 task definition 인스턴스를 생성해서 교체한다. 스케쥴러 전략으로는 2가지가 있다.

  1. Replica 기본적으로 서비스 스케쥴러가 task들을 가용영역에 task를 분산한다. 작업 배치 전략 및 제약 조건을 사용하여 Task 배치를 사용자 지정할 수 있다.
  2. Daemon 클러스터내에 사용자가 지정한 task 배치 전략 제약 조건을 충적하는 동시에 정확하게 1개의 Active 컨테이너 인스턴스를 배포한다. 서비스 스케쥴러가 동작중인 task들의 배치 제약 조건을 검사하고 조건에 부합하지 않는 task들을 중지시킨다. Daemon전략을 사용하면 원하는 tasks 의 수를 지정하거나 task 배치 전략, 오토 스케일링 정책을 설정할 필요가 없다.

AWS Fargate

AWS 파게이트 서버나 클러스터를 관리 하지 않고도 컨테이너를 실행할 수 있는 서비스이다. Fargate를 사용하면 컨테이너를 실행 시키기 위해서 VM을 구성하거나 확장할 필요가 없다. Fargate를 사용하면 서버 종류를 고르거나, 언제 클러스터를 확장/축소 할지, 클러스터 패킹을 최적화 해 줄 필요가 없다. 즉 애플리케이션에 집중할 수 있도록 인프라 관리 부담을 줄여주는 서비스이다.

Service Discovery

AWS Cloud Map에서는 애플리케이션 리소스에 대한 사용자 지정 이름을 정의할 수 있으며, 동적으로 변하는 리소스의 위치를 유지할 수 있다. 기존에 CloudMap이 없는 경우에 정적으로 애플리케이션에서 엔드포인트가 코드되었다면, Cloud Map에서는 동적으로 엔드포인트가 유지가 되므로(최신 리소스의 위치를 검색) 가용성이 증가한다.