@GetMapping("second-service/check")
public String checkSecond(){
return "Hi, there, second check";
}
@GetMapping("first-service/check")
public String checkFirst(){
return "Hi, there, first check";
}
MSA의 개발, 배포, 운영에 필요한 아키텍쳐를 쉽게 구성할 수 있도록 지원하는 Spring Boot 기반 프레임워크
분산 시스템 상에 필요한 여러 패턴들을 표준 패턴화 시켜 손쉽게 개발할 수 있도록 지원함
어떤 서비스가 사용되어야 할까?
Spring Cloud Config Server
환경 설정관리를 위함
다양한 마이크로서비스에서 사용하는 정보를 SpringCloudConfigServer를 통해 외부의 저장소에 저장할 수 있다.
유지보수성이 높아진다.
Location transparency
서비스 등록과 위치정보 확인 Naming Server(Eureka)
Load Distribution(Load Balancing)
Ribbon (Client Side)
Spring Cloud Gateway(권장)
Easier REST Clients
각각의 서비스가 데이터를 주고 받는 방법(RestTemplate , Feign Client)
Visibility and monitoring
ELK 등등 (로그 추적 및 모니터링)
Fault Tolerance
Hystrix
서비스의 지연과 장애에 대해 내성을 갖게 해주는 라이브러리
Spring Cloud Netflix Eureka
Service Discovery
외부에서 다른 서비스들이 마이크로 서비스를 검색하기 위해 사용되는 일종의 전화번호책이다.
API gateway에다가 요청을 보내고 요청 정보가 서비스 디스커버리에 전달되어 필요한 서비스의 위치를 알려준다.
Eureka 서버 구동 확인 및 application.yml
server:
port: 8761
spring:
application:
name: discoveryservice
eureka:
# 이 설정의 default가 true -> 자기 자신을 전화번호부에 등록하는 것은 의미 없는 행위
client:
register-with-eureka: false
fetch-registry: false
Eureka 서버에 등록된 userService 구동 확인 및 application.yml
server:
port: 9001
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
# Eureka 서버로 부터 인스턴스들의 정보를 주기적으로 가져올 것인지
# 설정하는 속성 -> fetch-registry = true 갱신 된 정보를 받겠다는 설정
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
같은 서비스를 하나 더 띄워보자
application.yml 파일 내부의 port설정을 동적으로 추가해주는 코드를 넣고
edit configurations에서 환경변수를 추가해주어야 한다
그렇지 않으면 포트번호가 겹치게 되어 실행 오류가 남
server:
port: ${PORT}
spring:
application:
name: user-service
eureka:
client:
register-with-eureka: true
# Eureka 서버로 부터 인스턴스들의 정보를 주기적으로 가져올 것인지
# 설정하는 속성 -> fetch-registry = true 갱신 된 정보를 받겠다는 설정
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
server:
# 0의 의미 랜덤 포트를 사용하겠다는 의미! 포트 충돌을 의식하지 않아도 되는 장점이 있다.
port: 0
spring:
application:
name: user-service
eureka:
############해당 설정 ###############
instance:
instance-id: ${spring.cloud.client.hostname}:${spring.application.instance_id:${random.value}}
############해당 설정 ###############
client:
register-with-eureka: true
# Eureka 서버로 부터 인스턴스들의 정보를 주기적으로 가져올 것인지
# 설정하는 속성 -> fetch-registry = true 갱신 된 정보를 받겠다는 설정
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:8761/eureka
사용자는 작업을 kubuctl을 통해서 컨트롤 플레인에게 api 호출만 해주면 된다. 실제 컨테이너가 동작하는 위치는 노드의 파드 단위로 배포되어 동작한다.
컨트롤 플레인
kube-APIserver
클러스터의 모든 명령을 수락하는 진입점
etcd
클러스터의 상태를 안정적으로 저장하는 역할(키밸류형태로 저장)
kube-scheduler
파드를 노드에 예약하는 역할
파드를 분산하고 어디에 배포하면 좋을지 정해주는 역할
kube-controller-manager
상태를 지속적으로 모니터링하고 바람직한 상태를 달성하기 위해 변경을 시도
kube-cloud-manager
클라우드 제공업체와 상호작용하는 컨트롤러를 관리
노드
kubelet
컨테이너 런타임을 사용하여 파드를 시작
kube-proxy
클러스터의 파드 간에 네트워크 연결을 유지
왜 파드 단위로 배포를 할까?
애플리케이션이 동작을 하고 있고 동작하면서 어떤 작업을 했는지 로그 등이 남는다고 했을때 다른 컨테이너는 로그를 전송해서 수집하는 작업을 할 수 있다.
마치 파드를 가상의 서버 같은 것이라고 생각을 하면 된다.!
공유된 스토리지를 할 수 있고, 통신을 별도의 인터페이스 없이 할 수 있다.
GCP 실습해보기
create cluster
Autopilot
클라우드측에서 데이터 플레인 마저 숨기게 된다.
띄운 파드만큼만 과금이 된다.
Standard
클라우드측에서 컨트롤 플레인에 대한 부분은 숨겨놓는다. 접근 불가!
접근 가능한 곳은 데이터 플레인
노드당 과금이 일어난다.
노드들을 사용자가 관리한다.
파드가 떠있건 말건 노드가 떠있으면 과금이된다.
실습을 위해 스탠다드 선택!
location type
Zonal
zone
쿠버네티스 클러스터 내에서 물리적으로 분리된 영역을 의미. 예를 들어, 클라우드 제공 업체(GCP, AWS 등)에서 제공하는 가용 영역(Availability Zone)과 비슷한 개념입니다. 하나의 클러스터 내에서 여러 개의 Zone을 사용하여 고가용성(High Availability)을 보장할 수 있다.
Regional
컨트롤 플레인이 삼중화가 된다.
Region
클러스터를 호스팅하는 물리적인 지역을 의미. 예를 들어, GCP의 us-central1, asia-northeast1 등과 같은 지역 개념. 여러 개의 클러스터를 하나의 Region에서 운영할 수 있으며, 이는 지리적으로 분산된 애플리케이션을 구성하는 데 유용하다.
노드가 3개가 뜬 것을 확인할 수 있다! 컨트롤 플레인은 보이지 않고 사용자는 컨트롤 플레인의 apiServer에게 명령만 할 수 있다.
SDN
**SDN(Software Defined Network)**이란 소프트웨어를 통해 네트워크 리소스를 가상화하고 추상화하는 네트워크 인프라에 대한 접근 방식을 의미한다.
조금 더 쉽게 설명하자면, 소프트웨어 애플리케이션과 API를 이용하여 네트워크를 프로그래밍하고, 중앙에서 전체 네트워크를 제어하고 관리하는 것이다.
Pod
배포 가능한 가장 작은 쿠버네티스 객체
공유된 네트워킹, 공유된 스토리지를 사용한다.
마치 하나의 pc같다. 컨테이너는 프로그램(엑셀, 등등) 필요한 프로그램이 논리적인 단위로 묶여있는 형태