[AWS] Container와 Docker :AWS ECR & EKS

Cherry·2024년 4월 6일
0

Container란?

컨테이너는 코드와 그에 필요한 모든 종속성을 패키징하여 응용 프로그램이 한 컴퓨팅 환경에서 빠르고 신뢰성 있게 다른 환경으로 실행되도록 하는 표준 소프트웨어 단위이다.

Docker란?

Docker는 애플리케이션을 개발, 출시, 실행하는 데 사용하는 개방형 플랫폼이다. 쉽게 말해 컨테이너 관리 기술이다.

  • Docker를 사용하면 인프라에서 애플리케이션을 분리하고 인프라를 관리형 애플리
    케이션처럼 취급
  • Docker는 코드를 더욱 빠르게 출시, 테스트, 배포하고 코드 작성과 실행 주기를 단축
    • Docker의 커널 컨테이너화 기능을 애플리케이션 관리 및 배포를 지원하는 워크플로우 및 도구와 결합

Docker Image

애플리케이션을 실행하는데 필요한 모든 것(라이브러리, 코드, 환경 변수 등등)을 포장한 템플릿으로, 이미지를 사용해서 실제로 실행되는 컨테이너를 만들 수 있다.

Docker Container

DockerImage를 바탕으로 실제로 실행되는 애플리케이션을 의미한다.

Amazon Elastic Container Registry(ECR)

ECR는 완전관리형 Docker 컨테이너 레지스트리이다. 아래 세가지 기능을 해준다. Docker hub와 비슷하지만 정책 관리, 이미지 사용이 가장 큰 차이점이다.

  • 이미지 저장
    도커 이미지, Open Container Initiative(OCI) 이미지 및 OCI 호환 아티팩트를 리포지토리에 저장 가능
  • 정책 관리
    리포지토리 정책을 사용하면 리포지토리 및 리포지토리 내 콘텐츠에 대한 액세스를 제어
  • 이미지 사용
    Amazon ECS 태스크 정의 및 Amazon EKS 포드 사양에서 이미지 사용 가능

Kubernetes(k8s)란?

쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확
장가능한 컨테이너 오케스트레이션 서비스이다. 즉, 컨테이너로 이루어진 워크로드를 자동화하거나 관리하기 위한 기술이라고 할수 있다.

  • 쿠버네티스를 사용하면 선언적 구성과 자동화를 모두 용이하게 관리 가능하다.
  • 서비스 디스커버리, 자동복구, 롤링 업데이트등의 기능을 제공하여 애플리케이션의
    운영을 효율적으로 관리할 수 있다.

쿠버네티스 특징

1. 다양한 배포 방식

  • Deployment, StatefulSets, DaemonSet, Job, CronJob 등 다양한 배포 방식을 지원
  • 여러대의 애플리케이션을 띄우고 싶을 경우에는 Deployment 이용
  • 로그나 모니터링 등 모든 서버에 설치가 필요한 경우엔 DaemonSet을 이용
  • 배치성 작업은 Job이나 CronJob을 이용

2. Namespace & Label

  • 네임스페이스(Namespace) 기능으로 하나의 클러스터를 논리적으로 구분하여 사용 가능
  • 라벨(label) 기능으로 유연하면서 확장성 있게 리소스를 관리

3. Role-based access control

  • 역할 기반 액세스 제어
  • 누가(주체), 무엇을(동사), 어디에(네임스페이스) 실행할 수 있는지 결정하는 권한 또는 템플릿 집합을 수반하는 Identity 및 액세스 관리 형식
  • 클러스터 전체에 적용하거나 특정 네임스페이스에 적용
  • AWS의 경우 IAM을 연동해서 사용 가능

4. Auto Scaling

  • Horizontal Pod Autoscaling(HPA) : CPU, MEM 사용량에 따라 Pod 수평 확장 기능
  • Vertical Pod Autoscaling(VPA) : Pod 리소스 할당량 조정 (CPU, memory..)
  • Cluster Autoscaling(CA) : 노드(서버) 개수 조정 가능 (클라우드에서만)

쿠버네티스 실행원리

쿠버네티스 아키텍쳐

  • 중앙(Master)에 API 서버와 상태 저장소를 두고 각 서버(Node) 의 에이전트(kubelet)과 통신하는 단순한 구조
  • 모든 명령은 마스터의 API 서버를 호출하고, 노드는 마스터와 통신하면서 필요한 작업 수행
  • Kubectl 이라는 Client 도구로 API 서버 접근 가능

Desired State

관리자가 바라는 환경 (구체적으로 웹서버 몇개 띄울건지, 몇번 포트로 띄울건지)
현재 상태(current state) 를 모니터링하면서 관리자가 설정한 원하는 상태(desired state)를 유지하는 방향으로 동작한다.

  • 관리자가 서버를 배포할 때 직접적인 동작을 명령하지 않고 원하는 상태를 선언하는 방식을 사용 (RUN x, Create o)
  • 쿠버네티스의 핵심은 상태이며 쿠버네티스를 사용하려면 어떤 상태가 있고 어떻게 상태를 선언하는지를 알아야 함

Kubernetes Object

Pod

  • 쿠버네티스에서 배포할 수 있는 가장 작은 단위
  • 한 개 이상의 컨테이너와 스토리지, 네트워크 속성 가짐
  • 컨테이너를 하나만 사용하는 경우도 반드시 Pod으로 감싸서 관리

Replicaset & Deployment

  • Pod을 여러 개(한 개 이상) 복제하여 관리하는 오브젝트
  • 복제할 개수, 개수를 체크할 라벨 선택자, 생성할 Pod의 설정값(템플릿)등 설정
  • 자동으로 롤링 업데이트 가능

Service
네트워크 관련 Object, Pod <-> Pod 연결, 외부에서 접근할때 등등 사용

Kubernetes Manifest 파일

  • 오브젝트의 명세Spec, 상태desired state 정의는 YAML 파일로 정의
  • 오브젝트의 종류와 원하는 상태를 입력
  • 배포 노드나 RBAC(접근 권한 설정) 도 가능
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        command: ["/bin/bash", "-c", "--"]
        args: ["while true; do sleep 30; done;"]
        ports:
        - containerPort: 80

Kubernetes VS Docker-Compose

두가지 모두 container 을 관리하는 기능이다 둘의 차이점은 무엇이있을까?
👉 Compose는 단순히 여러 개의 컨테이너를 한번에 관리하는 것이고, 쿠버네티스는 클러스터 환경에서 컨테이너를 관리하기 위한 도구이다.

Amazon Elastic Kubernetes Service(EKS)란?

AWS의 관리형 쿠버네티스 서비스로 아래와 같은 두가지 기능이 있다.

  • 서비스 통합
    Amazon EKS는 다른 AWS 서비스와 통합되어, 컨테이너화된 애플리케이션을 배포하고 관리하기 위한 포괄적인 플랫폼을 제공 가능
  • 규모 조정
    Amazon EKS는 CPU 또는 사용자 지정 지표를 기반으로 수평 Pod 자동 규모 조정, 그리고 전체 워크로드 수요를 기반으로 클러스터 자동 규모 조정 가능

Elastic Container Serivce(ECS)란?

‘Amazon Elastic Container Service(Amazon ECS)는 확장성이 뛰어나고 빠른 컨테이너 관리 서비스입니다. 이를 사용하여 클러스터에서 컨테이너를 실행, 중지 및 관리할 수 있습니다. Amazon ECS에서 컨테이너는 서비스 내 개별 태스크나 여러 태스크를 실행하는 데 사용하는 태스크 정의에 정의됩니다. 이 컨테이너에서 서비스는 클러스터에서 지정된 수의 태스크를 동시에 실행하고 유지하는 데 사용할 수 있는 구성입니다. AWS Fargate에서 관리하는 서버를 사용하지 않는 인프라에서 태스크 및 서비스를 실행할 수 있습니다. 또는 인프라에 대한 더 세부적인 제어를 위해 관리하는 Amazon EC2 인스턴스의 클러스터에서 태스크와 서비스를 실행할 수 있습니다.’
출처: AWS

즉 ECS는 우리가 흔히 사용하는 컨테이너(ex: Docker)를 관리하기 위한 도구이다. 컨테이너를 쉽게 실행, 중지하는 등의 관리가 가능하다.

ECS vs EKS
위 사진은 AWS에서 제공하는 컨테이너 서비스이다. Management에 ECS와 EKS가 있다. 둘 다 컨테이너를 관리하는 점이 비슷하다. 비슷한 서비스인 듯 하지만 ECS는 Docker를 기반으로 하고, EKS는 Kubernetes를 기반으로 한다. 간단히 말해서 ECS는 AWS의 자원을 활용하고, EKS는 Kubernetes의 자원을 더 활용한다. 상황을 잘 고려하여 선택하는 것이 좋다.

0개의 댓글