728x90
1️⃣ 개요
DaemonSet은 노드마다 Pod을 자동으로 배포하는 구조이지만, 때로는 컨테이너가 시작되거나 종료될 때 추가 작업을 자동으로 수행해야 할 수 있습니다.
예를 들어, 시작 시 노드 정보를 수집하거나 종료 전 로그를 전송하는 등의 작업이 이에 해당됩니다.
이럴 때 유용한 기능이 바로 lifecycle 설정을 통한 Hook 구성입니다.
이번 글에서는 DaemonSet에서 lifecycle 설정을 활용하여 Pod의 시작/종료 작업을 자동화하는 방법을 소개합니다.
2️⃣ Kubernetes Lifecycle Hook이란?
Hook 종류 | 트리거 시점 | 설명 |
postStart | 컨테이너가 시작된 직후 | 주로 초기화 작업, 외부 알림, 준비 동작 수행 |
preStop | 컨테이너가 종료되기 직전 | 로그 정리, 연결 해제, 상태 저장 등 활용 |
✅ 두 Hook 모두 컨테이너 내부에서 실행되는 명령어로 설정되며, 병렬로 실행되므로 주의가 필요합니다.
3️⃣ 예제: DaemonSet에 Lifecycle Hook 설정하기
lifecycle:
postStart:
exec:
command: ["sh", "-c", "echo START: $(hostname) > /tmp/pod-start.log"]
preStop:
exec:
command: ["sh", "-c", "echo STOP: $(hostname) >> /tmp/pod-start.log"]
📌 설명
- postStart: 컨테이너가 시작되자마자 /tmp/pod-start.log 파일에 시작 로그를 작성
- preStop: 컨테이너 종료 직전에 같은 파일에 종료 로그를 추가 기록
✅ 이처럼 시작/종료 시점에 원하는 동작을 삽입할 수 있습니다.
4️⃣ 전체 DaemonSet 예제 (Lifecycle 포함)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: lifecycle-agent
spec:
selector:
matchLabels:
app: lifecycle-agent
template:
metadata:
labels:
app: lifecycle-agent
spec:
containers:
- name: lifecycle-agent
image: busybox
command: ["sh", "-c", "while true; do sleep 60; done"]
lifecycle:
postStart:
exec:
command:
- sh
- -c
- echo "Pod started on $(hostname)" > /tmp/lifecycle.log
preStop:
exec:
command:
- sh
- -c
- echo "Pod stopping on $(hostname)" >> /tmp/lifecycle.log
📌 설명 요약
- 이 DaemonSet은 busybox 컨테이너를 각 노드에 하나씩 배포하고,
- Pod 시작 시 /tmp/lifecycle.log에 시작 메시지를 기록하고
- 종료 시 동일 파일에 종료 메시지를 추가로 기록합니다.
5️⃣ Lifecycle Hook 동작 확인 방법
✅ 로그 확인
kubectl exec -it <pod-name> -- cat /tmp/lifecycle.log
출력 예시:
Pod started on node-1
Pod stopping on node-1
✅ Pod가 재시작되면 로그에 시작과 종료 메시지가 계속 추가됩니다.
6️⃣ 주의 사항 및 권장 설정
항목 | 주의 내용 |
Hook은 병렬 실행됨 | postStart는 컨테이너 명령어와 동시에 실행됨 (완료 보장 아님) |
preStop 처리 시간 확보 필요 | 종료 전에 처리할 작업이 있을 경우, terminationGracePeriodSeconds 설정 필요 |
로그 또는 외부 전송 작업 | Hook 내 작업은 짧고 빠르게 실행되어야 함. 무거운 로직은 별도 컨테이너로 분리 권장 |
✅ terminationGracePeriodSeconds 설정 예시
spec:
terminationGracePeriodSeconds: 30 # 종료 전에 최대 30초 대기
📌 설명
- preStop 명령이 종료되도록 충분한 시간을 확보해줍니다.
- 설정하지 않으면 default는 30초이며, 짧으면 preStop이 완전히 실행되지 못할 수 있습니다.
🔥 7️⃣ 결론
✔ DaemonSet Pod에 lifecycle hook을 설정하면 시작/종료 시 추가 작업을 자동화할 수 있습니다.
✔ postStart와 preStop을 적절히 활용하여 로그 기록, 외부 알림, 정리 작업 등을 자동화할 수 있습니다.
✔ terminationGracePeriodSeconds를 함께 설정하면 preStop 작업이 안정적으로 실행될 수 있습니다.
✔ Hook 내부 동작은 가능한 가볍게 구성하고, 병렬 실행됨을 염두에 두어야 합니다.
728x90