본문 바로가기
CSP (Cloud Service Provider)/GCP

[GKE 사용하기] 서비스 디스커버리(Service Discovery)(1)

by BTC_yljo 2022. 11. 14.

이번 시간에는 GKE를 잘 사용하기 위해 쿠버네티스 서비스 디스커버리에 대해 알아보도록 하겠습니다.

Service Discovery란?

마이크로서비스 아키텍처(MSA)로 구성되어 있는 서비스들은 각자 다른 IP와 포트를 가지고 있다. 수많은 서비스의 IP와 포트 정보에 대해서 저장하고 관리하는 것이 필요하다.


클라우드에서 인스턴스는 동적으로 할당되기 때문에 IP주소나 포트 정보가 정해지지 않은 데다가 오토스케일링도 일어나고 중지되고 복구되면서 네트워크 위치가 지속적으로 변경된다.
따라서 클라이언트나 API 게이트웨이가 호출할 서비스를 찾기 위해 서비스 디스커버리(Service Discovery)가 필요하다. 서비스 디스커버리는 클라이언트 사이드 디스커버리 패턴(Client-Side Discovery Pattern)과 서버 사이드 디스커버리 패턴(Server-Side Discovery Pattern)으로 나눌 수 있다.

 

클라이언트 사이드 디스커버리

서비스 인스턴스의 네트워크 위치를 찾고 로드밸런싱하는 역할을 클라이언트가 담당하는 방식이다.

서비스 인스턴스는 네트워크 주소를 서비스 레지스트리(Service Registry)에 등록하고, 서비스 레지스트리는 각 서비스 인스턴스의 상태를 계속해서 체크한다. 클라이언트는 서비스 레지스트리에 등록된 인스턴스 중 하나를 골라서 요청을 보내는 방식으로 로드밸런싱이 이루어진다. 인스턴스가 종료되면 서비스 레지스트리에 등록된 정보는 삭제된다.
클라이언트 사이드 디스커버리 패턴의 예시로는 Netflix OSS가 있다. Netflix Eureka는 서비스 레지스트리로 서비스 인스턴스의 등록과 가용한 인스턴스를 찾는 REST API 를 제공한다. Netflix Ribbon은 Eureka와 같이 동작하는 IPC 클라이언트로, 서비스가 가능한 서비스 인스턴스 간 로드밸런싱을 해준다.

장점

  • 비교적 간단하다.
  • 디스커버리 로직을 클라이언트가 클라이언트가 가지고 있기 때문에 서비스에 맞는 로드밸런싱 방식을 각자 구현할 수 있다.

단점

  • 클라이언트와 서비스 레지스트리가 연결되어 있어서 종속적이다.
  • 서비스 클라이언트에서 사용하는 각 프로그래밍 언어 및 프레임워크별로 클라이언트 측 서비스 검색 로직을 구현해야 한다.

 

서버 사이드 디스커버리

서버 쪽에서 디스커버리 로직을 구현한 방식이다.

클라이언트가 로드밸런서로 요청을 보내면 로드밸런서는 서비스 레지스트리를 조회해서 가용한 인스턴스를 찾고 그 중 선택해서 요청을 라우팅하는 방식이다. AWS Elastic Load Balancer(ELB)가 서버 사이드 서비스 디스커버리 패턴의 예이다. 클라이언트에서 DNS 이름을 이용해 ELB로 요청을 보내면 ELB는 등록된 EC2 인스턴스나 ECS 컨테이너 사이에서 부하를 분산하며, 서비스 레지스트리 역할도 한다.
Kubernetes 환경에서는 클러스트 내 호스트 별로 프록시(proxy)를 실행한다. 이 프록시는 서버 쪽 서비스 디스커버리의 역할을 하며 클러스트 내에 가용한 서비스 인스턴스로 요청을 포워딩한다.

 

장점

  • 디스커버리의 세부 사항이 클라이언트로부터 분리되어 있다. (의존성 ↓)
  • 클라이언트는 단순히 로드 밸런서에 요청만 하므로, 각 프로그래밍 언어 및 프레임 워크에 대한 검색 로직을 구현할 필요가 없다.
  • 일부 배포환경에서는 이 기능을 무료로 제공한다

단점

  • 로드밸런서가 배포환경에서 제공되어야 한다.
  • 서비스 디스커버리가 죽으면 전체 시스템이 동작하지 않으므로, 고가용성 등 더 많은 관리가 필요하다.

 



[출처]

https://futurecreator.github.io/2018/10/18/service-discovery-in-microservices/

 

마이크로서비스 Microservices (4) 서비스 디스커버리

서비스 디스커버리 REST API 를 이용해서 다른 서비스를 호출한다고 해봅시다. 요청을 보내기 위해서는 서비스 인스턴스가 있는 곳의 네트워크 정보를 알아야 합니다. IP 주소와 포트 정보가 되겠

futurecreator.github.io

https://bcho.tistory.com/1252

 

MSA에서 Service discovery 패턴

MSA에서 Service discovery 패턴의 이해 조대협 (http://bcho.tistory.com) MSA와 같은 분산 환경은 서비스 간의 원격 호출로 구성이 된다. 원격 서비스 호출은 IP 주소와 포트를 이용하는 방식이 되는다. 클라

bcho.tistory.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ithink3366&logNo=221368902485

 

[Service Discovery] Service Discovery 란?

MSA 아키텍처에서 왜 Service Discovery를 사용할까? Cloud 환경에서는 Auto-scaling, 업그레이드, ...

blog.naver.com

https://mangchhe.github.io/springcloud/2021/04/07/ServiceDiscoveryConcept/

 

[Spring Cloud] Service Discovery란?

Service Discovery가 왜 필요한지, Service Discovery의 종류와 구현 방법에 대해서 배워보자

mangchhe.github.io

 

댓글