모든 내용은 Cousera의 'AWS Cloud Technical Essentials' 강좌 내용을 기반으로 정리하였습니다.
AWS는 특정 작업에 적합한 도구를 선택할 수 있도록 가상 머신(VM), 컨테이너(Container) 및 서버리스(Serverless) 세 가지 Compute Offering을 제공합니다. 그렇다면 상황에 적합한 클라우드 아키텍처를 구축하기 위해서는 세가지 Compute offering에 대해서 명확히 이해해야 합니다.
컨테이너는 하나의 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 이동할 때 소프트웨어를 안정적으로 실행하는 문제를 해결하는 방안으로서 사용됩니다. 컨테이너는 코드와 모든 종속성을 패키징하는 표준화된 단위를 의미합니다. 패키지는 컨테이너가 자체 독립 환경을 생성하여 모든 플랫폼에서 안정적으로 실행되도록 설계되어 있습니다. 그러므로 개발에서 프로덕션이나 on-premise에서 cloud로 작업을 한곳에서 다른 곳으로 쉽게 이동할 수 있습니다. 컨테이너는 웹 어플리케이션, 리프트 앤드 시프트 마이그레이션, 분산 애플리케이션, 개발, 테스트 및 프로덕션 환경의 간소화를 비롯한 다양한 작업을 호스팅할 수 있습니다.
컨테이너라는 말은 Docker란 쉽게 연관지을 수 있습니다.
Docker는 네트워킹 및 스토리지를 포함하여 컨테이너 격리에 필요한 전체 운영 체제 스택의 관리를 단순화하는 컨테이너 런타임을 의미합니다. Docker를 사용하면 컨테이너를 쉽게 생성, 패키징, 배포 및 실행할 수 있습니다.
컨테이너는 호스트와 동일한 운영체제 및 커널을 공유하는 반면 가상 머신에는 운영체제가 포합됩니다. 각 가상머신은 운영체제의 카피본을 유지해야 하기 때문에 공간이 낭비됩니다. 컨테이너는 가볍기 때문에 빠르고 즉각적으로 워크로드를 처리할 수 있으므로 입출력 burst동안 빠르게 확장해야하는 애플리케이션을 설계할 때 유용하게 사용됩니다. 그에 반해 가상머신은 느리지만 더 많은 리소스를 제공합니다. 가상머신은 일반 운영체제 처럼 패키지 설치, 전용 커널과 같은 리소스를 제공할 수 있습니다.
AWS에서 컨테이너는 EC2 인스턴스에서 실행합니다. 하나의 인스턴스를 실행하는 것은 관리하기 쉽지만 높은 가용성과 확장성이 부족한데, 이 때 컨테이너를 사용하여 이러한 문제를 해결합니다.
대규모로 컴퓨팅을 관리하는 경우에는 다음과 같은 사항을 고려해야 합니다.
AWS는 Elastic Container Service(ECS)와 Elastic Container Kubernetes Service(EKS)와 같은 두 가지 컨테이너 오케스트레이션 서비스를 제공하여 위와 같은 사항들을 처리합니다.
Amazon ECS는 새로운 컨테이너를 신속하게 가동하고 EC2 인스턴스 클러스터에서 관리할 수 있는 End-to-End container orchestration Service 입니다.
컨테이너를 실행하고 관리하기 위해서는 EC2 인스턴스에 ECS 컨테이너 에이전트를 설치해야 합니다. 이 에이전트는 클러스터 관리 세부 정보에 대해 ECS 서비스와 통신하는 역할을 합니다. 이 에이전트는 Linux 및 Windows AMI 모두에서 실행할 수 있으며, 컨테이너 에이전트가 설치된 인스턴스를 컨테이너 인스턴스 라고 합니다.
Amazon ECS container instance가 가동되어 실행되면 컨테이너 시작 및 중지, 클러스터 상태 가져오기, Scale in & Scale Out, 클러스터 전체 컨테이너 배치 스케줄링, 사용 권한 할당 및 가용성 요구 사항 충족 등의 작업을 수행할 수 있습니다.
Amazon ECS에서 실행되도록 애플리케이션을 준비하려먼 Task Definition을 만들어야 합니다. Task Definition은 하나이상의 컨테이너를 설명하는 텍스트 파일로서, CPU, 메모리, 포트, 이미지, 스토리지 및 네트워킹 정보와 같이 컨테이너를 실행하는 데 필요한 리소스를 설명하는 청사진입니다.
예시)
{
"family": "webserver",
"containerDefinitions": [ {
"name": "web",
"image": "nginx",
"memory": "100",
"cpu": "99"
} ],
"requiresCompatibilities": [ "FARGATE" ],
"networkMode": "awsvpc",
"memory": "512",
"cpu": "256"
}
Kubernetes는 컨테이너화된 워크로드 및 서비스를 관리하기 위한 portable하고 extensible한 오픈소스 플랫폼입니다. Kubernetes는 소프트 개발과 운영을 통합하는 아키텍처를 구축할 수 있습니다. Kubernetes에서 실행중인 컨테이너가 있으며, 인프라에 대한 단순성, 고가용성 및 세분화된 제어를 제공하는 등 고급 오케스트레이션 솔루션이 필요한 경우 EKS가 적합한 도구 입니다.
Amazon EKS는 개념적으로 ECS와 유사하지만 몇 가지 차이점이 있습니다.
서버리스(serverless) : 개발자가 서버를 관리할 필요 없이 애플리케이션을 빌드하고 실행할 수 있도록 하는 클라우드 네이티브 개발 모델
리프트 앤드 시프트(Lift and Shift) : OS, 데이터, 애플리케이션을 통째로 복사하여 배포활 환경에 옮기는 것을 의미한다.
클라우드 호스팅(Cloud Hosting) : 서버 호스팅을 가상화 한 것으로, 사용자가 필요할 때 마다 서버 리소스를 조정하여 이용하는 것을 의미한다.
패키지 종속성(Package Dependency) : 하나의 구성 요소가 유효하기 위해 필요한 다른 구성 요소, 권한 또는 기본 설정을 참조하는 것을 의미