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상태가 변경되는 절차
- Registering listeners and initializers
- Preparing the Environment
- Preparing the ApplicationContext
- Loading bean definitions
- Changing the liveness state to CORRECT
- Calling the application and command-line runners
- 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/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
'IT Knowledge > 기타' 카테고리의 다른 글
LDAPS error "java.security.cert.CertificateException: No subject alternative DNS name matching ip address found" (0) | 2024.07.10 |
---|---|
Linux 오픈 가능한 파일 수 설정 및 확인 (0) | 2024.06.02 |
RockyOS IPv6 Disable 방법 (0) | 2024.05.30 |
데이터 통합 프로세스(ETL vs ELT) (0) | 2024.05.20 |
RockyOS Chrony(feat. ntpdate) (0) | 2023.09.12 |
댓글