Infra/Kubernetes

Pod - ReadinessProbe, LivenessProbe

최-코드 2025. 6. 17. 01:32

ReadinessProbe, LivenessProbe 개요

  • ReadinessProbe
    • Node1과 Node2에서 Pod가 동작 중인 상황에서 Node2에 장애가 발생하면, Node3에 Pod를 생성한다. 이 때 Pod와 Container의 상태가 Running이어도 App이 구동되기 전이라면, Node3의 Pod로 요청이 오면 에러 페이지를 반환한다.
    • 이러한 문제를 해결하기 위해 Pod를 만들 때 ReadinessProbe를 제공해야 한다. -> App이 구동되기 전까지는 Service와 연결이 되지 않게 해주기 때문이다.
    • 따라서 Node3의 Pod의 Phase는 Running이지만, Service에서의 트래픽은 Node1의 Pod로만 가게 된다.
    • 이후, App이 완전히 구동되면 Service와 연결되어 Node3의 Pod로도 트래픽이 오게 된다.
  • LivenessProbe
    • Node3의 Pod가 Running 상태를 유지하면서 컨테이너 내에서 구동 중인 App에 장애가 발생했을 때, App에 대한 장애 상황을 감지해주는 것이 LivenessProbe이다.
    • 마찬가지로 파드를 만들 때 LivenessProbe를 제공해야 하고, 해당 App에 문제가 생기면 파드를 재실행하게 만들어 준다.
      (https://rosoa0475.tistory.com/506 - 파드 재시작 참고)
쿠버네티스는 기본적으로 App 프로세스만 살아있다면, Container를 Running 상태로 표시하고, App 프로세스 내부에서의 스레드 풀 고갈, 데드락은 감지하지 못한다.

 

ReadinessProbe, LivenessProbe 세부 설명

  • ReadinessProbe와 LivenessProbe를 설정하는데 필요한 공통 설정 목록이다.
  • 크게 httpGet, Exec, tcpSocket을 통해 App에 대한 상태를 확인할 수 있다.
    • 이 셋 중에 하나는 꼭 지정해야 하는 속성이다.
    • 각각에 대해 밑에 있는 속성으로 설정해줄 수 있다.
  • httpGet, Exec, tcpSocket과 달리 선택적으로 설정해주는 속성이 있다. -> 이미지 속 각각 속성의 아래에 default value가 있다.
    • initialDelaySeconds: 최초 Probe를 하기 전에 딜레이 시간
    • periodSeconds: Probe를 체크하는 시간의 간격
    • timeoutSeconds: Probe했을 때 결과가 오기까지의 시간
    • successThreshold: 몇 번 성공 결과를 받아야 성공으로 인정할 건지에 대한 기준
    • failureThreshold: 몇 번 실패 결과를 받아야 실패로 인정할 건지에 대한 기준
Probe: httpGet, Exec, tcpSocket 작업을 요청하는 것을 말한다.

ReadinessProbe

  • 이미지를 다운 받아 Pod와 Container가 막 Running 상태가 되면, 쿠버네티스는 ReadinessProbe를 설정할 때 지정한 내용을 바탕으로 Probe를 진행한다.
    • Probe가 성공적으로 끝날 때까지 ContainerReady와 Ready Conditions는 False 상태가 지속된다.
    • 반대로, Probe가 성공적으로 끝나면, ContainerReady와 Ready Conditions는 True가 되고, Service와 연결된다.
  • 위 이미지에 대한 간략한 동작은 아래와 같다.
    • 파드와 Container가 Running가 되고 난 후, 5초 이후에 쿠버네티스가 cat /tmp/ready.txt 명령어를 컨테이너에 보낸다.
    • 10초 간격으로 cat /tmp/ready.txt 명령어를 보낸다.
    • 성공적으로 3번 동안 정상적으로 출력되면, ContainerReady와 Ready를 True 값으로 바꿔준다.
apiVersion: v1
kind: Pod
metadata:
  name: pod-readiness-exec1
  labels:
    app: readiness  
spec:
  containers:
  - name: readiness
    image: kubetm/app
    ports:
    - containerPort: 8080	
    readinessProbe:
      exec:
        command: ["cat", "/readiness/ready.txt"]
      initialDelaySeconds: 5
      periodSeconds: 10
      successThreshold: 3
    volumeMounts:
    - name: host-path
      mountPath: /readiness
  volumes:
  - name : host-path
    hostPath:
      path: /tmp/readiness
      type: DirectoryOrCreate
  terminationGracePeriodSeconds: 0

LivenessProbe

  • 기본적인 설명은 위의 ReadinessProbe와 동일하다.
  • 따라서 위 이미지에 대한 간략한 동작에 대해서만 설명하고, 그 설명은 아래와 같다.
    • 파드와 Container가 Running가 되고 난 후, 5초 이후에 쿠버네티스가 /health 경로로 요청을 컨테이너에 보낸다.
    • 10초 간격으로 /health 경로로 요청을 보낸다.
    • 성공적으로 3번 동안 응답을 받으면, ContainerReady와 Ready를 True 값으로 바꿔준다.
    • 이후 어느 순간 3번 실패하면, 파드를 재시작하게 된다.
apiVersion: v1
kind: Pod
metadata:
  name: pod-liveness-httpget1
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: kubetm/app
    ports:
    - containerPort: 8080
    livenessProbe:
      httpGet:
        path: /health
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      failureThreshold: 3
  terminationGracePeriodSeconds: 0
  • 컨테이너의 포트 번호와 httpGet의 포트 번호가 같아야 한다.
  • host 주소를 할당하지 않으면 Pod의 IP 주소를 자동으로 할당해준다.