# Container

## 기본 개념

> 도커와 쿠버네티스를 AWS에서 서비스하는 것이므로 기초 개념이 없으면 이해하기 힘들다.

### 도커

[초보를 위한 도커 안내서 - 도커란 무엇인가?](https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html)

도커 이미지는 Docker Hub에 저장해 왔었다. 그러다가 AWS에서 **ECR**(Elastic Container Registry)를 공개하면서 이곳에도 저장이 가능해졌다.

### 쿠버네티스

[https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/](https://kubernetes.io/ko/docs/concepts/overview/what-is-kubernetes/)

---

- ECS: 아마존 자체 컨테이너 플랫폼

- Fargate: 아마존 자체 **서버리스** 컨테이너 플랫폼

- EKS: 아마존 자체 관리형 쿠버네티스

# 1. ECS

ECS(Elastic container Service)는 AWS에서 도커 컨테이너를 시작하도록 도와주는 서비스이다. EC2 인스턴스 같은 인프라는 프로비전하고 관리해 주어야 하고, ALB에 통합될 수 있다.

우리는 먼저 EC2를 생성하고 그 안에 ECS Agent를 설치한다. 혹은 설치되어 있는 AMI를 가져와도 된다.

그러면 ECS에서 자동으로 ECS Tasks(컨테이너)를 할당해 준다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134104_FBe1NruvJ2M8UQopkx?q=80&s=1280x180&t=outside&f=webp)

### Fargate

ECS와 비슷하지만 서버리스라서 EC2 인스턴스를 관리할 필요가 없다. ECS나 EKS 위에서 돌아간다. 우리가 필요한 CPU / RAM 위에서 컨테이너를 돌린다. 

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134105_Wiwpb2iXyzNozJmD3O?q=80&s=1280x180&t=outside&f=webp)

## 권한 할당

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134107_lA4rNFkjlJRmWnml2m?q=80&s=1280x180&t=outside&f=webp)

### EC2 Instance Profile

- EC2 자체의 정책이다.

- ECS Agent에서 ECS 서비스 API를 호출할 수 있게 한다.

- CloudWatch에 로그를 쓸 수 있게 한다.

- ECR 서비스에서 도커 이미지를 가져온다.

- 민감한 데이터를 참조한다.

### ECS Task Role

- 인스턴스 내의 각 Task에게 다른 AWS 서비에 접근할 수 있도록 권한을 준다.

- 각 Task별로 할당되며 **태스크 정의**에서 정의된다.

---

### ECS Data Volumes + EFS File Systems

- Task끼리 같은 데이터를 참조하고 쓰려면 어떻게 해야 할까?

- EFS는 원래 AZ 상관없이 여러 인스턴스에 마운트되어 사용될 수 있으므로 이것을 쓰는 게 가장 좋아 보인다.

- 또 Fargate는 서버리스라서 데이터를 저장하기가 마땅찮은데, EFS에 저장해 놓고 쓰면 편하다!

### ECS Tasks + Application Load Balancer

- EC2를 묶어 ALB에 등록하는 것처럼, Tasks들을 묶어 ALB에 등록할 수도 있다.

- 같은 인스턴스의 Task와 다른 인스턴스의 Task도 자유롭게 묶을 수 있다.

- Task들은 생성될 때 랜덤하게 포트를 할당 받는데, ALB는 해당 포트를 어떻게 알아서 잘 찾아서 연결한다. (**Dynamic Port Mapping**)

- 단 EC2 보안 정책에서 막아버리면 답이 없기 때문에, 꼭 ALB에서 오는 모든 Inbound 트래픽을 허용해주자.

### ECS Fargate Tasks + Application Load Balancer

- Fargate에서는 각각의 Task는 각각의 ENI와 연결되고, 따라서 모두 각자의 IP를 가지게 된다.

- 이때는 포트를 우리가 정할 수 있기 때문에 보안 그룹에서 모두 허용할 필요가 없다.

### Event Bridge로  Task 실행하기

Event Bridge는 AWS 서비스에 특정 이벤트가 발생했을 때 어떤 행동을 취할 지 매개해 주는 서비스이다.

이 예시는 S3에 객체가 업로드되었을 때, Task는 자동으로 S3 버킷의 객체를 가져와 Dynamo DB에 저장한다.

이 작업을 위해서는 사전에 ECS Task Role을 설정해 "S3에서 객체를 읽는 것"과 "Dynamo DB에 쓰는 것"에 대한 권한을 받아와야 한다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134107_GGnMMAdAEPzHSzLamh?q=80&s=1280x180&t=outside&f=webp)

## ECS 스케일링

ECS 확장에는 2가지가 있다.

- Task의 수를 늘린다.

- Task를 담고 있는 리소스를 늘린다.

기본적으로는 Task의 수를 늘려 확장한다. ASG와 비슷하게 AWS에서는 Application Auto Scale을 지원한다. 하지만 Task만 늘리면 EC2 리소스가 가득 찰 수도 있기 때문에, 어느 정도 가득 차면 `ECS Capacity Provider`(EC2 등)를 확장한다.

## ECS Rolling Updates

도커 이미지를 수정해서 다시 배포하려고 한다. 어떻게 해야 제일 좋을까? 간단하다. 점진적으로 바꾸면 된다.

ECS를 보면 두 가지 변수를 정의한다; **_Minimum Healthy percent,_**_ _**_Maximum percent. _**

그러면 ECS는 두 조건을 만족하면서 차츰 업데이트를 한다.

# 2. ECR

도커 이미지를 저장, 관리하는 AWS 자체 서비스이다.

ECS와 완전히 연동되고, IAM으로 권한을 관리하며, S3에 백업을 한다.

또한, 취약점 탐색, 태그, 이미지 수명수기 관리 기능을 지원한다.

# 3. EKS

EC2와 Fargate를 기본 리소스로, 컨테이너를 쿠버네티스로 관리하고 제어할 수 있게 도와주는 서비스이다.

쿠버네티스는 **Cloud-Agnostic**(클라우드에 종속되지 않음)하기 때문에 어떤 클라우드 서비스와도 연동이 가능하다.

![Image](https://upload.cafenono.com/image/slashpageHome/20240820/134109_xjWMDzgIiW3YQjGzGY?q=80&s=1280x180&t=outside&f=webp)

For the site tree, see the [root Markdown](https://slashpage.com/kaonmir.md).
