Kubernetes ‐ Probe - thought-corner/Backend-PlayGround GitHub Wiki
Probe
- 쿠버네티스에서 Probe는 컨테이너의 헬스를 주기적으로 진단하는 헬스체크 메커니즘이다.
kubelet은 컨테이너가 정상적으로 작동 중인지, 트래픽을 받을 수 있는지 확인하기 위해 4가지 핸들러를 사용해 진단을 수행한다.
Probe 유형 및 비교
| Probe 종류 |
핵심 역할 (Purpose) |
실패 시 조치 (Action) |
주요 유스케이스 |
| Startup Probe |
애플리케이션의 초기 구동이 완전히 완료되었는지 확인 |
컨테이너 재시작 (restartPolicy 적용) |
Spring Boot처럼 초기 구동 시 무거운 캐시 로딩이나 컨텍스트 초기화로 인해 구동 시간이 오래 걸리는 앱 보호 |
| Liveness Probe |
컨테이너가 살아있는 상태(정상 동작 중)인지 감시 |
컨테이너 재시작 (restartPolicy 적용) |
애플리케이션이 실행 중이나 메인 스레드 데드락(Deadlock), 무한 루프 등에 빠져 응답 불능인 상태 구출 |
| Readiness Probe |
컨테이너가 유저 트래픽을 받을 준비가 되었는지 실시간 확인 |
Service 엔드포인트에서 제외 (트래픽 라우팅만 차단) |
대규모 캐시 리로드, DB 커넥션 일시 단절, 순간적인 과부하(Overload) 등으로 트래픽 처리가 불가능한 상태 대응 |
Probe 유기적 라이프사이클 흐름
- Pod가 생성되면 가장 먼저 Startup Probe가 구동된다.
- Startup Probe가 성공하기 전까지 Liveness와 Readiness Probe는 완전히 비활성화된다.
- Startup Probe가 한 번 성공하면 역할을 마치고 종료되며, 이후 Liveiness와 Readiness가 동시에 활성화되어 주기적으로 컨테이너를 검사한다.
Probe의 4가지 검사 메커니즘
httpGet : 지정한 포트와 경로로 HTTP GET 요청을 전송. HTTP 상태 코드가 200 이상 400 미만이면 성공으로 간주
tcpSocket : 지정한 포트로 TCP 연결을 시도. 포트가 열려 있으면 성공으로 간주
exec : 컨테이너 내부에서 특정 명령어를 직접 실행. 명령어 종료 코드가 0이면 성공으로 간주
grpc : gRPC 프로토콜을 사용하는 애플리케이션을 위한 메커니즘. gRPC 헬스 체크 프로토콜의 응답 상태를 확인
정밀 제어를 위한 설정 파라미터
initialDelaySeconds: 5 # 컨테이너 시작 후 최초 Probe를 보낼 때까지 대기 시간 (기본값 0)
periodSeconds: 10 # Probe를 수행하는 주기 (기본값 10)
timeoutSeconds: 1 # 응답을 기다리는 제한 시간. 초과 시 실패 (기본값 1)
successThreshold: 1 # 실패 상태에서 몇 번 연속 성공해야 정상 전환할지 (기본값 1)
failureThreshold: 3 # 몇 번 연속 실패해야 최종 실패로 판단하고 액션을 취할지 (기본값 3)
Liveiness와 Readiness의 엔드포인트 분리
- Liveiness : 앱 프로세스 생존 여부만 체크하는 가벼운 엔드포인트
- Readiness : DB 연결. 주변 인프라 상태까지 확인하는 엄격한 엔드포인트
Startup Probe 패턴 활용
- 무거운 앱의 구동을 기다리기 위해 Liveness의
initialDelaySeconds를 길게 잡았고 이 방식은 앱이 완전히 켜진 후 실제 데드락이 걸렸을 때 감지 지연을 유발한다.
- Startup Probe를 넉넉하게 설정하고 Liveness는 타이트하고 민감하게 설정하여 가동 이후 대응력을 높인다.
표준 가이드라인
apiVersion: v1
kind: Pod
metadata:
name: backend-app
spec:
containers:
- name: main-container
image: backend-service:latest
ports:
- name: liveness-port
containerPort: 8080
# 1. 초기 구동 단계 방어벽 (최대 300초 동안 켜지길 기다려줌)
startupProbe:
httpGet:
path: /live
port: liveness-port
failureThreshold: 30
periodSeconds: 10
# 2. 구동 완류 후, 프로세스 데드락 감시 (단 1번이라도 실패하면 즉시 재시작)
livenessProbe:
httpGet:
path: /live
port: liveness-port
failureThreshold: 1
periodSeconds: 10
# 3. 구동 완료 후, 실제 트래픽 유입 가능 여부 실시간 감시 (실패 시 라우팅 차단)
readinessProbe:
httpGet:
path: /ready
port: liveness-port
failureThreshold: 3
periodSeconds: 10