2/09/2020

Service Mesh 아키텍처 스타일 비교

이전 글에서 서비스 메시에 대해서 간략히 언급했었습니다. 서비스 메시가 무엇인지 아직 모르시는 분은 링크 를 통해 읽어보세요.

본 글에서는 서비스 메시의 아키텍처 스타일에 대해서 얘기하고자 합니다.

우리가 이미 알고 있는 방법일 수 도 있습니다.

  • Library 방식: 라이브러리로 필요 기능들이 제공되며, 애플리케이션의 코드 레벨로 사용되어야 합니다. (어찌 보면, 서비스 메시라고 할 순 없지만 서비스 메시를 구현하기 위한 대안? 으로 이해하시면 될 것 같습니다.)
  • Node Agent 방식: Node Agent나 Daemon에 의해서 기능들이 제공됩니다.
  • Sidecar 방식: 컨테이너내에 sidecar로 proxy가 적용되어 기능들이 제공됩니다.

이제 각각의 아키텍처 스타일에 대해 상세히 살펴 볼까요?

타입별 Service Mesh Architectures

Library Architecture


라이브러리를 이용하게 되면 위의 그림에서 표현했듯이 각 마이크로 서비스 애플리케이션에 서비스 메시 기능을 구현하는 라이브러리 코드가 포함됩니다. (e.g. Hystrix, Ribbon)

이 기능은 서비스내에서 독점적으로 하나의 프로그래밍 언어만 사용하는 경우에 적합합니다. 라이브러리로 접근하게 되면 인프라 환경에 크게 영향을 받지 않습니다.

하지만, 대부분은 Polyglot 형태로 마이크로 서비스를 실행하고 있습니다. 이 경우 사용하는 프로그래밍 언어마다 라이브러리가 존재해야 합니다. 따라서 라이브러리 방식을 채택할 경우에는 제약이 존재합니다.

Node Agent Architecture

라이브러리 아키텍처 이후에 나온 대안입니다. 모든 노드에서 실행되는 별도의 Agent가 존재하며, 이 기종간 쉽게 혼합될 수 있는 이점을 제공합니다.

모든 노드에 하나의 노드 에이전트가 필요하기에 이 아키텍처를 채택하기 위해서는 인프라와 협업이 필요합니다. 즉, 운영체제에 TCP 패킷을 보내거나 받을 수 있도록 역할을 위임합니다.

공유를 한다는 것은 리소스 차원에서 효율적으로 보일 수 있지만, 여러개의 마이크로 서비스가 하나의 노드를 공유하는 모델이기 때문에, 선점에 대한 문제가 있을 수 있습니다. 예를 들어서 노드에 속해 있는 모든 마이크로 서비스가 노드 에이전트에 요청을 하면 노드 에이전트는 먼저 요청한 마이크로 서비스의 업무를 처리해야 합니다. 효율적으로 리소스를 공유할 수 있다면, 나쁘지 않은 방법이라고 생각합니다.


사이드카는 가장 마지막에 나온 아키텍처입니다. Istio가 Envoy와 함께 사용되는 모델입니다. 서비스 메시의 경우 사이드카는 애플리케이션 안팎의 모든 네트워크 트래픽을 처리합니다.

이 접근법은 지금까지 설명한 라이브러리와 노드 에이전트 접근법 사이에 존재합니다. 예를 들어서, 모든 노드에서 새 에이전트를 실행하지 않고도 사이드카 서비스 메시를 배포할 수 있습니다. (사이드카에 대한 내용은 이전 포스팅에서 설명했습니다.) 노드 에이전트와는 달리 각 Pod에 배포가 되기에 더 많은 리소스가 필요합니다만, 개인적인 관점에서는 얻는 이득이 더 크다고 생각됩니다.

어떤 방식을 채택하는 것이 효율적일까요? 여러 상황들을 고려하여 적합한 방식을 선택해보세요.

다음 포스팅에서는 각 아키텍처 타입별 오픈소스/상용 솔루션에 대해서 이야기 하도록 하겠습니다.

2/05/2020

Service Mesh Architecture (서비스 메시 아키텍처)

마이크로 서비스는 소프트웨어 산업에 많은 영향을 주었습니다. Monolithic에서 마이크로 서비스 아키텍처로 전환하면 독립적으로 더 자주 애플리케이션을 배포 할 수 있습니다.

그러나 마이크로 서비스 아키텍처를 채택하는 것은 분산 시스템을 설계 할 때 발생하는 문제들을 가지고 있고 이 문제를 해결해야 한다는 것을 의미합니다.

분산 컴퓨팅의 오류를 살펴 볼까요?

  • 네트워크는 신뢰할 수 있다.
  • 지연 시간은 0이다.
  • 네트워크 대역폭은 무한하다.
  • 네트워크는 안전하다.
  • Topology는 변하지 않는다.
  • 관리자 한명이 모든 것을 처리한다.
  • 데이터 전달 비용은 0이다.
  • 동종 네트워크이다.

마이크로 서비스 아키텍처 사용시 네트워크에 대하여 종속성이 생깁니다. 이는 안정성에 문제를 유발합니다. 서비스 수가 증가하게 되면 각 서비스간 상호 작용을 처리하고, 상태를 모니터링하고, 로깅 및 측정을 수행하고, 여러 장애 지점을 체크하는 등의 작업을 수행해야 합니다. 서비스간 통신을 신뢰할 수 있도록 각 서비스에는 위에서 언급한 것들을 처리하는 공통 기능이 필요합니다. 그러나 다양한 언어로 작성된 수많은 마이크로 서비스를 사용해야 한다면 많은 노력을 해야 합니다.

서비스 메시란 무엇인가?

서비스 메시는 MSA에서 서비스 간 통신을 처리하는 인프라 레이어(통신에 대한 기본 베이스)로 정의할 수 있습니다. 서비스 메시는 MSA와 관련된 복잡성을 줄이고 아래와 같은 기능을 제공합니다.

  • Load Balancing
  • Service Discovery
  • Health check
  • Authentication
  • Traffic management and routing
  • Circuit breaking and failover policy
  • Security
  • Metrics and telemetry
  • Fault injection

서비스 메시가 필요한 이유?

MSA에서 서비스간 통신 처리는 쉽지 않습니다. 위에서 언급한 Service discovery, Load balancing과 같은 기능을 제공하기 위해서는 Fat library에 의존하게 됩니다. Netflix는 Hystrix, Eureka등 자체 라이브러리를 만들었습니다.

그러나 이러한 구성 요소는 애플리케이션의 코드내에서 구성해야 합니다.

사용하는 Language에 따라 구현 방식도 다릅니다. Fat Library가 version up 될때마다 애플리케이션에 반영 후 테스트하고 배포해야 합니다. 그리고 애플케이션의 비즈니스 코드와 MSA 통신을 위한 코드가 혼합되는 문제가 발생합니다. 이는 긴밀한 결합이고 전반적으로 애플리케이션의 복잡성을 증가시킵니다. 코드에 혼합되기 때문에 개발자는 매커니즘과 구성 방법등을 이해해야합니다. 그렇지 않으면 문제가 발생 했을때에 해결할 수 없기 때문입니다.

이러한 이유는 서비스 메시가 나오게 된 계기가 됩니다. 위에서 언급한 복잡성을 애플리케이션에서 분리하여 Service Proxy에 주입하여 처리 할 수 있습니다. Service Proxy는 Traffic management, Circuit break, Service discovery, Authentication, Monitoring, Security등과 같은 기능을 제공합니다. 따라서 애플리케이션 관점에서는 비즈니스 기능만 구현하면 됩니다. 비즈니스 기능을 개발하는 개발자들이 매커니즘과 구성 방법을 이해할 필요도 없고요.

서비스 메시의 도입으로 명확하게 책임을 분리할 수 있습니다. 개발자들의 삶은 더 편안해지게 됩니다. 문제가 발생할 경우 개발자는 애플리케이션의 문제인지 네트워크의 문제인지에 따라서 근본적인 원인을 쉽게 식별할 수 있게 됩니다.

서비스 메시가 구현되는 방식은?

서비스 메시를 적용하기 위해서는 마이크로 서비스와 함께 Proxy를 배포해야 합니다. 이를 Side car pattern이라고 합니다.

사이드카는 애플리케이션에서 복잡성을 제거하고 Service discovery, Traffic management, Load balancing, Circuit break등과 같은 기능을 처리 합니다.

Lyft의 Envoy는 Cloud Native Application을 위해 설계된 가장 인기 있는 Open source proxy입니다. Envoy는 모든 마이크로 서비스와 함께 실행되며 플랫폼에 상관없이 필요한 기능을 제공합니다. 서비스에 대한 모든 트래픽은 Envoy proxy를 통해 흐르게 됩니다.

Istio란 무엇인가?

Istio는 마이크로 서비스를 연결, 관리, 보호하기 위한 플랫폼 입니다. Kubernetes 커뮤니티에서 인기가 많고 널리 채택되고 있습니다.

Istio는 Intelligent Routing, Load balancing, Service discovery, policy enforcement(정책 시행), in-depth telemetry(심층적인 원격 측정), circuit breaking과 재시도 기능, 로깅, 모니터링등과 같은 MSA에 필요한 기능을 제공합니다.

Istio는 현재 시점에서 서비스 메시를 가장 잘 구현한 것 중 하나입니다. Istio외에 linkerd, conduit이 존재합니다. 위에서 언급된 기능에 대한 지식이 없이도 마이크로 서비스를 배포 할 수 있습니다.

현재 시장에서는 Monolithic 서비스를 마이크로 서비스로 분리하는 작업을 진행중입니다. 이는 더 많은 서비스를 관리해야 한다는 입장이기도 하고 이는 부담으로 다가올 수 있습니다. 서비스 메시는 이러한 상황에서 애플리케이션에 코드 주입없이 복잡성을 제거해줍니다.

MSA로의 전환을 생각한다면 서비스 메시도 고려해보세요.

참고:

  • https://dzone.com/articles/the-rise-of-service-mesh-architecture