11장. 데몬셋
데몬셋은 모든 노드에 에이전트나 데몬을 실행하기 위한 쿠버네티스 객체
데몬셋은 파드의 복사본이 쿠버네티스 클러스터의 노드 집합에서 실행되게 함
데몬셋은 레플리카셋과 유사하게, 클러스터의 원하는 상태와 관찰된 상태를 동일하게 만듬
노드당 하나의 파드를 실행하기 원한다면, 레플리카셋이 아닌 데몬셋을 사용해야 함
ex) 로그 수집기, 모니터링 에이전트…
데몬셋 스케줄러
데몬셋은 노드 셀렉터를 사용하지 않는 한, 모든 노드에 파드의 복제본을 생성함
노드 셀렉터를 사용하면, 일치하는 라벨 집합을 갖는 노드로 범위를 제한함
새로운 노드가 클러스터에 추가될 경우, 데몬셋 컨트롤러는 파드가 없음을 확인하고 새로운 노드에 파드를 추가함

데몬셋 컨트롤러는 Controller Manager 중 하나
컨트롤러 매니저는 Control Plane 컴포넌트 중 하나
ex) Deployment Controller, Replication Controller, DaemonSet Controller
일반적으로 쿠버네티스 스케줄러에 의해 파드가 실행되는 노드가 선택되지만, 데몬셋 파드는 데몬셋 컨트롤러에 의해 생성되고 각 노드에 할당됨
데몬셋 생성
# fluentd.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
labels:
app: fluentd
spec:
selector:
matchLabels:
app: fluentd
template:
metadata:
labels:
app: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd:v0.14.10
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lob/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
fluentd
: 로그 수집 및 처리를 위해 사용되는 오픈소스 SW레플리카셋과 달리, 데몬셋은 파드 템플릿 명세를 반드시 갖고 있어야 함
$ kubectl describe daemonset fluentd

클러스터에 새 노드가 추가되면, fluentd 파드가 해당 노드에 자동으로 배포됨!
데몬셋을 특정 노드로 제한
노드에 라벨 추가
kubectl label nodes minikube ssd=true
노드 셀렉터 사용
nodeSelector:
ssd: "trues"
$ kubectl describe daemonset fluentd

데몬셋 업데이트
디플로이먼트와 유사하게, 롤링업데이트 전략 사용
spec.minReadySeconds
롤링업데이트가 파드를 업그레이드하기 전, 파드가 준비 상태로 있어야 하는 시간
30~60초
spec.updateStrategy.rollingUpdate.maxUnavailable
롤링업데이트로 동시에 업데이트할 수 있는 파드의 수
1개