일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- mysql 튜닝
- 공부
- 코틀린 코루틴의 정석
- minikube
- aws
- Kubernetes
- 정보처리기사 실기
- MySQL
- 오블완
- Spring
- Elasticsearch
- CKA 기출문제
- 정보처리기사실기 기출문제
- 정보처리기사 실기 기출문제
- PETERICA
- IntelliJ
- CKA
- 티스토리챌린지
- Linux
- kotlin
- AWS EKS
- kotlin coroutine
- AI
- 기록으로 실력을 쌓자
- kotlin spring
- CloudWatch
- Pinpoint
- kotlin querydsl
- APM
- Java
- Today
- Total
피터의 개발이야기
[Kubernetes] Pod의 건강 상태 체크 방법, Readiness Liveness Startup probe설정, Lifecycle Hook 본문
[Kubernetes] Pod의 건강 상태 체크 방법, Readiness Liveness Startup probe설정, Lifecycle Hook
기록하는 백앤드개발자 2024. 8. 29. 22:57
ㅁ 들어가며
ㅇ 쿠버네티스 환경에서 어플리케이션의 안정성과 가용성을 유지하는 것은 매우 중요하다.
ㅇ 쿠버네티스의 생명 주기에 따라 발생하는 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
ㅇ 위 그림은 실행 순서를 다이어그램으로 나타내었다.
ㅁ 함께 보면 좋은 사이트
ㅇ Configure Liveness, Readiness and Startup Probes
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Spring Boot + Kubernetes 기반에서 웜업 적용하기 (4) | 2024.10.08 |
---|---|
[Kubernetes] 쿠버네티스 API 버전별 제거된 API와 마이그레이션 API요약 표 (0) | 2024.10.07 |
[Kubernetes] 특정 API에 대한 접근을 제한하는 방법 (0) | 2024.08.24 |
[kubernetes] 쿠버네티스 목차 (6) | 2024.01.19 |
[kubernetes] Cluster Maintenance - 리눅스 노드 업그레이드 (0) | 2023.12.21 |