TIL

Spring Boot — Kubernetes Probes

Application Availability — liveness / readiness 상태 모델

상태 enum 값 의미 실패 시 K8s 반응
Liveness CORRECT / BROKEN 앱 내부 상태가 정상 동작 가능한가. BROKEN = 스스로 복구 불가 인스턴스 재시작
Readiness ACCEPTING_TRAFFIC / REFUSING_TRAFFIC 지금 트래픽을 받을 수 있는가 트래픽 라우팅 중단 (재시작 X)

Probe 엔드포인트로 노출

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

상태를 코드로 읽기·바꾸기

// 변경 발행 — 복구 불가 상황 감지 시 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 삭제 */ }
    }
}

애플리케이션 lifecycle과 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)