Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #21] DaemonSet과 ConfigMap 동기화 전략: 노드별 구성 분리와 업데이트 대응

ygtoken 2025. 3. 22. 21:03
728x90

1️⃣ 개요

DaemonSet은 모든 노드에 동일한 Pod을 배포하지만, 노드 환경에 따라 조금씩 다른 설정이 필요할 때가 있습니다.
예를 들어, 로그 수집 대상 경로나 디바이스 경로가 노드마다 다를 수 있고,
클러스터 관리자가 ConfigMap을 통해 설정을 주기적으로 갱신해야 할 수도 있습니다.

이 글에서는 DaemonSet과 ConfigMap을 연동하여 노드별 구성을 적용하거나 설정 변경에 유연하게 대응하는 방법을 정리합니다.


2️⃣ ConfigMap 기본 사용 방식

apiVersion: v1
kind: ConfigMap
metadata:
  name: log-config
data:
  log_level: "INFO"
  log_path: "/var/log/messages"

📌 설명

  • 이 ConfigMap은 로그 수집기의 로그 경로 및 레벨을 정의한 예시입니다.
  • DaemonSet Pod 내에서 이 설정을 환경 변수 또는 볼륨으로 마운트하여 사용하게 됩니다.

3️⃣ ConfigMap을 환경 변수로 사용하기

containers:
  - name: log-agent
    image: busybox
    envFrom:
      - configMapRef:
          name: log-config

📌 설명

  • envFrom을 사용하면 ConfigMap의 키-값 쌍이 환경 변수로 주입됩니다.
  • 예: log_level=INFO, log_path=/var/log/messages

4️⃣ ConfigMap을 볼륨으로 마운트하여 사용하는 방법

volumes:
  - name: config-volume
    configMap:
      name: log-config

volumeMounts:
  - name: config-volume
    mountPath: /etc/log-config
    readOnly: true

📌 설명

  • ConfigMap의 각 key는 mountPath 아래의 파일로 마운트됩니다.
  • log_level → /etc/log-config/log_level 파일로 사용 가능

5️⃣ DaemonSet 전체 예제 (ConfigMap 연동)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-agent
spec:
  selector:
    matchLabels:
      app: log-agent
  template:
    metadata:
      labels:
        app: log-agent
    spec:
      containers:
        - name: log-agent
          image: busybox
          command: ["sh", "-c", "echo log level: $log_level && sleep 3600"]
          envFrom:
            - configMapRef:
                name: log-config

📌 설명 요약

  • ConfigMap으로부터 log_level 값을 받아 로그 수집기의 동작을 제어하는 구조입니다.

6️⃣ ConfigMap 변경 시 반영 전략

방법 설명
Pod 재시작 필요 ConfigMap은 기본적으로 변경 시 자동 반영되지 않음
해결 방법 1 kubectl rollout restart ds log-agent 명령으로 수동 재시작
해결 방법 2 checksum annotation 사용 → 변경 시 자동 롤링 업데이트 유도
해결 방법 3 ConfigMap을 볼륨으로 마운트하고, 스크립트로 변경 감지 후 리로드

✅ 예시: Checksum 기반 롤링 업데이트 트리거

metadata:
  annotations:
    config-checksum: "{{ .Values.configChecksum }}"

📌 설명

  • Helm 또는 kustomize에서 ConfigMap 해시값을 주입하면,
    값이 변경될 때마다 Pod 템플릿 hash가 달라져 자동 롤링 업데이트가 발생합니다.

7️⃣ 노드별 설정 분리 전략

전략 방식 예시
라벨 기반 분기 Node 라벨로 분기하여 ConfigMap 지정 node-role.kubernetes.io/gpu=true 등
환경 변수에서 노드 이름 활용 spec.nodeName 값 사용 config-${NODE_NAME} 식 구분
Downward API 활용 Pod 메타데이터를 env로 주입 fieldRef로 노드 이름 등 사용 가능
env:
  - name: NODE_NAME
    valueFrom:
      fieldRef:
        fieldPath: spec.nodeName

📌 설명

  • 노드 이름에 따라 동적으로 ConfigMap 또는 설정값을 다르게 처리할 수 있습니다.

🔥 8️⃣ 결론

DaemonSet은 모든 노드에 동일하게 배포되지만, ConfigMap을 통해 노드별로 유연한 설정을 적용할 수 있습니다.
환경 변수 또는 마운트 방식으로 설정을 전달할 수 있으며, ConfigMap 변경 시 재시작 전략을 고려해야 합니다.
Node 라벨, Downward API 등을 활용하면 설정을 노드 환경에 맞춰 분기할 수 있습니다.

728x90