본문 바로가기
AWS(강의)/Architecting on AWS

컨테이너, 마이크로서비스

by 문자메일 2024. 5. 7.

마이크로서비스 개요

애플리케이션 구성 요소를 보다 독립적으로 만들어 한 서비스의 변경 사항이 다른 서비스에 영향을 미치지 않도록 하려면 어떻게 해야 합니까?

 

컴퓨팅 운영 관리자가 특정 서비스의 변경 사항이 다른 서비스에 영향을 주지 않도록 애플리케이션 구성 요소의 독립성을 높이는 방법을 문의해 왔습니다.

 

이 회사에서는 레거시 애플리케이션 몇 개를 클라우드에서 리아키텍트하려고 합니다.

이러한 애플리케이션은 상호 의존적 구성 요소를 다수 포함하므로 업데이트하고 오류를 정확하게 파악하기가 어렵습니다.

따라서 이 회사가 이러한 애플리케이션을 설계하는 데 사용할 수 있는 다양한 방식을 조사해야 합니다.

 

 

 

 

마이크로서비스는 소프트웨어 개발에 대한 구조적이고 조직적인 접근 방식이다.

마이크로서비스 방식을 사용하면 소프트웨어를 소규모의 서비스 모음으로 설계할 수 있다.

각 서비스는 독립적으로 배포되고 잘 정의된 API를 통해 통신한다.

 

자율적

마이크로서비스 아키텍처의 구성 요소는 서비스는 서로 분리되어 있고 API를 통해 통신한다.

그러므로 다른 서비스에 영향을 주지 않고 서비스를 개발, 업데이트, 배포, 운영하고 크기를 조정할 수 있다.

 

전문적

특정 문제를 중점적으로 해결하는 일련의 기능을 제공하도록 각 서비스를 설계한다.

팀은 해당 서비스에 가장 적합한 프로그래밍 언어로 각 서비스를 작성할 수 있다.

그리고 각기 다른 컴퓨팅 리소스에서 서비스를 호스트할수도 있다.

 

위의 이미지에서 모놀리식 포럼 애플리케이션을 사용자 서비스, 주제 서비스, 메시지 서비스와 같은 마이크로서비스 아키텍처를 사용하도록 리팩터링한다.

/users 서비스 팀은 AWS Lambda에서 사용자 서비스를 실행한다.

/topics 서비스 팀은 EC2에서 서비스를 실행한다.

/messages 서비스 팀은 컨테이너에서 메시지 서비스를 실행한다.

마이크로서비스 애플리케이션은 2개 가용 영역에 걸쳐 분산되며, ALB를 사용하여 트래픽을 관리한다.

 

 

컨테이너 개요

컴퓨팅 요구 사항에 맞게 컨테이너를 사용하면 어떤 이점이 있는가?

 

컨테이너

컨테이너 : 코드 +  구성 + 종속성(환경 일관성) + 런타임 엔진

 

마이크로서비스 지향적 아키텍처의 이점은 인프라 수준까지 전파되어야 한다.

컨테이너를 사용하면 이러한 목표를 달성할 수 있다.

 

컨테이너는 애플리케이션의 코드, 구성 및 종속성을 하나의 객체로 패키징하는 표준화된 방식을 제공한다.

 

컨테이너는 서버에 설치된 운영 체제를 공유하며 리소스가 격리된 프로세스 형태로 실행되므로 환경에 상관없이 빠르고 안정적이며 일관된 배포를 진행할 수 있다.

 

 

가상화 및 추상화 수준

 

 

여기서 라이브러리가 커널 말하는 건가 보다.

베어 메탈 서버

라이브러리를 사용하여 하나 이상의 애플리케이션으로 독립 실행형 OS를 실행한다.

서버의 사용률이 0%이든 100%이든 관계없이 비용이 일정하게 유지된다.

크기를 조정하려면 서버를 추가로 구매하여 구성해야 한다.

그리고 여러 서버에서 작동하는 애플리케이션을 구축하기도 어렵다.

서버의 OS가 동일해야 하기 때문이다.

애플리케이션 라이브러리 버전도 동기화해야 한다.

 

가상 머신

가상 머신을 사용하여, 애플리케이션 및 라이브러리를 자체 OS 전체와 함께 격리한다.

VM의 단점은 가상화 계층이 무겁다는 것이다.

각 VM은 자체 OS를 사용하므로 호스트 CPU와 RAM이 더 많이 필요하다.

그래서 효율성과 성능이 낮아진다.

VM마다 개별 OS가 있다는 것은 물리적 호스트에서 더 많은 패치와 더 많은 업데이트, 더 많은 공간을 차지한다는 뜻이다.

 

컨테이너화

컨테이너화를 수행하면 컨테이너는 시스템의 OS 시스템 커널을 공유하며 기본 OS 파일 시스템이 노출된다.

-> 베어메탈 서버와 동일하게 OS는 동일한 것 사용하기 때문, 

시스템의 OS 시스템 커널을 공유하면 공유 라이브러리를 사용할 수 있으며 필요에 따라 개별 라이브러리도 사용할 수 있다.

그러므로 컨테이너는 휴대성이 뛰어나다.

또한 컨테이너는 VM보다 빠르게 시작하고 중지할 수 있다. 

컨테이너는 가볍고 효율적이며 빠르다.

 

VM과 달리 컨테이너는 적절한 커널 기능이 지원되며 Docker daemon이 있는 어떤 Linux 시스템에서나 실행할 수 있으므로 휴대성이 뛰어나다. 랩톱, VM, EC2 인스턴스, 베어 메탈 서버에서 호스트 할 수 있다.

 

또한, 하이퍼바이저가 필요 없다는 것은 성능 오버헤드가  거의 발생하지 않는다는 뜻이다.

프로세스가 커널과 직접 커뮤니케이션하며, 대체로 다른 독립 컨테이너에 대해서는 인식하지 못한다.

대부분의 컨테이너는 몇 초 만에 부팅된다.

 

 

AWS의 컨테이너

Amazon EC2에서 컨테이너를 직접 실행하려면 크기 조정, 연결 및 유지 관리 작업을 사용자가 직접 관리해야 한다.

오케스트레이션 도구를 통해 관리할 수 있는 작업

  • 일정 예약
  • 배치
  • 네트워킹
  • 모니터링

 

EC2에서 Docker가 설치된 가상 게스트 OS는 컨테이너를 빌드하고 실행할 수 있다.

이러한 유형의 배포는 사용되는 EC2 인스턴스 크기까지만 조정이 가능하다.

또한 컨테이너의 네트워킹, 액세스 및 유지 관리를 고객이 직접 관리해야 한다.

 

오케스트레이션 도구는 AWS에서 컨테이너를 실행하기 위한 확장 솔루션이다.

오케스트레이션 도구는 수백 개의 EC2 인스턴스를 포함하여 컨테이너를 호스팅할 수 잇는 컴퓨팅 리소스 풀을 사용한다.

오케스트레이션 도구는 애플리케이션의 수요가 변경됨에 따라 컨테이너를 시작하고 종료한다.

그리고 컨테이너의 연결을 관리한다.

또한 컨테이너 배포 및 업데이트를 관리하는 데에도 도움이 된다.

 

 

 

컨테이너 서비스

컴퓨팅 운영 관리자가 클라우드에서 컨테이너화된 애플리케이션을 관리하는 데 사용할 수 있는 옵션을 문의해 왔습니다.

소프트웨어 엔지니어링 팀은 컨테이너를 사용하도록 회사 애플리케이션 중 일부의 리팩터링을 고려하고 있습니다.

그래서 컴퓨팅 운영 관리자가 클라우드에서 컨테이너화된 애플리케이션을 지원하는 AWS 서비스를 조사해 줄것을 요청했습니다.

 

※ 도커 file에서 컨테이너 생성까지

※ Dockerfile ---build--> Docker image ---run--> Docker Container

 

 

AWS에 관리형 컨테이너 솔루션을 배포하려면 아래 구성요소를 선택하고 구성해야 한다.

 

레지스트리

- 컨테이너화된 애플리케이션을 개발할 때는 컨테이너를 실행하는 데 필요한 모든 항목이 포함된 컨테이너 이미지를 구축한다.

이러한 항목에는 애플리케이션 코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등이 포함된다.

그런 다음 버전 제어를 위해 이미지를 레퍼지토리에 푸시하고, 해당 이미지를 레퍼지토리에서 끌어와 컨테이너를 배포한다.

  • AWS는 다른 AWS 서비스와 통합을 지원하는 컨테이너 이미지 레지스트리로 Amazon ECR을 제공함

 

오케스트레이션 도구

- 컨테이너 오케스트레이션 도구를 사용하여 컨테이너화된 애플리케이션을 규모에 맞게 관리할 수 있다.

오케스트레이션 도구는 컨테이너의 크기 조정, 네트워킹 및 유지 관리 작업을 관리한다.

컨테이너 시작 및 종료 관리, 컨테이너 상태 모니터링, 업데이트 배포 및 장애 조치 및 복구 관리에 도움이 된다.

  • Amazon EKS는 AWS에서 쿠버네티스 컨테이너 오케스트레이션 소프트웨어를 실행하는 데 사용할 수 있는 관리형 서비스이다.
  • Amazon ECS는 컨테이너 배포를 위해 보다 관리된 모델을 제공하는 관리형 컨테이너 오케스트레이션 서비스이다.

컨테이너 호스팅

오케스트레이션 도구가 컨테이너를 호스트하는 데 사용하도록 할 컴퓨팅 리소스를 결정해야 한다.

이러한 리소스를 컨테이너의 시작 유형이라고도 한다.

  • Amazon EC2를 선택하여 다양한 인스턴스 유형에서 컨테이너를 시작할 수 있다.
    수요가 변경되면 컨테이너를 호스트하는 데 사용되는 EC2 인스턴스 수를 확장 및 축소할 수 있다.
    이 방법은 비용 효율성이 우수하며, 인스턴스 유형을 더욱 효과적으로 제어할 수 있다.
  • AWS Fargate는 컨테이너를 지원하기 위해 CPU 및 메모리 리소스를 자동으로 할당하는 서버리스 호스팅 서비스이다.
    Fargate 사용 시에는 기본 컴퓨팅 리소스를 프로비저닝하거나 관리할 필요가 없다.

 

Amazon ECR

Amazon ECR은 관리형 Docker 컨테이너 레지스트리이다.

컨테이너 이미지를 Amazon ECR로 푸시한 다음 해당 이미지를 끌어와서 컨테이너를 시작할 수 있다.

컨테이너 이미지에 대한 압축, 암호화, 버전관리, 이미지 태그도 관리할 수 있다.

 

Amazon ECS 오케스트레이션

AWS와 긴밀하게 통합된 관리형 컨테이너 오케스트레이션 서비스

  • 리포지토리에서 이미지 가져오기
  • ECS 서비스는 컨테이너 수를 관리하며 서비스 용량 크기를 조정함
  • ECS 클러스터가 호스팅 용량 크기를 조정함

Amazon ECS는 도커 컨테이너를 지원하는 확장성이 뛰어난 고성능 컨테이너 관리 서비스이다.

Amazon ECS는 컨테이너화된 애플리케이션의 크기 조정, 유지 관리 및 연결을 관리한다.

 

ECS를 사용하면 ECS 태스크를 시작하는 ECS 서비스를 생성할 수 있다.

ECS 태스크는 하나 이상의 컨테이너 이미지를 사용할 수 있다.

ECS 서비스는 애플리케이션의 수요를 충족하도록 실행 중인 태스크 수를 조정한다.

 

애플리케이션을 위한 전용 인프라를 갖춘 ECS 클러스터를 생성한다.

AWS Fargate에서 관리하는 서버리스 인프라에서 태스크 및 서비스를 실행할 수 있다.

인프라를 더 효과적으로 제어하려는 경우 EC2 인스턴스의 클러스터에서 태스크 및 서비스를 관리할 수 있다.

EC2 인스턴스를 클러스터에 추가하거나 클러스터에서 제거하여 클러스터의 EC2 호스팅 용량 크기를 조정할 수 있다.

 

 

 

Amazon ECS 기능

ECS는 아래와 같은 기능을 제공한다.

  • 완전관리형 - Amazon ECS는 완전관리형 서비스이미로 컨트롤 플레인, 노드 또는 추가 기능을 관리할 필요가 없다.
    그러므로 팀이 환경 관리가 아닌 애플리케이션 구축 작업만 중점적으로 수행할 수 있다.
  • 서비스 검색 - ECS에서는 서비스 검색이 지원된다. 서비스 검색 기능을 사용하면 도메인 이름 시스템 이름에 ECS 서비스를 등록할 수 있다.
  • AWS 통합 - ECS는 다음과 같은 여러 AWS 서비스에 긴밀하게 통합된다.
    • ECR : ECS를 ECR과 통합할 수 있다. 그러면 컨테이너화된 애플리케이션이 원활하게 컨테이너 이미지에 엑세스하여 해당 이미지를 실행할 수 있다.
    • AWS Identity and Access Management(IAM) : 각 컨테이너에 세분화된 권한을 배정할 수 있다. 그러면 애플리케이션 구축 시에 컨테이너를 높은 수준의 격리가 가능하다.
    • Amazon CloudWatch Logs 및 Container Insights : 컨테이너화된 애플리케이션과 인스턴스의 로그를 한 곳에서 편하게 확인할 수 있다.
  • 유연한 호스팅 옵션 - ECS에서는 EC2, Fargate를 통한 서버리스 호스팅을 모두 사용할 수 있다.
    리소스 요구 사항, 격리 정책 및 가용성 요구 사항에 따라 클러스터 전체에 컨테이너 배치를 예약할 수 있다.
  • 개발 워크플로 - ECS는 지속적 통합/지속적 배포를 지원한다. Docker 컨테이너 기반 마이크로서비스 아키텍처에서는 일반적인 프로세스이다. 아래 작업을 수행하는 CI/CD 파이프라인을 생성할 수 있다.
    • 소스 코드 리포지토리의 변경 사항 모니터링
    • 해당 소스에서 새 Docker 이미지 구축
    • Amazon ECR, Docker Hub 등의 이미지 리포지토리에 이미지 푸시
    • 애플리케이션에서 새 이미지를 사용하도록 ECS 서비스 업데이트

 

컨테이너 이론

https://easyitwanner.tistory.com/category/Container/Container%20%EC%9D%B4%EB%A1%A0#google_vignette

 

쿠버네티스 장점

https://easyitwanner.tistory.com/171

모든 서버에 쿠버네티스를 설치할 경우 운영 팀이 더 이상 애플리케이션 배포를 따로 처리할 필요가 없다.

컨테이너화된 애플리케이션은 이미 실행에 필요한 모든 것이 포함되어 있으므로 시스템 관리자는 애플리케이션을 배포하고 실행하기 위해 아무것도 설치할 필요가 없어진다.

즉, 쿠버네티스가 배포된 모든 노드에서는 시스템 관리자의 도움 없이 즉시 애플리케이션을 실행할 수 있게 된다.

-> 잘은 모르겠지만, 배포하려는 서버에 쿠버네티스만 깔려있으면 해당 애플리케이션 실행하기 위한 환경 구성 없이 컨테이너로 프로그램들 바로 실행할 수 있어서 배포가 편리해진다는 그런 뜻으로 보임.

-> 기존에 도커 run으로 컨테이너 실행해본적은 있는데, 새로운 버전의 애플리케이션을 많은 서버에 배포할 때 docker run으로 배포하려면 어려운 것 같고, 그래서 쿠버네티스가 컨테이너 배포 실행을 편리하게 해주는 것으로 보인다.

 

 

1. 애플리케이션 배포 단순화

쿠버네티스는 모든 워커 노드를 하나의 배포 플랫폼으로 제공하기 때문에 애플리케이션 개발자는 자체적으로 애플리 케이션을 배포할 수 있으며 클러스터를 구성하는 서버에 관해 알 필요가 없다.

 

2. 하드웨어 활용도 증가

서버에 수동으로 애플리케이션을 실행하는 대신 쿠버네티스를 설정하고 애플리케이션을 실행함으로써, 인프라와 애플리케이션을 분리할 수 있다.

쿠버네티스에 애플리케이션을 실행하도록 지시하면 애플리케이션의 리소스 요구 사항에 대한 디스크립션과 각 노드에서 사용가능한 리소스에 따라 애플리케이션을 실행할 가장 적합한 노드를 선택할 수 있다.

 

3. 상태 확인과 자가 치유

서버 장애 발생 시 언제든지 클러스터 간에 애플리케이션을 이동할 수 있는 시스템을 갖추는 것도 중요하다.

클러스터 크기가 증가하면 컴퓨터 구성 요소의 고장을 더 자주 처리하게 된다.

 

쿠버네티스는 애플리케이션 구성 요소와 이 애플리케이션이 구동 중인 노드를 모니터링하다가 노드 장애 발생 시 자동으로 애플리케이션을 다른 노드로 스케줄링 한다.

이로써 운영 팀은 애플리케이션 구성 요소를 수동으로 마이그레이션 할 필요가 없어지고, 애플리케이션을 재배치하는 대신 즉시 노드 자체를 수정해 사용 가능한 하드웨어 리소스 풀에 반환하는 데 집중할 수 있다.

 

4. 오토스케일링

쿠버네티스를 사용해 배포된 애플리케이션을 관리한다는 것은 급격한 부하 급증에 대응하기 위해 개별 애플리케이션의 부하를 운영 팀이 지속적으로 모니터링할 필요가 없음을 의미한다.

쿠버네티스는 각 애플리케이션에서 사용하는 리소스를 모니터링하고 각 애플리케이션의 실행 중인 인스턴스 수를 계속 조정하도록 지시할 수 있다.

 

5. 애플리케이션 단순화

애플리케이션이 개발과 프로덕션 환경이 모두 동일한 환경에서 실행된다는 것을 생각하면 버그가 발견됐을 때 큰 효과를 발휘한다.

버그를 빨리 발견할수록 버그를 수정하는 것이 쉽고, 수정에 더 적은 작업이 필요하다.

쿠버네티스는 버그를 해결하는 개발자의 작업을 줄여줄 수 있다.

 

Amazon EKS

Kubernetes는 컨테이너화된 애플리케이션을 대규모로 배포하고 관리하는 데 사용할 수 있는 오픈 소스 소프트웨어이다.

Kubernetes는 EC2 컴퓨팅 인스턴스의 클러스터를 관리하고 배포, 유지 관리 및 스케일링 프로세스를 통해 이러한 인스턴스에서 컨테이너를 실행한다.

Kubernetes를 사용하면 온프레미스나 클라우드에서 동일한 도구들을 사용하여 원하는 유형의 컨테이너화된 애플리케이션을 실행할 수 있다.

 

Amazon EKS는 준수 인증을 받은 관리형 Kubernetes 서비스이다. EKS는 고가용성의 안전한 클러스터를 제공하는 데 도움이 되며 패치 적용, 노드 프로비저닝 및 업데이트와 같은 주요 태스크를 자동화한다.

 

  • 대규모로 애플리케이션 실행 - 복잡한 컨테이너형 애플리케이션을 정의하고 서버 클러스터 전체에서 대규모로 실행할 수 있다.
  • 애플리케이션을 원활하게 이전 - 컨테이너화된 애플리케이션을 로컬 개발 시스템에서 클라우드의 프로덕션 이전할 수 있다.
  • 어디서든 실행 - 가용성 및 확장성이 뛰어난 Kubernetes 클러스터를 실행할 수 있다.

 

AWS Fargate

AWS Fargate는 서버 또는 클러스터를 관리할 필요 없이 컨테이너를 실행하는 데 사용할 수 있는 AWS ECS와 AWS EKS를 위한 기술이다.

Fargate를 사용하면 더 이상 컨테이너를 실행하기 위해 VM 클러스터를 프로비저닝 및 구성하고 크기를 조정할 필요가 없다. 따라서 서버 유형을 선택하거나, 클러스터 크기 조정 시점을 결정하거나, 클러스터 패킹을 최적화할 필요가 없다.

 

Fargate에서는 서버 또는 클러스터에 대해 고민하거나 상호 작용할 필요가 없다.

Fargate를 사용하면 애플리케이션을 실행하는 인프라의 관리 대신 애플리케이션 설계 및 구축에 집중할 수 있다.

 

 

 

AWS 컨테이너 서비스 선택

 

AWS에 관리형 컨테이너 솔루션을 배포하려면 오케스트레이션 도구와 시작 유형을 선택해야 한다.

 

컨테이너화된 애플리케이션 관리

  • Amazon ECS에서는 수동 구성 작업은 줄이면서 다른 AWS 서비스와 더 쉽게 통합할 수 있는 관리형 솔루션을 제공한다.
  • Amazon EKS에서는 자체 쿠버네티스 클러스터를 설치 및 운영할 필요 없이 AWS 클라우드 또는 온프레미스에서 쿠버네티스 애플리케이션을 유동적으로 시작하고 크기를 조정할 수 있다.

컨테이너 호스팅

  • EC2에서 컨테이너를 호스트하려면 구성을 추가로 수행해야 한다.
    그러나 컨테이너를 호스트하는 데 사용하는 리소스를 더욱 자세하게 제어할 수 있다.
    또한 EC2에서는 더욱 비용 효율적으로 컨테이너를 호스트 할 수 있다.
  • AWS Fargate에서 컨테이너를 호스팅할 때는 서버리스 기술을 사용하는 자율 컨테이너 운영 기능이 제공된다.
    그러므로 구성, 패치 적용 및 보안 관련 작업에 소요되는 시간을 줄일 수 있다.

 

'AWS(강의) > Architecting on AWS' 카테고리의 다른 글

11. 서버리스  (0) 2024.05.13
10. 네트워킹2  (0) 2024.05.12
자동화 (CloudFormation)  (0) 2024.05.06
로드 밸런싱 & 오토 스케일  (0) 2024.05.04
모니터링  (0) 2024.05.04

댓글