컨테이너
Docker
- 앱 배포를 위한 소프트웨어 개발 플랫폼
- 컨테이너에 앱이 패키징되는데 컨테이너는 표준화되어있어 어느 OS에서나 같은 방식으로 실행 가능
- 기기와 상관없이 실행 가능
- 호환성 문제 없음
- 행위 특성 예측 가능
- 유지 배포 쉽다
- 모든 언어 운영체제 기술과 호환
- 마이크로서비스 아키텍쳐, 온프레미스 환경에서 클라우드로 앱을 리프트앤시프트
Docker on an OS
- 서버(EC2 인스턴스 입장에서는 모두 도커 컨테이너로 보인다)
도커 이미지가 저장되는 곳
- 도커 리포지토리에 저장되며 여러가지가 있다
- Docker Hub
- 퍼블릭 리포지토리
- 기본 이미지를 찾을 수 있다
- Amazon ECR(Amazon Elastic Container Registry)
- 비공개/공개 리포지토리 둘다 있다
Docker vs Virtual Machines
- 완전한 가상화 기술은 아니다
- 리소스가 호스트와 공유되어 한 서버에서 다수의 컨테이너를 공유 가능
- 가상머신 아키텍쳐는 Hypervisor를 통해 게스트 OS를 설치해서 앱을 올림
- EC2가 이러한 가상 머신의 개념을 사용한다
- 가상 머신의 EC2 인스턴스는 하나의 호스트에서 각자 분리됨
- 리소스를 공유하지 않는다
- VMWare를 통해 설치해보며 과정을 이해했다
- EC2가 이러한 가상 머신의 개념을 사용한다
- 도커는 호스트를 EC2같은 가상 머신에서도 사용 가능
- 가볍게 실행되는 컨테이너라 공존 가능
- 네트워킹이나 데이터도 공유가 가능
- 덜 안전하지만 하나의 서버에 더 많은 컨테이너를 실행 가능
도커를 실행하는 방법
AWS에서 Docker 컨테이너를 관리하는 방법
Amazon Elastic Container Service (Amazon ECS)
- 도커 컨테이너 관리를 위한 전용 플랫폼
Amazon Elastic Kubernetes Service (Amazon EKS)
- 쿠버네티스의 관리형 버전으로 오픈소스
AWS Fargate
- 아마존 서버리스 컨테이너 플랫폼 ECS, EKS와 같이 동작 가능
Amazon ECR
- 컨테이너 이미지를 저장하는데 사용
Amazon ECS(Elastic Container Service)
ECS 클러스터에 ECS 태스크를 실행하는 것
EC2 런치타으로 ECS 클러스터를 실행하는 경우 프로비저닝과 인프라(EC2 인스턴스들)를 직접 관리해야한다
EC2 Launch Type
- EC2 인스턴스는 특별하게 각각 ECS 에이전트를 실행해야 한다
- 실행되면 ECS 에이전트가 각각의 인스턴스를 지정된 ECS 클러스터에 등록한다
- 이후 ECS 태스크를 수행하기 시작하면 AWS가 컨테이너를 시작하거나 멈춘다
- 새 컨테이너가 생기면 시간에 따라 EC2에 지정되고 자동적으로 실행됨
Fargate Launch Type
- AWS에 도커 컨테이너를 실행하는데 인프라를 프로비저닝하지않아 관리할 EC2가 없다 → 서버리스의 기능
- ECS 클러스터에 ECS 태스크를 정의하는 태스크 정의만 생성하면 ECS 태스크를 AWS가 알아서 실행한다
- 작업을 위해 백엔드에 EC2 인스턴스가 생성될 필요도 없다
- 확장을 위해선 단순히 태스크만 수정해주면 된다
- EC2 런치타입보다 훨신 간단하다
IAM Roles for ECS (두가지 차이점을 알아둬야 함)
IAM Task Role은 AWS 서비스의 API를 사용할 수 있도록 함
EC2 Instance Profile(EC2 런치타입 해당)
- ECS 에이전트만이 EC2 인스턴스 profile을 사용
- EC2 인스턴스 프로파일을 이용해 ECS로 API 호출
- CloudWatch Logs API를 통해 컨테이너 로그를 보냄
- ECR에서 도커 이미지를 가져옴
- Secrets Manager or SSM Parameter Store에서 민감 데이터를 참고
ECS Task Role (EC2 and Fargate Launch Type 모두 해당)
- 각각의 태스크에 서로 다른 특정 역할을 만들 수 있다
- 다른 역할을 만드는 이유는 각자 다른 ECS 서비스에 연결될 수 있도록 하기 위함
- ECS의 태스크 정의에서 태스크의 역할을 정의
로드밸런서와 통합
EC2와 Fargate 유형 마찬가지로 구성된다
여러 ECS 태스크들이 ECS 클러스터에 포함
- ALB는 대부분의 유스케이스에서 사용되는 좋은 옵션이다
- NLB은 처리량이 매우 많거나 높은 성능이 요구될 때만 권장된다
- AWS Private Link와 연동시 권장
- ELB는 추천되지 않는다 Fargate와 연결 불가
데이터 지속성(EFS)
컨테이너가 유지되기 위해선 Data Volume이 필요하다
- EFS는 런치타입과 관계없이 EC2 and Fargate 둘다 호환됨
- EC2 태스크에 파일 시스템을 직접 마운트 가능
- Fargate + EFS = Serverless
- EFS + ECS를 사용하여 다중 AZ를 통해 공유되는 컨테이너의 영구 스토리지로 사용 가능
- S3는 EFS로 마운트 될 수 없다
실습
ECS 클러스터 타입을 Fargate와 EC2 런치타입을 동시에 생성할 수 있다.
이후 태스크를 정의할 때 EC2 인스턴스와 Fargate 형식을 통해 정의 가능
실습은 컨테이너를 실행시킬 때 Fargate 방식을 통해 간단하게 실행시킴
ECS Auto Scaling
- 태스크 수를 자동으로 늘리거나 줄일 수 있다
- ECS Auto Scaling은 AWS Application Auto Scaling을 사용함
- CPU 사용률 - 메모리 사용률 - ALB 관련 지표인 타겟당 요청 수
- Target Tracking(대상 추적) → CloudWatch 지표의 특정 타겟에 따라 스케일링
- Step Scaling → CloudWatch 알람에 따라 단계적 수행
- Scheduled Scaling → 스케쥴된 스케일링
ECS Auto Scaling(태스크 레벨) ≠ EC2 Auto Scaling(인스턴스 레벨)
오토 스케일링이 필요없거나 백엔드에 EC2 인스턴스가 없다면 Fargate가 유용 * 서버리스
EC2 Launch Type – Auto Scaling EC2 Instances
- EC2 인스턴스를 스케일링하는 것이다
- 오토 스케일링 그룹
- CPU 사용률 등에 따라 EC2 인스턴스 추가
- ECS Cluster Capacity Provider(ECS 클러스터 용량 공급자) ← 추천됨
- 새 태스크를 실행할 용량이 부족하면 자동으로 ASG 확장
- Capacity Provider는 오토 스케일링 그룹과 함께 사용
- RAM CPU가 부족할 때 EC2 인스턴스 추가
ECS tasks invoked by Event Bridge
이벤트 브릿지로 작동하는 ECS 태스크
ECS tasks invoked by Event Bridge Schedule
Amazon ECR(Elastic Container Registry)
- AWS에 도커 이미지를 저장하고 관리하는데 사용
- 계정에 한해 이미지를 비공개로 저장 여러 계정 설정 가능
- Amazon ECR Public Gallery에 공개 설정 가능
- ECS와 완전히 통합되며 백그라운드에서 S3에 저장된다
- 이미지를 가져오기 위해서 EC2 인스턴스에 IAM Role 할당하면 된다
- ECR에 대한 모든 접근은 IAM이 보호하고 있다
- 단순히 이미지를 저장하는 역할을 넘어 많은 역할을 지원한다
- 이미지의 취약점 스캐닝, 버저닝 태그 및 수명 주기 확인
Amazon EKS(Elastic Kubernetes Service)
- AWS에 관리형 쿠버네티스 클러스터를 실행할 수 있는 서비스
- 오픈 소스 시스템으로 Docker로 컨테이너화한 애플리케이션의 자동 배포, 확장, 관리를 지원
- ECS와 비슷하지만 사용하느 API가 매우 다르다
- 오픈소스이며 여러 클라우드 제공자가 사용하므로 표준화가 가능
- EC2 시작 모드
- EC2 인스턴스에서 처럼 작업자 노드를 배포할 때 사용
- Fargate 모드
- EKS 클러스터에 서버리스 컨테이너를 배포할 때 사용
- EKS UseCase
- 온프레미스나 클라우드에서 쿠버네티스나 쿠버네티스 API를 사용 중일때 쿠버네티스 클러스터를 관리하기 위해 EKS를 사용
- 모든 클라우드 서비스에서 사용 가능하며 클라우드 또는 컨테이너간 마이크레이션을 실행하려는 경우 EKS가 솔루션이 될 수 있다
- 각 노드가 만들어지고 노드는 EKS Pods를 실행한다 - Pods를 발견하면 쿠버네티스 관련
- EKS 노드는 오토스케일링 크룹으로 관리 가능
- 프라이빗 로드 밸런서 혹은 퍼블릭 로드 밸런서를 설정해 웹에 연결해야 한다
Amazon EKS – Node Type
Managed Node Groups(관리형 노드 그룹)
- AWS로 노드, EC2를 생성하고 관리
- 노드는 EKS 서비스로 관리되는 ASG의 일부
- 온디맨드 인스턴스와 스팟 인스턴스를 지원
Self-Managed Nodes
- 커스텀한 생성 가능 EKS 클러스터를 등록하고 ASG로 관리해야함
- Amazon EKS 최적화 AMI를 사용할 수 있으며 시간 절약을 가능
- 온디맨드와 스팟 인스턴스 지원
AWS Fargate
- 유지관리와 노드 관리가 없다
데이터볼륨
- 볼륨을 사용하려면 EKS 클러스터에 스토리지 매니페스트를 지정해야함
- 컨테이너 스토리지 인터페이스(CSI)라는 규격 드라이버 활용
- EBS와 Fargate모드만 EFS를 지원
- FSx Lustre, NetAPP ONTAP 지원
실습
프리티어에 적용되지 않아 상당한 비용 청구 주의
AWS App Runner
- 완전 관리형 서비스로 규모에 따라 웹 애플리케이션, API 배포를 돕는다
- 누구나 AWS에 배포를 할 수 있다 → 인프라, 컨테이너, 소스 코드 개념을 몰라도 됨
- 소스코드나 Docker 컨테이너 이미지를 가지고 환경 설정만 하면 된다
- 자동으로 배포되어 컨테이너가 실행된다 이후 URL을 통해 엑세스 가능
- 오토스케일링과 가용성, 로드밸런싱, 암호화
- VPC 엑세스도 지원하며 db, 캐시, 메시지 큐 서비스도 연결 가능
- 웹, micro service, 빠른 배포가 필요한 서비스
실습
vercel처럼 배포가 가능하고 여기에 AWS 서비스까지 연결할 수 있다
'TIL > AWS' 카테고리의 다른 글
AWS 서버리스 솔루션 아키텍쳐 (0) | 2023.06.05 |
---|---|
AWS Serverless (1) | 2023.06.03 |
AWS 통합과 메시징: SQS, SNS, Kinesis, Active MQ (0) | 2023.06.01 |
AWS 스토리지 추가기능 (0) | 2023.05.30 |
AWS CloudFront (0) | 2023.05.30 |