관리 메뉴

피터의 개발이야기

[Kubernetes] Pod의 건강 상태 체크 방법, Readiness Liveness Startup probe설정, Lifecycle Hook 본문

Kubernetes

[Kubernetes] Pod의 건강 상태 체크 방법, Readiness Liveness Startup probe설정, Lifecycle Hook

기록하는 백앤드개발자 2024. 8. 29. 22:57
반응형

[kubernetes] 쿠버네티스 목차

ㅁ 들어가며

ㅇ 쿠버네티스 환경에서 어플리케이션의 안정성과 가용성을 유지하는 것은 매우 중요하다.

ㅇ 쿠버네티스의 생명 주기에 따라 발생하는 lifecycle hook과 Probe라는 기능을 제공하였다.

ㅇ 이 기능의 종류와 특징을 정리하고, 컨테이너의 생명주기 동안 어느 시점에 가동되는지 테스트해 보았다.

 

ㅁ Readiness Probe(준비 확인)

ㅇ 컨테이너가 요청을 처리할 준비가 되었는지 확인한다.

 - 애플리케이션 초기화 완료 여부 확인
 - 외부 서비스와의 연결 상태 점검
 - Probe 실패 시 해당 파드로의 트래픽 차단

 

ㅁ Liveness Probe(오류 탐지와 해결)

ㅇ 애플리케이션이 정상적으로 동작 중인지 확인한다.

 - 애플리케이션의 응답 상태 점검
 - 문제 발생 시 파드 재시작
 - 메모리 누수나 교착 상태 같은 문제 해결에 유용

 

ㅁStartup Probe

ㅇ Startup Probe는 애플리케이션의 초기 구동 시간이 긴 경우에 유용하다.
 - 애플리케이션 시작 완료 시점 확인
 - 초기 구동 중 불필요한 재시작 방지
 - Liveness Probe와 Readiness Probe의 활성화 시점 조절

 

ㅁ Lifecycle Hook

ㅇ Pod의 생명 주기 동안 이벤트 처리를 하기 위해 Lifecycle Hook을 제공한다.

ㅇ 컨테이너가 관리 라이프사이클의 이벤트를 인지하고 상응하는 라이프사이클 훅이 실행될 때 핸들러에 구현된 코드를 실행할 수 있게 한다.
ㅇ 컨테이너에 노출되는 훅은 두 가지가 있다.

 - PostStart: Pod가 시작된 후에 실행된다.

 - PreStop: Pod가 종료되기 전에 실행된다.
   ㄴ API 요청이나 활성 프로브(liveness probe) 실패, 선점, 자원 경합 등의 관리 이벤트로 인해 컨테이너가 종료되기 직전에 호출된다.

 

ㅁ Kubernetes Probe와 Lifecycle Hook 테스트

apiVersion: apps/v1
kind: Deployment
metadata:
  name: probe-test
spec:
  selector:
    matchLabels:
      app: probe-test
  replicas: 1
  template:
    metadata:
      labels:
        app: probe-test
    spec:
      initContainers:
        - name: init
          image: busybox
          command: ['sh', '-c', 'echo $(date): INIT >> /log-dir/timing']
          volumeMounts:
            - mountPath: /log-dir
              name: log-dir
      containers:
        - name: probe-test
          image: busybox
          command: ['sh', '-c', 'while true; do echo $(date): - START >> /log-dir/timing; sleep 10; echo $(date): END >> /log-dir/timing; done']
          volumeMounts:
            - mountPath: /log-dir
              name: log-dir
          readinessProbe:
            exec:
              command:   ['sh', '-c', 'echo $(date): -- READINESS PROBE >> /log-dir/timing']
            initialDelaySeconds: 20
          lifecycle:
            postStart:
              exec:
                command:   ['sh', '-c', 'echo $(date): - POST-START >> /log-dir/timing; sleep 15; echo $(date): POST-START-END >> /log-dir/timing']
            preStop:
              exec:
                command:  ['sh', '-c', 'echo $(date): - PRE-HOOK >> /log-dir/timing']
          startupProbe:
            exec:
              command: ['sh', '-c', 'echo $(date): - STARTUP PROBE>> /log-dir/timing']
            initialDelaySeconds: 10
      volumes:
        - name: log-dir
          emptyDir: {}

ㅇ prode 테스트를 위한 deploy.yaml 생성하였다.

 

 

# deploy 생성
$ date; kubectl apply -f deploy.yaml
2024년 8월 30일 금요일 10시 36분 57초 KST
deployment.apps/probe-test created

# deploy 삭제
$ date; kubectl delete deployments.apps probe-test
2024년 8월 30일 금요일 10시 37분 57초 KST
deployment.apps "probe-test" deleted

ㅇ 테스트를 위해 deploy를 생성 및 삭제를 하였다.

 

# pod 로그 확인
kubectl exec -it probe-test-5f75557b5f-m4tff -- tail -f /log-dir/probe.log
Defaulted container "probe-test" out of: probe-test, init (init)
Fri Aug 30 01:36:59 UTC 2024: INIT
Fri Aug 30 01:37:02 UTC 2024: MAIN START
Fri Aug 30 01:37:02 UTC 2024: ------------ POST-START
Fri Aug 30 01:37:12 UTC 2024: MAIN END
Fri Aug 30 01:37:12 UTC 2024: MAIN START
Fri Aug 30 01:37:17 UTC 2024: ------------ STARTUP PROBE
Fri Aug 30 01:37:22 UTC 2024: MAIN END
Fri Aug 30 01:37:22 UTC 2024: MAIN START
Fri Aug 30 01:37:27 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:37:32 UTC 2024: MAIN END
Fri Aug 30 01:37:32 UTC 2024: MAIN START
Fri Aug 30 01:37:37 UTC 2024: -- LIVENESS PROBE
Fri Aug 30 01:37:37 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:37:42 UTC 2024: MAIN END
Fri Aug 30 01:37:42 UTC 2024: MAIN START
Fri Aug 30 01:37:47 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:37:47 UTC 2024: -- LIVENESS PROBE
Fri Aug 30 01:37:52 UTC 2024: MAIN END
Fri Aug 30 01:37:52 UTC 2024: MAIN START
Fri Aug 30 01:37:57 UTC 2024: ------------ PRE-HOOK
Fri Aug 30 01:37:57 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:38:02 UTC 2024: MAIN END
Fri Aug 30 01:38:02 UTC 2024: MAIN START
Fri Aug 30 01:38:07 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:38:12 UTC 2024: MAIN END
Fri Aug 30 01:38:12 UTC 2024: MAIN START
Fri Aug 30 01:38:17 UTC 2024: -- READINESS PROBE
Fri Aug 30 01:38:22 UTC 2024: MAIN END
Fri Aug 30 01:38:22 UTC 2024: MAIN START
command terminated with exit code 137

ㅇ 출력 로그 확인

 

 

# deploy 생성 
10:36:57 

# init 컨테이너 생성 후 명령어 실행
10:36:59: INIT 

# main 컨테이너 생성 후 명령어 실행
10:37:02 MAIN START

# PostStart Hook 명령어 실행
10:37:02 ------------ POST-START

# Startup Probe 실행 (initialDelaySeconds: 10)
10:37:17 ------------ STARTUP PROBE

# Readiness Probe 실행 (initialDelaySeconds: 20)
10:37:27 -- READINESS PROBE

# Liveness Probe 실행 (initialDelaySeconds: 30)
10:37:37 -- LIVENESS PROBE

# deploy 삭제
10:37:57

# PRE-HOOK 명령어 실행
10:37:57 ------------ PRE-HOOK

# Liveness Probe는 가동하지 않고, Readiness Probe만 실행 
10:37:57 -- READINESS PROBE
10:38:02 MAIN END
10:38:02 MAIN START
10:38:07 -- READINESS PROBE
10:38:12 MAIN END
10:38:12 MAIN START
10:38:17 -- READINESS PROBE
10:38:22 MAIN END
10:38:22 MAIN START

# terminationGracePeriodSeconds는 30초
command terminated with exit code 137

ㅇ 로그 분석한 내용이다.

ㅇ Init -> Main & PostStart -> Readiness와 Liveness -> PreStop -> terminationGracePeriodSeconds(기본 30초) -> terminated

 

https://www.openmaru.io/kubernetes-에서-pod-에-대한-헬스체크-probe/  Kubernetes Probe Diagram with Pod Lifecycle

 

ㅇ 위 그림은 실행 순서를 다이어그램으로 나타내었다.

 

ㅁ 함께 보면 좋은 사이트

컨테이너 라이프사이클 훅(Hook)

kube doc - 파드 라이프사이클

Configure Liveness, Readiness and Startup Probes

Kubernetes에서 Pod에 대한 헬스체크(Probe)

쿠버네티스 - Probe (Liveness, Readiness, Startup)

반응형
Comments