ApplicationAvailability 빈을 주입해 조회 가능| 상태 | enum 값 | 의미 | 실패 시 K8s 반응 |
|---|---|---|---|
| Liveness | CORRECT / BROKEN |
앱 내부 상태가 정상 동작 가능한가. BROKEN = 스스로 복구 불가 |
인스턴스 재시작 |
| Readiness | ACCEPTING_TRAFFIC / REFUSING_TRAFFIC |
지금 트래픽을 받을 수 있는가 | 트래픽 라우팅 중단 (재시작 X) |
ApplicationContext — context refresh가 성공하면 live로 간주CommandLineRunner·ApplicationRunner까지 모두 끝나야 ready → 기동 초기화 작업은 @PostConstruct가 아니라 runner에 두라는 권장이 여기서 나옴KUBERNETES_SERVICE_HOST 등 환경변수 자동 감지, 또는 spring.main.cloud-platform=kubernetes로 강제) health group 자동 활성화
/actuator/health/liveness ← LivenessStateHealthIndicator/actuator/health/readiness ← ReadinessStateHealthIndicator/actuator/health에도 포함됨port는 actuator가 뜬 포트(management.server.port 설정 시 그 포트)livenessProbe:
httpGet: { path: /actuator/health/liveness, port: <actuator-port> }
readinessProbe:
httpGet: { path: /actuator/health/readiness, port: <actuator-port> }
management.endpoint.health.probes.add-additional-paths=true # liveness=/livez, readiness=/readyz
ApplicationAvailability 빈 주입 후 getLivenessState() / getReadinessState()AvailabilityChangeEvent.publish(...)로 새 상태 발행@EventListener로 AvailabilityChangeEvent<...> 구독// 변경 발행 — 복구 불가 상황 감지 시 liveness를 BROKEN으로 (→ K8s가 재시작)
catch (CacheCompletelyBrokenException ex) {
// eventPublisher = 주입된 ApplicationEventPublisher
AvailabilityChangeEvent.publish(eventPublisher, ex, LivenessState.BROKEN);
}
// 변경 수신 — readiness 전이를 파일로 export (K8s exec probe 연동 예시)
@EventListener
void onChange(AvailabilityChangeEvent<ReadinessState> event) {
switch (event.getState()) {
case ACCEPTING_TRAFFIC -> { /* /tmp/healthy 생성 */ }
case REFUSING_TRAFFIC -> { /* /tmp/healthy 삭제 */ }
}
}
AvailabilityState)와 실제 노출되는 probe는 별개 — lifecycle 단계에 따라 probe가 아직 안 떠 있을 수 있음. Spring이 startup·shutdown 이벤트를 발행하고 probe가 이를 반영| 단계 | Liveness | Readiness | HTTP 서버 | 비고 |
|---|---|---|---|---|
| Starting | BROKEN |
REFUSING_TRAFFIC |
미기동 | 너무 오래 걸리면 K8s가 liveness 보고 재시작 |
| Started | CORRECT |
REFUSING_TRAFFIC |
요청 거부 | context refresh 완료, startup 작업 수행 중 |
| Ready | CORRECT |
ACCEPTING_TRAFFIC |
요청 수락 | runner까지 완료, 트래픽 수신 시작 |
| 단계 | Liveness | Readiness | HTTP 서버 | 비고 |
|---|---|---|---|---|
| Running | CORRECT |
ACCEPTING_TRAFFIC |
요청 수락 | shutdown 요청 접수 |
| Graceful shutdown | CORRECT |
REFUSING_TRAFFIC |
새 요청 거부 | in-flight 요청만 마저 처리 (graceful shutdown은 이후 별도 정리) |
| 설정 키 | 용도 |
|---|---|
management.endpoint.health.probes.enabled |
liveness·readiness health group on/off (K8s 감지 시 자동 on) |
management.health.livenessstate.enabled / ...readinessstate.enabled |
개별 health indicator on/off |
management.endpoint.health.probes.add-additional-paths |
메인 서버 포트에 /livez·/readyz 추가 노출 |
management.endpoint.health.group.readiness.include |
readiness 그룹에 커스텀 indicator 추가 (예: readinessState,customCheck) |