전체 비유: 아파트 안전 점검#

헬스 체크를 아파트 안전 점검에 비유하면 이해하기 쉽습니다:

아파트 점검 비유Kubernetes역할
정기 안전 점검Health Check애플리케이션 상태 확인
“살아 계신가요?” 확인Liveness Probe컨테이너 생존 확인
“손님 받을 준비 됐나요?”Readiness Probe트래픽 수신 준비 확인
“이사 완료됐나요?”Startup Probe시작 완료 여부 확인
응답 없으면 119 호출Liveness 실패 → 재시작컨테이너 재시작
바쁘면 손님 안 받음Readiness 실패 → 트래픽 제외Service에서 제외
이사 중이면 기다림Startup 진행 중다른 Probe 비활성화
초인종 눌러서 확인HTTP ProbeHTTP 엔드포인트 체크
전화해서 확인TCP Probe포트 연결 체크
가스 점검 (직접 확인)Exec Probe명령어 실행 체크

이처럼 Probe는 “관리인이 주기적으로 세대를 방문하여 상태를 확인"하는 것과 같습니다.


대상 독자: Kubernetes에서 애플리케이션 상태를 모니터링하고 싶은 백엔드 개발자 선수 지식: Pod, Deployment 개념 소요 시간: 약 25-30분 이 문서를 읽으면: Liveness, Readiness, Startup Probe의 차이와 설정 방법을 이해할 수 있습니다

TL;DR
  • Liveness Probe: 컨테이너가 살아있는지 확인, 실패 시 재시작
  • Readiness Probe: 트래픽을 받을 준비가 되었는지 확인, 실패 시 서비스에서 제외
  • Startup Probe: 시작 완료 여부 확인, 완료 전까지 다른 Probe 비활성화

왜 헬스 체크가 필요한가?#

컨테이너가 실행 중(Running)이라고 해서 애플리케이션이 정상인 것은 아닙니다.

상황컨테이너 상태실제 상태
데드락 발생Running응답 불가
DB 연결 끊김Running서비스 불가
시작 중Running준비 안 됨
메모리 부족Running느린 응답

헬스 체크를 통해 이러한 상황을 감지하고 자동으로 대응할 수 있습니다.

Probe 유형 비교#

flowchart TB
    subgraph Probes
        LP[Liveness Probe<br>죽었니?]
        RP[Readiness Probe<br>준비됐니?]
        SP[Startup Probe<br>시작됐니?]
    end

    LP -->|실패| RESTART[컨테이너 재시작]
    RP -->|실패| REMOVE[서비스에서 제외]
    SP -->|실패| WAIT[대기 계속]

각 Probe의 특징을 비교하면 다음과 같습니다.

Probe질문실패 시 동작사용 시점
Liveness살아있니?컨테이너 재시작항상
Readiness준비됐니?서비스에서 제외항상
Startup시작됐니?대기시작 시에만

Liveness Probe#

애플리케이션이 정상적으로 동작하는지 확인합니다. 실패하면 kubelet이 컨테이너를 재시작합니다.

HTTP 체크#

apiVersion: v1
kind: Pod
metadata:
  name: liveness-http
spec:
  containers:
  - name: app
    image: my-app:1.0
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
      timeoutSeconds: 5
      failureThreshold: 3

TCP 체크#

포트가 열려있는지 확인합니다.

livenessProbe:
  tcpSocket:
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20

명령 실행 체크#

livenessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

Probe 설정 값#

설정기본값설명
initialDelaySeconds0첫 체크까지 대기 시간
periodSeconds10체크 간격
timeoutSeconds1응답 대기 시간
successThreshold1성공으로 판단하기 위한 연속 성공 횟수
failureThreshold3실패로 판단하기 위한 연속 실패 횟수

Readiness Probe#

애플리케이션이 트래픽을 받을 준비가 되었는지 확인합니다. 실패하면 Service의 Endpoints에서 제외됩니다.

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  failureThreshold: 3

Readiness vs Liveness#

상황ReadinessLiveness
DB 연결 끊김실패 (트래픽 제외)성공 (재시작 불필요)
설정 로드 중실패 (준비 안 됨)성공 (정상 동작 중)
데드락실패실패 (재시작 필요)
flowchart LR
    SVC[Service] --> EP[Endpoints]
    EP --> P1[Pod 1 ✓ Ready]
    EP --> P2[Pod 2 ✓ Ready]
    EP -.-x P3[Pod 3 ✗ Not Ready]

Startup Probe#

애플리케이션 시작에 오래 걸리는 경우 사용합니다. Startup Probe가 성공할 때까지 Liveness/Readiness Probe는 비활성화됩니다.

startupProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 10
  periodSeconds: 10
  failureThreshold: 30  # 최대 5분 대기 (10초 × 30회)

왜 Startup Probe가 필요한가?#

Liveness Probe의 initialDelaySeconds를 길게 설정하면 되지 않을까요?

방식문제점
Liveness만 사용, initialDelay 길게시작 후에도 체크 간격이 길어짐
Startup + Liveness시작 시만 긴 대기, 이후 짧은 간격
sequenceDiagram
    participant K as Kubelet
    participant C as Container

    Note over K,C: 시작 단계
    K->>C: Startup Probe
    C-->>K: 실패 (시작 중)
    K->>C: Startup Probe
    C-->>K: 성공!

    Note over K,C: 운영 단계
    K->>C: Liveness Probe
    C-->>K: 성공
    K->>C: Readiness Probe
    C-->>K: 성공

실전 예시: Spring Boot#

Spring Boot 애플리케이션의 Probe 설정 예시입니다.

Spring Boot Actuator 설정#

# application.yml
management:
  endpoints:
    web:
      exposure:
        include: health
  endpoint:
    health:
      probes:
        enabled: true
  health:
    livenessState:
      enabled: true
    readinessState:
      enabled: true

Spring Boot Actuator는 다음 엔드포인트를 제공합니다.

엔드포인트용도
/actuator/health/livenessLiveness Probe
/actuator/health/readinessReadiness Probe
/actuator/health전체 상태

Kubernetes Probe 설정#

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: spring-app
  template:
    metadata:
      labels:
        app: spring-app
    spec:
      containers:
      - name: app
        image: spring-app:1.0
        ports:
        - containerPort: 8080
        startupProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 10
          failureThreshold: 30
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          periodSeconds: 10
          failureThreshold: 3
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          periodSeconds: 5
          failureThreshold: 3

권장 설정#

애플리케이션 유형startupProbelivenessProbereadinessProbe
빠른 시작 (< 30초)선택필수필수
느린 시작 (> 30초)필수필수필수
외부 의존성 있음선택단순 체크의존성 포함 체크

체크 엔드포인트 설계#

Probe체크 내용
Liveness프로세스 생존 여부만 (빠르고 단순하게)
Readiness외부 의존성 (DB, 캐시, 외부 API)
Liveness에서 외부 의존성 체크 주의
Liveness Probe에서 DB 연결을 체크하면, DB 장애 시 모든 Pod가 재시작되어 상황이 악화될 수 있습니다. 외부 의존성은 Readiness Probe에서 체크하세요.

트러블슈팅#

Pod가 계속 재시작됨#

# 이벤트 확인
kubectl describe pod <pod-name>

# 로그 확인
kubectl logs <pod-name> --previous

일반적인 원인은 다음과 같습니다.

원인해결
initialDelaySeconds 부족Startup Probe 사용 또는 값 증가
timeoutSeconds 부족값 증가 또는 엔드포인트 최적화
잘못된 헬스 체크 경로경로와 포트 확인

Readiness 실패로 트래픽 못 받음#

# Endpoints 확인
kubectl get endpoints <service-name>

# Pod Ready 상태 확인
kubectl get pods -o wide

Endpoints가 비어있다면 Readiness Probe 실패 중입니다.

실습: Probe 설정과 테스트#

Probe 동작 확인#

apiVersion: v1
kind: Pod
metadata:
  name: probe-test
spec:
  containers:
  - name: app
    image: nginx:1.25
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    readinessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
# Pod 생성
kubectl apply -f probe-test.yaml

# 이벤트 모니터링
kubectl get events --watch

# Probe 실패 시뮬레이션
kubectl exec probe-test -- rm /usr/share/nginx/html/index.html

# Pod 상태 확인 (재시작 발생)
kubectl get pods -w

다음 단계#

헬스 체크를 이해했다면 다음 단계로 진행하세요:

목표추천 문서
Pod 문제 해결Pod 트러블슈팅
실제 배포 실습Spring Boot 배포
자동 스케일링스케일링