[DDD&MSA] MSA(Microservice Architecture) 구성요소
Book/DDD & MSA

[DDD&MSA] MSA(Microservice Architecture) 구성요소

MSA(Microservice Architecture) 구성요소

소프트웨어 아키텍트인 크리스 리처드슨(Chris Richardson)은 마이크로서비스 아키텍처 패턴을 인프라 패턴, 애플리케이션 인프라 패턴, 애플리케이션 패턴 등으로 분류해서 정의했다.

 

시스템을 개발하는 개발자의 입장에서 마이크로서비스 시스템을 구현하기 위해 밟아야 할 단계들을 알아보자.

우선은 인프라가 구축돼야 하고, 그 위에 미들웨어가 올라가고, 미들웨어 위에서 애플리케이션이 동작해야 한다.

따라서 인프라, 미들웨어 영역을 대신하고 있는 플랫폼, 애플리케이션 관련 패턴들을 살펴보자.

  • 인프라 구성요소: 마이크로서비스를 지탱하는 하부구조 인프라를 구축하는 데 필요한 구성요소
  • 플랫폼 패턴: 인프라 위에서 마이클로서비스의 운영과 관리를 지원하는 플랫폼 차원의 패턴
  • 애플리케이션 패턴: 마이크로서비스 애플리케이션을 구성하는 데 필요한 패턴

인프라 구성요소

인프라의 의미는 엔터프라이즈 IT 환경을 운영하고 관리하는 데 필요한 근간이 되는 하드웨어, 소프트웨어, 네트워킹 구성요소, 운영체제, 데이터 스토리지 등을 모두 포괄한다.

클라우드 환경에서는 이러한 인프라 구성요소가 가상화되어 제공된다.


퍼블릭 클라우드와 베어 메탈, 프라이빗 클라우드 환경

베어 메탈: 어떤 소프트웨어도 담지 않은 하드웨어 서버 제품군 자체를 의미한다.

 

요즘은 AWS, 구글, 마이크로소프트, IBM 등의 기업에서 자동화된 IaaS(Infrastructure as a Service), PaaS(Platform as a Service) 서비스를 통해 쉽고 편하게 이용할 수 있게 제공한다.

 

마이크로서비스는 특정 인프라에 종속되지는 않는다. 물리적인 베어 메탈 장비를 구매해서 인프라를 구축하든, 아니면 가상화 환경을 선택해서 이용하든, 또 가상화 환경을 사용할 때 어떤 클라우드 서비스를 사용하든 크게 신경 쓸 필요가 없다.

 

그러나 가상 인프라 환경을 선택하지 않는다면, 마이크로서비스마다 베어메탈 장비를 구축해야 하고 인프라의 유연한 확장/축소를 기대하기 힘들어지기 때문에 유연성 때문이라도 가상 인프라 환경을 고려해보는게 필요하다.


VM과 컨테이너

가상 인프라 환경을 활용하기로 선택했다면, 다음 고려 사항은 가상 머신(VM: Virtual Machine)제품과 컨테이너 기반 제품 중 하나를 선택하는 것이다.

  • VM 제품은 하이퍼바이저(Hypervisor)라는 소프트웨어를 이용해 하나의 시스템에서 여러 개의 운영체제를 사용한다.
  • 컨테이너 기반 제품은 컨테이너 엔진을 사용해 가상의 격리된 공간을 생성한다.

 

가상 머신에서는 운영체제 패치 설치나 관련 라이브러리 설치 같은 오버헤드가 지속적으로 발생한다. 따라서 마이크로서비스 같은 작은 서비스를 패키징하고 배포하기에는 컨테이너 기반 환경이 더 적합하다. 마이크로서비스의 가변적이고 유연한 속성을 컨테이너가 쉽고 빠르게 지원할 수 있기 때문이다.

 

가장 많이 사용하는 가상 머신 제품군으로는 AWS EC2, Azure VM 등이 있다.

 

가장 대표적인 컨테이너 기술로는, 필요한 라이브러리나 실행 파일을 여러 개의 레이어 이미지로 추가하거나 변경할 수 있는 도커(Docker)가 유명하고 가장 많이 사용된다.

 

도커 컨테이너는 다음 그림과 같이 레이어 단위의 이미지를 포개는 방식으로 구성되며, 밑에서부터 애플리케이션 구동을 위한 기반 이미지, 운영체제, 런타임, 애플리케이션이 이미지로 정의된다.

도커 컨테이너는 다음과 같은 이점이 있다.

  • 이식성: 어떠한 호스트 커널이나 플랫폼 버전에 상관없이 도커만 실행할 수 있으면 사용 가능하며 동일하게 동작된다.
  • 신속성: 크기가 작고 가볍기 때문에 빠르게 배포 가능하며, 문제 발생 시 수정할 필요 없이 새로 기동하면 된다.
  • 재사용성: 동일한 환경을 재사용해서 쉽게 설정 가능하기 때문에 개발, 테스트, 스테이징, 프로덕트 환경을 동일한 환경으로 구축하기가 쉽다.

컨테이너 오케스트레이션, Container Orchestration

컨테이너 오케스트레이션은 컨테이너를 관리하기 위한 기술로, 컨테이너의 자동 배치 및 복제, 장애 복구, 확장 및 축소, 컨테이너 간 통신, 로드 밸런싱 등의 기능을 지원한다.

 

컨테이너 오케스트레이션 도구로는 도커 스웜(Docker Swarm), 아파치 메소스(Apache Mesos) 등 여러 개가 있지만 최근에는 대부분 쿠버네티스(k8s: Kubernetes)를 많이 사용한다.

 

쿠버네티스나 AWS같은 플랫폼 사업자가 제공하는 대부분의 PaaS UI는 시각적인 대시보드를 제공하는데, 그 곳에서 컨테이너 배포의 기본 단위에 해당하는 파드(Pod). 디플로이먼트(Deployment), 레플리카셋(Replica Sets) 정보를 확인하고 설정할 수 있다.

 

쿠버네티스는 다음과 같은 주요 기능을 제공한다.

  • 자동화된 자원 배정(Automatic binpacking): 각 컨테이너가 필요로 하는 CPU와 메모리를 쿠버네티스에 요청하면 컨테이너를 노드에 맞춰 자동으로 배치한다.
  • 셀프 치유(Self-healing): 컨테이너의 이상 유무를 점검(health check)해서 실패한 경우 자동으로 교체하고 재스케줄링한다.
  • 수평 확장(Horizontal scaling): 일정 CPU 및 메모리 사용량을 초과하면 자동으로 확장한다.

그 밖의 다양한 클라우드 인프라 서비스

AWS, Azure, GCP 등의 CSP 사업자 모두 기존의 물리 서버, 네트워크, 스토리지, DB를 대체할 다양한 가상 서버, 가상 네트워크 및 가상 스토리지, 가상 DB등을 제공하고 있으며, 이들의 연계는 퍼블릭/프라이빗 간, 가상/물리 레거시 시스템 간에 모두 가능하다.

 

애플리케이션 형태를 모노리스 시스템으로 구축하기 위해서는 가상 머신 클라우드 제품군인 AWS EC2 나 Azure VM을 사용할 수 있다.

 

MSA 시스템으로 구축한다면, 쿠버네티스가 아니라도 동일한 컨테이너 기반인 AWS Elastic Beanstalk 이나 Elastic Container Service(ECS), Azure Web App, Google App Engine 등의 PaaS를 사용할 수도 있다.


서비스 유형별 대표적인 클라우드 서비스

  • IaaS(Infrastructure as a Service): 가상 머신, 스토리지, 네트워크 같은 인프라를 필요한 만큼 적시에 제공하는 서비스로서 사용자는 이러한 인프라를 이용해 개발 환경을 구성한 후 애플리케이션을 배포한다.
    (가상 서버, 가상 네트워크, 가상 스토리지라 생각하면 이해하기 쉽다.)
    • ex) AWS EC2(Elastic Compute Cloud), GCP Compute Engine, Azure VM
  • CaaS(Container as a Service): 컨테이너 기반 가상화를 사용해 컨테이너를 업로드, 구성, 실행, 확장, 중지할 수 있는 서비스이다. 애플리케이션을 바로 구동할 수 있는 환경을 제공한다는 점에서 PaaS와 유사하지만 다른 환경에도 이식 가능한 컨테이너 기반 가상화를 제공한다는 점이 다르다.
    • ex) Azure Kubernetes Service(AKS), AWS EKS(Elastic Kubernetes Service), Google Kubernetes Engine(GKE), AWS ECS
  • PaaS(Platform as a Service): 복잡함 없이 애플리케이션을 곧바로 개발, 실행, 관리할 수 있는 플랫폼 환경을 서비스 형태로 제공한다. IaaS 위에 실제로 애플리케이션이 실행될 수 있는 미들웨어나 런타임까지 탑재된 환경이라 생각하면 이해하기 쉽다.
    • ex) Azure Web App, Google App Engine, Cloud Foundry, Heroku, AWS Elastic Beanstalk