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