앱 배포를 위한 소프트웨어 개발 플랫폼입니다.
컨테이너에서 앱이 패키징 되며 표준화가 되어있어 운영체제에 상관없이 동작 시킬 수 있습니다.
마이크로서비스 아키텍처 에서 대표적으로 사용하고 있습니다.
도커에 대한 이미지는 대표적으로 Docker Hub
에서 관리를 하고 있으며 이외에도 Amazon ECR
에도 존재 합니다.
Amazon에서는 이러한 docker를 ECS[Elastic Container Service]
에서 관리를 하며,
Kubernetes는 EKS[Elastic Kubernetes Service]
에서 관리를 하고 있습니다.
AWS에서 컨테이너를 실행하면 ECS클러스트에 이른바 ECS 태스크를 실행합니다
EC2클러스터에서는 이제 EC2인스턴스를 만들게 됩니다.
이렇게 동작을 하게 된다며 인프라를 직접 유지하고 관리를 해야합니다.
이후 만들어진 EC2인스턴스는 ECS에이전트를 실행해야 하며, ECS에이전트는 각각의 EC2인스턴스에 Docker를 실행하게 됩니다.
이러한 과정을 하기 위해서는 컨테이너가 리부팅 되는 시간이 필요합니다.
마찬가지고 AWS에 도커 컨테이너를 실행하는데 이떄는 EC2를 생성하지 않습니다.
즉 이 유형은 단순히 ECS태스크만을 정의하면 알아서 EC2가 생성이 되는 유형입니다.
EC2시작 유형보다 굉장히 동작하기 굉장히 쉬운 유형입니다.
ECS또한 Auto Scaling이 가능합니다.
3가지 사항에 대해서 가능합니다.
1. ECS서비스의 CPU 사용률을 확장
2. 메모리 사용률 = RAM을 확장
3. 타겟당 요청 수를 확장
이는 EC2인스턴스의 클러스터 확장과는 다릅니다.
확장하는 방법에 대해서는 두가지가 가능합니다.
1. ASG그룹을 확장
- CPU 사용률이 급등할 떄 EC2인스턴스를 추가하여 사용합니다.
2. ECS 클러스터 용량 공급자를 사용
- 새 태스크를 실행할 용량이 부족하면 자동으로 ASG를 확장합니다.
- 가장 추천하는 방법입니다.
ECS서비스를 업데이트 하는 방법입니다.
최대 용량, 최소 용량을 정해놓고 하는 업데이트 입니다.
ECS를 업데이트 할 떄에는 EC2인스턴스가 꺼지게 됩니다.
이떄 모든 EC2인스턴스가 꺼지는 것으 비효율적이기 떄문에 단계별로 나눠서 꺼지며 업데이트 하는것을 롤링업데이트 라고 합니다.
A,B,C,D가 있습니다.
이떄 최소 퍼센트가 50, 최대 퍼센트가 100이라면 다음과 같이 작동합니다.
C,D가 꺼집니다.
그러면 A,B만 동작을 하고 있고 이상황에서 업데이트가 된 C', D'가 실행이 됩니다.
이후 A,B가 꺼지고 C',D'만 동작하고 있는 상황에서 A',B'업데이트 되어서 실행이 됩니다.
ECS에 새로운 docker를 실행하면 docker가 EC2에 할당이 되어서 동작이 되는 것으로 이해하였습니다.
그럼 이떄 여러개의 EC2인스턴스가 있다면 새로 생성되는 docker이미지는 어떠한 EC2인스턴스에서 구동을 시키는 것인지에 대한 내용입니다.
이러한 배치 전략에는 3가지가 있습니다.
1. BinPack
- 가장 많이 채워져 있는, 즉 계속해서 사용중인 EC2인스턴스에 할당이 됩니다.
- 이를 통해서 새로 생성되는 EC2인스턴스를 최대한 줄이게 됩니다.
- 이후 더이상 채울 수 없다면 새로운 EC2를 만들어 할당합니다.
2. Random
- 말 그대로 랜덤하게 배치하는 것 입니다.
3. Spread
- 정의내린대로 분산이 되는 형태입니다.
- 만약 3개의 AZ(a,b,c)가 있고 Spread정책이 ecs:avaliablity-zone라면 다음과 같이 분산됩니다.
- a,b,c순차적으로 1개씩 할당하고 그후 다시 a,b,c순서대로 할당이 됩니다.
이러한 분산 정책은 서로 섞어서 사용이 가능합니다.
또한 테스크가 배치되는 방식에 대한을 둘 수도 있습니다.
1. distinctInstance
- 태스크들이 각각 다른 컨테이너 인스턴스에 배치가 되게끔 하는 방법입니다.
- 즉 동일 인스턴스 상에 두 개의 태크스를 배치할 수 없습니다.
2. memberOf
- 상당히 심화된 언어로 작성이 되며 예를들면 EC2인스턴스의 유형이 t2이어야 한다. 정도로 작동합니다.
아직 실습을 진행하지 않았습니다. 왜냐하면 실제로 docker를 활용하는 시스템을 아직 활용해본적이 없기 떄문입니다. 그러기 떄문에 후에 docker를 프로젝트에 활용하게 된다면 그떄 다시 한번 다루어 보겠습니다.