Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #10] DaemonSet과 Lifecycle Hook: 시작 및 종료 시 작업 자동화

ygtoken 2025. 3. 22. 19:38
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