DaemonSets 란?

DaemonSets은 모든 node가 pods의 사본을 실행하도록 한다. node가 cluster에 추가되면 pod가 추가되고 node가 cluster에서 제거되면 pod는 garbage collecting 된다. DaemonSets을 삭제하면 DaemonSets이 생성한 pods가 정리된다.


사용용도

  • 모든 node에 cluster storage daemon 실행
  • 모든 node에 logs collection daemon 실행
  • 모든 node에 node monitoring daemon 실행


생성 fluentd-elasticsearch docker image를 실행하는 예제

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      tolerations:
      # this toleration is to have the daemonset runnable on master nodes
      # remove it if your masters can't run pods
      - key: node-role.kubernetes.io/master
        effect: NoSchedule
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
  • DaemonSet 객체의 이름은 DNS subdomain name에 의거해야한다.
  • .spec.template은 pod template으로 Pod와 같은 schema를 갖고 있다. (apiVersion 또는 kind가 없는것을 빼고) Pod Template에서 DaemonSet은 RestartPolicy가 반드시 있어야 한다.
  • .spec.selector field는 pod selector이며 Job의 .spec.selector와 같은 역할을 한다. .spec.selector는 두가지 필드로 구성된다.

  • matchLables : ReplicationController의 .spec.selector과 같은 역할
  • matchExpressions : key와 values로 좀 더 복잡한 selector로 빌드해준다.

  • .spec.selector가 특정되어지면 .spec.template.metadata.labels과 일치해야한다.

  • .spec.template.spec.nodeSelector를 특정했으면, DaemonSet controller는 node selector에 맞게 nodes에 pods를 생성할 것이다. .spec.template.spec.affinity를 특정했으면, DaemonSet controller는 node affinity에 맞게 nodes에 pods를 생성할 것이다.


Taints 와 Tolerations DaemonSet pods는 tains와 tolerations를 존중하지만, 다음과 같은 기능에 따라 자동적으로 DaemonSet pod에 toleration을 추가한다.

toleration key effect version description
node.kubernetes.io/not-ready NoExecute 1.13+ network partition과 같은 node 문제가 발생해도 DaemonSet pod는 축출되지 않는다.
node.kubernetes.io/unreachable NoExecute 1.13+ 위와 동일
node.kubernetes.io/disk-pressure NoSchedule 1.8+  
node.kubernetes.io/memory-pressure NoSchedule 1.8+  
node.kubernetes.io/unchedulable NoSchedule 1.12+ DaemonSet pod는 기본 스케줄러의 스케줄할 수 없는 속성을 극복한다.
node.kubernetes.io/network-unavailable NoSchedule 1.12+ 호스트 네트워크를 사용하는 daemon set pod는 기본 스케줄러에 의해 이용할 수 없는 네트워크 속성을 극복한다.


Daemon pod와 통신

  • push : daemonSet pod는 통계 데이터베이스와 같은 다른 서비스로 업데이트를 보내도록 구성되어있다.
  • NodeIP and Known Port : DaemonSet의 Pods는 hostport를 사용할 수 있다. node IP들을 통해 pods는 닿을 수 있다.
  • DNS : 같은 pod selector로 headless service를 만들고, endpoints 또는 DNS로부터 여러개의 A records를 검색해서 DaemonSets을 찾는다.
  • Service : 같은 pod selector로 service를 만들고, random node에 닿는다.


DaemonSet 업데이트

node label이 바뀌면 DaemonSet은 즉시 맞는 node에 pods를 배치하고 안맞는 node의 pods를 제거한다. DaemonSet이 만든 Pods를 바꿀 수 있다. 그러나 모든 필드가 바뀌진 않을것이다. 또한, 다음번에 node가 만들어질때 기존의 template을 사용할 것이다. –cascade=false 옵션을 주고 kubectl로 DaemonSet을 삭제하면 pods는 node에 남아있다. 다시 같은 selector로 DaemonSet를 만들면 새로운 DaemonSet은 존재하는 Pods를 채택한다.


출처

https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/