
DaemonSet(데몬셋)은 클러스터의 모든 노드(또는 지정된 일부 노드)가 특정 파드의 복사본을 하나씩 실행하도록 보장하는 리소스이다.
ReplicaSet처럼 복제본의 수를 지정하는 replicas 필드가 없으며, 하나의 노드에 두 개 이상의 파드를 배치할 수도 없다.
클러스터에 새로운 노드가 추가되면, 해당 노드에도 데몬셋의 파드가 자동으로 생성된다. 반대로 노드가 제거되면 파드도 함께 정리된다.
특정 노드에 파드를 배치하고 싶지 않은 경우에는 nodeSelector 나 노드 어피니티(Node Affinity) 설정을 통해 예외 처리할 수 있다.

DaemonSet은 다음과 같이 모든 노드에서 항상 동작해야 하는 시스템 데몬이나 에이전트를 배포하는 데 매우 유용하다.
로그 수집기: 각 노드의 컨테이너 로그를 수집하여 중앙 로그 시스템으로 보내는 Fluentd , Logstash.
노드 모니터링 에이전트: 각 노드의 리소스 사용량 및 상태를 수집하는 Prometheus Node Exporter , Datadog 에이전트.
클러스터 스토리지 데몬: GlusterFS, Ceph 와 같은 분산 스토리지 시스템의 데몬.
DaemonSet 역시 YAML 매니페스트 파일을 통해 생성한다. 다음은 프로메테우스의 노드 모니터링 에이전트인 node-exporter 를 배포하는 예시이다.
daemonsets.yaml 파일 작성:apiVersion: apps/v1
kind: DaemonSet
metadata:
name: prometheus-daemonset
spec:
selector:
matchLabels:
name: prometheus-exporter
template:
metadata:
labels:
name: prometheus-exporter
spec:
containers:
- name: prometheus
image: prom/node-exporter
ports:
- containerPort: 9104 # node-exporter 기본 포트
node-exporter의 기본 포트는 9104 이다.# DaemonSet 생성
kubectl apply -f daemonsets.yaml
# DaemonSet 상세 정보 확인 (각 노드에 스케줄링된 상태를 볼 수 있음)
kubectl describe daemonset prometheus-daemonset
# 생성된 파드 확인 (각 노드에 하나씩 배포된 것을 확인)
kubectl get pods -o wide

DaemonSet의 파드를 업데이트하는 방식은 spec.updateStrategy.type 필드를 통해 두 가지로 지정할 수 있다.
OnDelete 전략에서는 데몬셋의 매니페스트 파일(예: 컨테이너 이미지 버전)을 변경하여 적용해도, 실행 중인 기존 파드들은 자동으로 업데이트되지 않는다.
업데이트는 사용자가 직접 파드를 삭제 (kubectl delete pod ...)했을 때만 이루어진다. 파드가 삭제되면 데몬셋 컨트롤러가 새로운 버전의 파드를 해당 노드에 다시 생성한다.
모니터링 에이전트처럼 업데이트로 인한 서비스 중단을 최소화하고 싶거나, 급하게 업데이트할 필요가 없는 경우에 사용된다.
spec:
updateStrategy:
type: OnDelete
RollingUpdate 전략은 Deployment와 유사하게, 노드별로 파드를 순차적으로 업데이트하는 방식이다.
Deployment와 달리, 노드당 파드가 하나뿐이므로 maxSurge(추가로 생성할 파드 수) 옵션은 없다.
오직 maxUnavailable 옵션만 사용하여 동시에 업데이트를 진행할 파드의 최대 개수를 지정할 수 있다 (기본값: 1).
maxUnavailable: 2로 설정하면, 2개의 노드에서 동시에 파드를 정지하고 업데이트를 진행한다.spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 2 # 동시에 최대 2개의 파드를 업데이트