쿠버네티스에서 모든 노드에서 실행되어야 하는 시스템 에이전트(Pod)를 배포할 때 DaemonSet을 사용합니다.
예를 들어, 로그 수집, 모니터링, 네트워크 정책 적용 등의 기능을 수행하는 애플리케이션은 모든 노드에서 실행되어야 합니다.
이 글에서는 DaemonSet을 활용하여 시스템 에이전트를 효과적으로 배포하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1. DaemonSet을 활용한 시스템 에이전트 배포
2. 특정 노드에서만 실행되는 DaemonSet 설정
3. DaemonSet을 활용한 로그 수집 및 모니터링 시스템 구축
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ DaemonSet을 활용한 시스템 에이전트 배포
❓ 문제 상황
운영팀에서 모든 노드에서 실행되어야 하는 로그 수집 에이전트를 배포해야 합니다.
모든 노드에 자동으로 배포되고, 새로운 노드가 추가되면 자동으로 Pod이 배포되어야 합니다.
• DaemonSet 이름: log-agent-daemonset
• 컨테이너 이미지: fluentd
• 모든 노드에서 실행되어야 함
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. DaemonSet을 생성하여 모든 노드에서 로그 수집 에이전트를 실행합니다.
2. kubectl을 사용하여 DaemonSet이 정상적으로 배포되었는지 확인합니다.
✅ 정답 Manifest (DaemonSet 생성)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-agent-daemonset
spec:
selector:
matchLabels:
name: log-agent
template:
metadata:
labels:
name: log-agent
spec:
containers:
- name: fluentd
image: fluentd # 로그 수집 에이전트
resources:
limits:
memory: "200Mi"
cpu: "100m"
📌 적용 후 예상 결과 값
1. DaemonSet이 정상적으로 생성되었는지 확인
kubectl get daemonset
💡 예상 출력 값
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
log-agent-daemonset 3 3 3 3 3 <none> 5s
2. 각 노드에서 실행 중인 Pod 확인
kubectl get pods -l name=log-agent -o wide
💡 예상 출력 값
NAME READY STATUS NODE
log-agent-daemonset-abc12 1/1 Running node-1
log-agent-daemonset-xyz34 1/1 Running node-2
log-agent-daemonset-qwe56 1/1 Running node-3
✅ 모든 노드에서 로그 수집 에이전트가 실행됨
2️⃣ 특정 노드에서만 실행되는 DaemonSet 설정
❓ 문제 상황
운영팀에서 특정 라벨이 있는 노드에서만 DaemonSet을 실행해야 합니다.
예를 들어, “logging=true” 라벨이 있는 노드에서만 로그 수집 에이전트가 배포되어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. NodeSelector를 활용하여 특정 라벨이 있는 노드에서만 실행되도록 설정합니다.
2. kubectl label 명령어를 사용하여 특정 노드에 라벨을 추가합니다.
✅ 정답 Manifest (특정 노드에서 실행되는 DaemonSet 설정)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-agent-daemonset
spec:
selector:
matchLabels:
name: log-agent
template:
metadata:
labels:
name: log-agent
spec:
nodeSelector:
logging: "true" # "logging=true" 라벨이 있는 노드에서만 실행
containers:
- name: fluentd
image: fluentd
📌 적용 후 예상 결과 값
1. 특정 노드에 라벨 추가
kubectl label nodes node-1 logging=true
kubectl label nodes node-2 logging=true
💡 예상 출력 값
node/node-1 labeled
node/node-2 labeled
2. DaemonSet이 특정 노드에서만 실행되는지 확인
kubectl get pods -l name=log-agent -o wide
💡 예상 출력 값
NAME READY STATUS NODE
log-agent-daemonset-abc12 1/1 Running node-1
log-agent-daemonset-xyz34 1/1 Running node-2
✅ 라벨이 있는 노드에서만 DaemonSet이 실행됨
3️⃣ DaemonSet을 활용한 로그 수집 및 모니터링 시스템 구축
❓ 문제 상황
운영팀에서 모든 노드에서 로그를 수집하여 중앙 집중식 로그 저장소로 전송해야 합니다.
이를 위해 Fluentd DaemonSet을 배포하고, 모든 컨테이너 로그를 수집하도록 설정해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Fluentd DaemonSet을 배포하여 모든 노드에서 로그를 수집합니다.
2. kubectl을 사용하여 로그가 정상적으로 수집되는지 확인합니다.
✅ 정답 Manifest (Fluentd 로그 수집 DaemonSet 설정)
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-daemonset
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd
volumeMounts:
- name: varlog
mountPath: /var/log # 모든 노드의 로그를 수집
volumes:
- name: varlog
hostPath:
path: /var/log # 노드의 /var/log 디렉토리를 마운트
📌 적용 후 예상 결과 값
1. Fluentd DaemonSet이 정상적으로 배포되었는지 확인
kubectl get daemonset
💡 예상 출력 값
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-daemonset 3 3 3 3 3 <none> 5s
2. Fluentd가 로그를 수집하는지 확인
kubectl logs -l app=fluentd --tail=10
💡 예상 출력 값
2024-03-13 10:15:30 [info] collecting logs from /var/log
2024-03-13 10:15:31 [info] sending logs to central log server
✅ 모든 노드에서 Fluentd가 로그를 수집하여 중앙 저장소로 전송됨