Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #15] DaemonSet과 Init Container: 노드별 초기화 작업 처리 전략

ygtoken 2025. 3. 22. 20:51
728x90

1️⃣ 개요

DaemonSet은 모든 노드에 하나씩 Pod을 배포하여, 노드 단위의 작업을 수행하는 데 적합한 구조입니다.
때로는 본 컨테이너가 실행되기 전에 노드별로 초기화 작업을 먼저 수행해야 하는 상황이 있습니다.
예를 들어, 로그 디렉터리 생성, 초기 설정 파일 복사, 노드 정보 기록 등의 작업이 이에 해당됩니다.

이럴 때는 Init Container를 활용하여 초기화 작업을 처리하고,
해당 작업이 끝난 후에 본 컨테이너가 실행되도록 구성할 수 있습니다.


2️⃣ Init Container란?

항목 설명
실행 시점 본 컨테이너 실행 전에 순차적으로 실행됨
용도 설정 초기화, 디렉터리 준비, 외부 검사 등
특징 본 컨테이너와는 별도의 컨테이너 이미지/명령어 사용 가능
동작 방식 순서대로 실행되며, 모든 Init Container가 성공해야 본 컨테이너가 실행됨

✅ Init Container는 본 컨테이너와 공유된 볼륨을 사용할 수 있어,
공유 경로를 통해 작업 결과를 전달할 수 있습니다.


3️⃣ DaemonSet에 Init Container 설정 예시

✅ 목표

  • 노드의 /var/log/node-agent 디렉터리를 확인하여
  • 없으면 생성 후, 본 컨테이너가 로그 수집 작업 수행

4️⃣ 전체 DaemonSet 구성 예제 (Init Container 포함)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-agent
spec:
  selector:
    matchLabels:
      app: node-agent
  template:
    metadata:
      labels:
        app: node-agent
    spec:
      containers:
        - name: agent
          image: busybox
          command: ["sh", "-c", "echo 'Start monitoring'; tail -f /host-logs/init.log"]
          volumeMounts:
            - name: host-logs
              mountPath: /host-logs                # Init Container와 공유되는 경로

      initContainers:
        - name: init-prepare
          image: busybox
          command:
            - sh
            - -c
            - |
              mkdir -p /host-logs && \
              echo "Init completed on $(hostname)" > /host-logs/init.log
          volumeMounts:
            - name: host-logs
              mountPath: /host-logs                # 공유 볼륨에 초기화 로그 기록

      volumes:
        - name: host-logs
          emptyDir: {}                              # Init과 main 컨테이너가 공유하는 빈 디렉터리 볼륨

📌 설명 요약

  • Init Container는 /host-logs/init.log에 로그를 작성
  • 본 컨테이너는 동일 경로를 마운트하여 해당 로그를 출력하거나 활용
  • emptyDir은 같은 Pod 내 여러 컨테이너에서 공유할 수 있는 임시 디스크입니다.

5️⃣ Init Container 동작 확인 방법

kubectl describe pod <pod-name>

📌 Init Containers: 섹션을 통해 실행 상태 확인 가능.
정상 종료되면 본 컨테이너가 실행됩니다.


6️⃣ 다양한 Init Container 활용 사례

목적 예시
설정 파일 복사 ConfigMap에서 특정 파일 복사 후 위치 조정
로그 디렉터리 생성 /var/log/app 등 마운트 대상 디렉터리 준비
외부 서비스 검사 DB, API, Endpoint에 curl로 접근 가능 여부 확인 후 진행
커널 파라미터 읽기 sysctl 값 읽어서 공유 볼륨에 저장

7️⃣ 주의사항 및 설계 팁

항목 내용
실행 실패 시 전체 Pod이 Init 상태로 멈춤 → 에러 로그 확인 필요
공유 방식 emptyDir, hostPath, configMap, secret 등 다양한 방식 활용 가능
Init 순서 Init Container는 순차적으로 실행됨 (병렬 아님)
보안 설정 Init Container에도 별도 SecurityContext 적용 가능

🔥 8️⃣ 결론

Init Container는 DaemonSet Pod 실행 전에 필요한 초기화 작업을 수행할 수 있는 강력한 도구입니다.
빈 디렉터리 볼륨(emptyDir)을 통해 Init과 메인 컨테이너 간 데이터 공유가 가능하며, 다양한 준비 작업을 유연하게 처리할 수 있습니다.
노드별 초기 설정, 디렉터리 준비, 외부 상태 점검 등 여러 작업을 Init Container로 분리하면 관리와 유지가 쉬워집니다.

 

728x90