[Kubernetes] Daemonset


서론

DaemonSet은 클러스터의 모든 노드에 파드가 항상 하나씩 존재하도록 보장한다.

새로운 노드가 클러스터에 추가되면, 해당 노드에 자동으로 파드 복제본이 추가되고 반대로 노드가 제거되면, 해당 노드의 파드도 자동으로 제거된다.

데몬셋에 대해서 알아보자.

Daemonset

동작방식

  • Kubernetes 1.12 이전에는 nodeName을 직접 지정해서 스케줄러를 우회하여 각 노드에 수동 배포하였다.
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
spec:
  containers:
    - name: nginx
      image: nginx
  nodeName: <target-node>  # <target-node>이라는 노드에 직접 배치됨
  • 그러나 1.12 이후에는 스케줄러를 사용하는 대신에 node affinity로 자동 배포로 관리한한다.
# 스케줄러가 내부적으로 다음과 같은 조건을 자동 부여함
nodeAffinity:
  requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
      - key: kubernetes.io/hostname
        operator: In
        values:
        - <target-node>

Usecase

  • 클러스터의 각 노드에 모니터링 에이전트나 로그 수집기를 배포하여 클러스터를 모니터링하고 싶은 경우 사용된다.
  • 앞서 Kubernetes 아키텍처에서, 클러스터의 모든 노드에 반드시 존재해야 하는 컴포넌트 중 하나가 kube-proxy이다. 이 컴포넌트 또한 데몬셋으로 배포된다.
  • 네트워크 CNI 등도 이에 해당된다.

Yaml 작성법

  • Replicaset과 유사하다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: mnitoring-daemon
spec:
  selector:
    matchLabels:
      app:monitoring-agent
  template:
    metadata:
      labels:
        app: monitoring-agent
    spec:
      containers:
      - name: monitoring-agent
        image: monitoring-agent