Kubernetes Probe 3종류, 왜 나눠져 있는가
Kubernetes Probe 3종류가 항상 헷갈린다. StartupProbe, ReadinessProbe, LivenessProbe. 왜 3개로 나눠져 있고, 언제 어떤 걸 써야 할까?
| Probe | 질문 | 실패 시 |
|---|---|---|
| StartupProbe | “앱 시작 끝났어?” | 계속 대기 (다른 Probe 차단) |
| ReadinessProbe | “트래픽 받을 수 있어?” | Service에서 제외 (트래픽 차단) |
| LivenessProbe | “죽은 거 아니야?” | Pod 재시작 |
flowchart LR
subgraph Probes["Probe 역할"]
Startup[StartupProbe<br/>시작 완료?]
Readiness[ReadinessProbe<br/>트래픽 OK?]
Liveness[LivenessProbe<br/>살아있어?]
end
subgraph Actions["실패 시 동작"]
Wait[대기]
Remove[Service에서 제외]
Restart[Pod 재시작]
end
Startup -->|실패| Wait
Readiness -->|실패| Remove
Liveness -->|실패| Restart
style Startup fill:#74c0fc,color:#000
style Readiness fill:#69db7c,color:#000
style Liveness fill:#ff8787,color:#000
StartupProbe → 시작할 때만 (1회성)
ReadinessProbe → 트래픽 On/Off (반복)
LivenessProbe → 죽으면 재시작 (반복)
JVM 애플리케이션은 시작이 느리다. Spring Boot + DB 연결까지 1~2분 걸리기도 한다.
|
|
문제:
- 시작할 때는 2분 기다려줌 ✓
- 운영 중 장애 감지도 2분 걸림 ✗
앱이 죽어도 2분간 모른다.
|
|
StartupProbe가 성공하기 전까지 다른 Probe는 실행되지 않는다.
sequenceDiagram
participant K as Kubernetes
participant P as Pod
K->>P: StartupProbe 시작
loop 시작 중
P-->>K: 실패 (아직 준비 안 됨)
end
P-->>K: 성공!
Note over K,P: 이제부터 Readiness/Liveness 시작
K->>P: ReadinessProbe
K->>P: LivenessProbe
언제 사용:
- JVM, .NET 등 시작 느린 앱
- 초기화에 오래 걸리는 앱
|
|
언제 사용:
- 거의 모든 앱에 권장
- 일시적으로 요청을 못 받는 상황 대응
실패하면:
- Service endpoint에서 제외
- 트래픽이 다른 Pod로 분산
|
|
예시 상황:
- DB 연결 끊김 → ReadinessProbe 실패 → 트래픽 차단
- DB 복구 → ReadinessProbe 성공 → 트래픽 복구
Pod 재시작 없이 트래픽만 제어한다.
언제 사용:
- 앱이 완전히 멈출 수 있는 경우 (데드락 등)
- 신중하게 사용!
실패하면:
- Pod 재시작
|
|
LivenessProbe를 잘못 설정하면 재시작 폭풍이 발생할 수 있다.
|
|
시나리오:
- 트래픽 증가로 응답이 살짝 느려짐
- LivenessProbe 1초 타임아웃 → 실패
- Pod 재시작
- 다른 Pod에 부하 전가
- 또 타임아웃 → 또 재시작
- 재시작 폭풍
flowchart LR
A[부하 증가] --> B[응답 지연]
B --> C[LivenessProbe 실패]
C --> D[Pod 재시작]
D --> E[다른 Pod에 부하 전가]
E --> B
style C fill:#ff6b6b,color:#fff
style D fill:#ff6b6b,color:#fff
|
|
핵심:
- LivenessProbe는 단순하게 - “앱이 살아있나?“만 확인
- DB 연결 체크 같은 건 ReadinessProbe에서
Probe마다 다른 엔드포인트를 사용하는 것이 좋다.
| Probe | 엔드포인트 | 체크 내용 |
|---|---|---|
| StartupProbe | /startup |
초기화 완료 (DB 연결 등) |
| ReadinessProbe | /ready |
요청 처리 가능 여부 |
| LivenessProbe | /health |
앱이 살아있는지 (단순) |
|
|
| 상황 | StartupProbe | ReadinessProbe | LivenessProbe |
|---|---|---|---|
| JVM 등 시작 느린 앱 | ✓ | ✓ | 선택 |
| 일반 웹 앱 | - | ✓ | 선택 |
| 데드락 가능성 있는 앱 | - | ✓ | ✓ |
| 단순 앱 (죽거나 살거나) | - | - | - |
권장 조합:
- 대부분의 경우: ReadinessProbe
- JVM 앱: StartupProbe + ReadinessProbe
- LivenessProbe: 정말 필요한 경우만
- StartupProbe - 시작 대기용, 1회성
- ReadinessProbe - 트래픽 제어, 거의 필수
- LivenessProbe - 재시작용, 신중하게 사용
기억할 것:
- LivenessProbe는 단순하게, 타임아웃은 여유있게
- 복잡한 체크는 ReadinessProbe에서
- 3개 다 쓸 필요 없음, 상황에 맞게 선택