쿠버네티스는 컨테이너의 상태를 모니터링하고 관리하기 위해 세 가지 유형의 Health Probe를 제공합니다:
Startup Probe: 컨테이너가 시작되었는지 확인
Liveness Probe: 컨테이너가 정상적으로 실행 중인지 확인
Readiness Probe: 컨테이너가 트래픽을 받을 준비가 되었는지 확인
Probe 메커니즘
모든 Probe는 다음 세 가지 방식 중 하나로 동작합니다:
1. HTTP GET 요청
httpGet: path:/healthz port:8080 httpHeaders: -name:Custom-Header value:Awesome scheme:HTTP# or HTTPS
지정된 경로로 HTTP GET 요청을 보냅니다
200-399 범위의 상태 코드를 반환하면 성공
그 외의 코드는 실패로 간주
2. TCP Socket 연결
tcpSocket: port:8080
지정된 포트로 TCP 연결을 시도합니다
연결이 성공하면 성공
연결이 실패하면 실패로 간주
3. Exec 명령 실행
exec: command: -cat -/tmp/healthy
컨테이너 내부에서 명령을 실행합니다
Exit code 0을 반환하면 성공
그 외의 코드는 실패로 간주
Probe 공통 설정
모든 Probe에서 사용할 수 있는 공통 파라미터:
initialDelaySeconds:0# 컨테이너 시작 후 probe 시작 전 대기 시간 (기본: 0초) periodSeconds:10# probe 실행 간격 (기본: 10초) timeoutSeconds:1# probe 타임아웃 시간 (기본: 1초) successThreshold:1# 실패 후 성공으로 간주하기 위한 연속 성공 횟수 (기본: 1) failureThreshold:3# 성공 후 실패로 간주하기 위한 연속 실패 횟수 (기본: 3)
📍 1. Startup Probe - 기동은 끝났니?
목적
컨테이너 애플리케이션이 시작되었는지 확인
시작이 느린 애플리케이션(레거시 애플리케이션 등)을 보호
특징
Startup Probe가 성공하기 전까지 Liveness와 Readiness Probe는 비활성화됩니다
Startup Probe가 실패하면 kubelet이 컨테이너를 종료하고 재시작 정책에 따라 처리합니다
Startup Probe는 한 번만 성공하면 더 이상 실행되지 않습니다
사용 시나리오
시작 시간이 오래 걸리는 애플리케이션 (예: JVM 기반 애플리케이션)
초기화 작업이 많은 애플리케이션
데이터베이스 마이그레이션이 필요한 애플리케이션
예제
apiVersion:v1 kind:Pod metadata: name:startup-probe-example spec: containers: -name:app image:myapp:latest ports: -containerPort:8080 startupProbe: httpGet: path:/startup port:8080 initialDelaySeconds:0 periodSeconds:10 failureThreshold:30# 최대 300초(10초 * 30회) 동안 시작 대기 successThreshold:1 timeoutSeconds:1
위 예제에서:
10초마다 /startup 엔드포인트를 확인
최대 300초(30번 실패)까지 시작을 기다립니다
1번 성공하면 애플리케이션이 시작된 것으로 간주
📍 2. Liveness Probe - 살아있니?
목적
컨테이너가 정상적으로 실행 중인지 확인
데드락, 무한 루프 등으로 응답하지 않는 컨테이너를 감지
특징
Liveness Probe가 실패하면 kubelet이 컨테이너를 종료하고 재시작 정책에 따라 처리합니다
# Startup Probe: 애플리케이션이 시작될 때까지 최대 5분 대기 startupProbe: httpGet: path:/startup port:8080 periodSeconds:10 failureThreshold:30
# Liveness Probe: 애플리케이션이 살아있는지 확인 livenessProbe: httpGet: path:/health port:8080 initialDelaySeconds:0# startup probe가 끝나면 바로 시작 periodSeconds:10 failureThreshold:3 timeoutSeconds:5
# Readiness Probe: 트래픽을 받을 준비가 되었는지 확인 readinessProbe: httpGet: path:/ready port:8080 initialDelaySeconds:0 periodSeconds:5 failureThreshold:3 successThreshold:1
Probe 동작 흐름
컨테이너 시작 ↓ Startup Probe 실행 (성공할 때까지) ↓ Liveness Probe 활성화 (주기적으로 실행) Readiness Probe 활성화 (주기적으로 실행) ↓ ┌─────────────────────────────────────┐ │ Liveness 실패 → 컨테이너 재시작 │ │ Readiness 실패 → Service에서 제거 │ └─────────────────────────────────────┘
Spring Boot 애플리케이션 예제
Spring Boot 2.3+ 버전은 기본적으로 Health Endpoint를 제공합니다: