IT Knowledge/기타

Spring Boot EndPoint(Liveness, Readiness) 활용

Seok. 2024. 8. 12. 17:54
반응형

SpringBoot 2.3 부터 Kubernetes Probe 통합되어서, Cloud Native 경험을 만들 있는 방법이 추가 되었습니다.

 

방법은?

Kubernetes LivenessProbe ReadinessProbe 있는데,

SpringBoot 2.3부터 liveness Readiness 상태를 EndPoints 노출할 있게 되었습니다.

EndPoints
/actuator/health/liveness
/actuator/health/readiness

 

이를 통해 Kubernetes에서 아래와 같이 Probe 활용할 있습니다.

livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 18080
  initialDelaySeconds: 60
  timeoutSeconds: 60
  periodSeconds: 20

 

그러면, SpringBoot에서 Liveness,Readiness 사용하려면?

Application.properties에서 수동으로 enable 해주어야 합니다.

SpingBoot 2.3.0~2.3.1 SpringBoot 2.3.2 이상
management.health.probes.enabled=true management.endpoint.health.probes.enabled=true
management.health.livenessState.enabled=true
management.health.readinessState.enabled=true

management.endpoint.health.proves.enabled=true의경우수동 설정도 가능하며,

Kubernetes deployment 환경변수 "*_SERVICE_HOST" "*_SERVICE_PORT" 세팅되어 있는경우, Auto-detects 하여, 자동 활성화 합니다.

 

[Application LifeCycle Probe 상태]

Kubernetes Probes 지원시에 가장 중요한 부분은 어플리케이션 LifeCycle과의 "일관성(Consistency)"입니다.

어플리케이션 LifeCycle 따라, 어플리케이션 내부의 상태(AvailabilityState) 실제 Probe 사이에 차이가 있을 있습니다.

 

SpringBoot 시작 종료될때,

Application Events Publish 하고 Probe들은 이를 수신하여 AvailabilityState 정보를 노출 있습니다.

아래는 다양한 단계에서 AvailabilityState HTTP Connector 상태를 보여줍니다.

 

Spring Boot application 시작 :

Startup phase LivenessState ReadinessState HTTP server Notes
Starting BROKEN REFUSING_TRAFFIC Not started Kubernetes checks the "liveness" Probe and restarts the application if it takes too long.
Started CORRECT REFUSING_TRAFFIC Refuses requests The application context is refreshed. The application performs startup tasks and does not receive traffic yet.
Ready CORRECT ACCEPTING_TRAFFIC Accepts requests Startup tasks are finished. The application is receiving traffic.

* 만약, Application 기동되는데 시간이 너무 오래 걸리면, Kubernetes "Liveness" 체크하고, 재기동시켜버릴 있다.

 

Spring Boot application 종료 :

Shutdown phase Liveness State Readiness State HTTP server Notes
Running CORRECT ACCEPTING_TRAFFIC Accepts requests Shutdown has been requested.
Graceful
shutdown
CORRECT REFUSING_TRAFFIC New requests are rejected If enabled, graceful shutdown processes in-flight requests.
Shutdown complete N/A N/A Server is shut down The application context is closed and the application is shut down.

 

 

[Liveness and Readiness State Transitions]

Spring Boot 2가지의 Enums 상태로 Liveness Readiness 상태를 캡슐화(Encapsulate) 합니다.

For readiness state, there is an enum called ReadinessState with the following values:

  • ACCEPTING_TRAFFIC : 어플리케이션이 트래픽을 허용할 준비가 되었음.
  • REFUSING_TRAFFIC : 어플리케이션이 아직 어떤 요청도 수락하지 않으려 한다는 의미

the LivenessState enum represents the liveness state of the app with two values:

  • The CORRECT : 어플리케이션이 실행중이고 내부 상태가 올바르다는 의미
  • the BROKEN : 어플리케이션이 치명적인 오류로 실행중임을 의미

 

어플리케이션 Lifecycle 따라 liveness readiness상태가 변경되는 절차

  1. Registering listeners and initializers
  2. Preparing the Environment
  3. Preparing the ApplicationContext
  4. Loading bean definitions
  5. Changing the liveness state to CORRECT
  6. Calling the application and command-line runners
  7. Changing the readiness state to ACCEPTING_TRAFFIC

어플리케이션이 실행되고 나면, 우리는 AvailabilityChangeEvents 통해서 적절한 상태를 변경하여 게시할 있습니다.

 

[Application Availability 관리]

Application Running 상태에서 Application Availability 관리하며,

liveness&readiness state Update 있습니다.

Update 위한 자세한 구현 방법은 개발자에게 맡겨두고,

DevOps "liveness&readiness State 결정하기 위한 조건" 집중하기를 권고합니다.

자세한 구현방법 예시 : (https://www.baeldung.com/spring-liveness-readiness-probes)

 

Liveness State

"Liveness" State 어플리케이션 내부 상태가 올바르게 작동할 있는지 or 실패하고 있는 경우 스스로 복구할 있는지는 알려줍니다.

(Broken Liveness State 어플리케이션 복구를 없어서, 인프라에서 재시작을 해줘야 함을 의미합니다. )

주의사항
일반적으로
"Liveness" state는 Application 외부의 검색에 기반해서는 안됩니다. 예를 들어 외부시스템(DB, WEB API, Cache…) 의해 실패가 결정된다면, 대규모 재시작 or 연쇄적인 재시작 사태가 나올 있습니다.

 

The internal state of Spring Boot applications is mostly represented by the Spring ApplicationContext

 

 

Readiness State

"Readiness" State 어플리케이션이 Traffic 처리할 준비가 되었는지를 알려줍니다.

만약 "Readiness" 상태가 Fail인경우 K8s에서 트래픽을 라우팅 해주지 말아야 합니다.

일반적으로 Application 실행될때나 or 트래픽이 커져서 너무 바쁘다고 판단하는 경우 발생합니다.

 

이와 같이 외부시스템 상태에 의한 결정은 Liveness 보다는 Readiness 판단에 영향을 주는 것이 좋습니다.

예를 들면, 서비스별로 원하는 결과를 Return 없을때

Readiness "REFUSING_TRAFFIC" 상태로 변경하여 관리하기를 권장합니다.

(DB 연결 상태, 트래픽의 처리상태, 유관시스템의 서비스 상태 등…)

management.endpoint.health.group.readiness.include=readinessState,customCheck

 

https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints.kubernetes-probes.external-state

 

 


 

[참고]

https://docs.spring.io/spring-boot/reference/actuator/endpoints.html#actuator.endpoints.health.writing-custom-health-indicators

 

https://docs.spring.io/spring-boot/reference/features/spring-application.html#features.spring-application.application-availability.liveness

https://docs.spring.io/spring-boot/reference/features/spring-application.html#features.spring-application.application-availability.readiness

 

https://docs.spring.io/spring-boot/reference/features/spring-application.html#features.spring-application.application-events-and-listeners

 

https://docs.spring.io/spring-boot/how-to/deployment/cloud.html#howto.deployment.cloud.kubernetes

 

https://www.baeldung.com/spring-liveness-readiness-probes

 

https://dev.to/sabyasachi/inside-spring-boot-health-endpoint-2mej

반응형