[MacOS 환경 #6] DaemonSet으로 로그 수집 파드 자동 배포 실습

도람·2025년 11월 12일

데몬셋(DaemonSet)

데몬셋은 쿠버네티스에서 모든 노드(혹은 특정 노드)에 파드를 하나씩 자동으로 배포하는 리소스이다.
ex) 로그 수집가, 모니터링 에이전트같은 시스템성 파드들

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: hello-daemon
  labels:
    app: hello-daemon
spec:
  selector:
    matchLabels:
      app: hello-daemon
  template:
    metadata:
      labels:
        app: hello-daemon
    spec:
      containers:
      - name: daemon-container
        image: busybox
        command: ["/bin/sh", "-c"]
        args:
        - while true; do
            echo "Hello from DaemonSet on $(hostname)";
            sleep 30;
          done

코드 해설

항목설명
apiVersionapps/v1 — DaemonSet은 앱 리소스 그룹에 속함
kindDaemonSet — 모든 노드에 파드를 배포
metadata.nameDaemonSet 이름 (hello-daemon)
selector / labels어떤 파드를 관리할지 구분
template생성될 파드의 템플릿 정의
containers실행할 컨테이너 정의 (busybox로 메시지 출력)

실행 명령어

kubectl apply -f daemonset.yaml        # DaemonSet 생성
kubectl get daemonsets                 # DaemonSet 목록 확인
kubectl get pods -o wide               # 각 노드에 파드가 하나씩 배포된 것 확인
kubectl logs <pod-name>                # 로그 확인

실습

데몬셋에 대해 솔직히 무슨 내용인지 이해가 잘 안갔다. 그래서 백문이 불여일견이라고
먼저 실습을 통해 느껴보기로 했다.


DaemonSet YAML 만들기

vim daemonset.yaml
```yaml
원하는 경로에 daemonset.yaml 파일을 만든 후, 밑에 있는 내용을 붙여넣기한다. 
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: log-daemon
spec:
  selector:
    matchLabels:
      app: log-daemon
  template:
    metadata:
      labels:
        app: log-daemon
    spec:
      containers:
      - name: logger
        image: busybox
        command: ["/bin/sh", "-c"]
        args:
          - |
            while true; do
              echo "$(date) : Hello from $(hostname)";
              sleep 10;
            done
      restartPolicy: Always

!wq + enter 하여 편집을 마무리한다.

그런다음 cat daemonset.yaml 하여 확인한 결과이다.

이 코드가 하는 일

  • 모든 노드에 log-daemon 파드 1개씩 자동 배포됨.
  • 파드 안의 컨테이너는 10초마다 현재 시간 + 호스트 이름을 로그로 출력함.
    (즉, “어느 노드에서 로그를 찍고 있는지” 바로 알 수 있다.)

실행하기

kubectl apply -f daemonset.yaml

이 명령어를 실행하여 만든 데몬파일을 배포한다.

kubectl get daemonsets
kubectl get pods -o wide

이 명령어를 통해 각 노드별로 파드가 1개씩 배포된 것을 확인할 수 있다.


log-daemon-ghqld는 DaemonSet이 자동으로 생성한 파드이다.


kubectl logs -f <log-daemon-pod-name>

는 각각의 파드의 로그를 확인하는 명령어이고, 전체 노드의 로그를 확인하고 싶을 경우
다음과 같은 명령어를 사용하면 된다.

kubectl logs -l app=log-daemon -f

이제 로그를 확인해본다.

매 10초마다 로그가 출력되는 것을 확인할 수 있다.

DaemonSet 특징 확인 팁

kubectl get daemonset

위 명령어를 입력하면 다음과 같이 뜬다.


-> 클러스터 내 모든 노드에 파드가 하나씩 떠 있는 구조라 노드가 추가되면 새로운 노드에도
자동으로 파드가 뜨게 된다.

정리

처음 이 내용을 학습할 때는 어떤 로그를 어떻게 출력하는지 헷갈려서 여러 자료를 찾아보았다.
정리해보면 다음과 같다.

처음 내 쿠버네티스 클러스터에는 노드가 1개(docker-desktop)뿐이었다.
그래서 DaemonSet을 실행하면 log-daemon 파드가 그 노드에 하나 자동으로 생성된다.

이후 클러스터에 노드를 하나 더 추가하면,
새 노드에도 자동으로 log-daemon 파드가 생성되어 로그를 수집하게 된다.

즉,

NODE                POD
docker-desktop      log-daemon-xxxxx
node2               log-daemon-yyyyy

→ 내가 새 파드를 직접 만든다고 늘어나는 구조가 아니라,
“노드 개수”에 따라 자동으로 파드가 늘어나는 구조이다.

즉, 노드를 하나 더 만들 경우, DaemonSet이 그 노드에서도 로그를 수집할 수 있는 파드를 자동으로 생성한다. 따라서 kubectl logs -l app=log-daemon -f 명령어로 모든 노드의 로그를 한꺼번에 볼 수 있으며, kubectl logs -f <.log-daemon-pod-name> 명령어를 사용하면 각 파드의 로그를 개별적으로 확인할 수 있다.


생성한 리소스 정리하기

DaemonSet 실습이 끝났다면, 생성된 리소스들을 모두 삭제해서 클러스터를 깨끗이 정리한다.

# DaemonSet 삭제
kubectl delete -f daemonset.yaml

# 파드 삭제 확인
kubectl get pods -o wide

# 혹시 남아있는 리소스가 있을 경우 강제 삭제
kubectl delete daemonset log-daemon --force --grace-period=0

저작권 문제를 방지하기 위해 공식 문서 내용을 참고하였으며, 일부 설명은 ChatGPT를 활용해 재구성하였습니다.
본 포스트는 학습용 예시로 작성되었습니다.

profile
정도를 걷는 엔지니어

0개의 댓글