Kubernetes/Kubernetes Best Practices

[Scenario Playbook - 심화편 | Low Level #10] DaemonSet을 활용한 시스템 에이전트 배포

ygtoken 2025. 3. 16. 18:54
728x90

 

쿠버네티스에서 모든 노드에서 실행되어야 하는 시스템 에이전트(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가 로그를 수집하여 중앙 저장소로 전송됨

 

728x90