11장. 데몬셋

데몬셋은 모든 노드에 에이전트나 데몬을 실행하기 위한 쿠버네티스 객체

데몬셋은 파드의 복사본이 쿠버네티스 클러스터의 노드 집합에서 실행되게 함

데몬셋은 레플리카셋과 유사하게, 클러스터의 원하는 상태와 관찰된 상태를 동일하게 만듬

노드당 하나의 파드를 실행하기 원한다면, 레플리카셋이 아닌 데몬셋을 사용해야 함

ex) 로그 수집기, 모니터링 에이전트…

데몬셋 스케줄러

데몬셋은 노드 셀렉터를 사용하지 않는 한, 모든 노드에 파드의 복제본을 생성함

노드 셀렉터를 사용하면, 일치하는 라벨 집합을 갖는 노드로 범위를 제한함

새로운 노드가 클러스터에 추가될 경우, 데몬셋 컨트롤러는 파드가 없음을 확인하고 새로운 노드에 파드를 추가함

image
  • 데몬셋 컨트롤러는 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

image
  • 클러스터에 새 노드가 추가되면, fluentd 파드가 해당 노드에 자동으로 배포됨!

데몬셋을 특정 노드로 제한

노드에 라벨 추가

kubectl label nodes minikube ssd=true

노드 셀렉터 사용

nodeSelector:
     ssd: "trues"

$ kubectl describe daemonset fluentd

image

데몬셋 업데이트

디플로이먼트와 유사하게, 롤링업데이트 전략 사용

spec.minReadySeconds

  • 롤링업데이트가 파드를 업그레이드하기 전, 파드가 준비 상태로 있어야 하는 시간

  • 30~60초

spec.updateStrategy.rollingUpdate.maxUnavailable

  • 롤링업데이트로 동시에 업데이트할 수 있는 파드의 수

  • 1개