카테고리 없음

K8S - 데몬셋(DaemonSet)

미니대왕님 2024. 8. 22. 15:05

0. 데몬셋은 생김새!

데몬셋(DaemonSet)은 클러스터 내의 모든 노드(Work1~10) 에 파드 복제본을 단 하나씩 존재하도록 보장한다.

여러 개의 파드 복제본을 클러스터 내의 여러 노드에 배포한다는 점에서 레플리카셋과 유사하지만, 데몬셋은 각 노드마다 단 하나의 파드만을 배포한다는 차이가 있다.

클러스터 내 새로운 노드가 생겨나면, 데몬셋은 해당 노드에도 파드를 자동으로 배포한다. 마찬가지로 클러스터 내에
존재하던 노드가 사라지면, 그 노드에 데몬셋에 의해 배포되어 있던 파드를 자동적으로 제거(garbage collected)한다.

 

1. 쿠버네티스 데몬셋이란? (DaemonSet)

데몬셋(daemonset)은 클러스터 전체에서 포드를 띄울 때 사용하는 컨트롤러다. 

 

쿠버네티스의 컨트롤러 중 하나인데, 여기서 컨트롤러란 기본 오브젝트를 생성하고 이를 관리하는 역할을 한다.

대표적인 컨트롤러로는 대표적으로 아래와 같다.

1. DaemonSet,

2. Replica Set,

3. Deployment

   그외 Job,StatefulSet 등이 있다. 

 

데몬셋은 디플로이먼트와 유사하게 파드를 생성하고 관리한다. 디플로이먼트는 롤링 업데이트, 배포 일시 중지 등 배포 작업을 세분화한다면 데몬셋은 특정 노드 또는 모든 노드에 실행되어야 할 특정 파드를 관리하는 것이다.

 

데몬셋을 이용해서 포드를 실행하면 해당 포드는 클러스터 전체 노드에 떠 있게 된다. 다시 말해서 클러스터 내에 새롭게 노드가 추가되었을 때 자동으로 그 노드에 데몬셋으로 띄운 포드가 실행되게 되는 것이다.  그림으로 보면 아래와 같다.

당연히 노드가 클러스터에서 빠지게 되면 그 노드에 있던 포드는 그대로 사라지고 다른 곳으로 옮겨가서 실행되거나 하지는 않는다. 따라서 데몬셋은 보통 로그수집기를 실행하거나 노드를 모니터링 하는 등 클러스터 전체에 항상 실행시켜 두어야 하는 포드를 실행할 때 사용한다.

 

테인트(Taints)와 톨러레이션(Tolerations)

Taingts 와 Tolerations 옵션을 사용하면, 데몬셋을 전체 클러스터의 노드가 아니라 특정 노드들에만 선택해서 실행할 수도 있다. Taingts 가 지정된 노드에서는 포드가 뜰 수 없거나, 강제로 포드를 띄우기 위해 Tolerations 옵션을 줄 수 있다.

Taingts Tolerations (우선순위) ( Taingts 옵션보다 Tolerations  옵션이더 우선순위가 높음) 

 

 

2.데몬셋의 활용

데몬셋의 전형적인 활용 예로는 모든 노드에서의 클러스터

   1) 스토리지 데몬(daemon)

   2) 로그 수집 데몬

   3) 노드 모니터링

 

이외에도 모든 워커 노드에 반드시 존재해야 하는 kube-proxy나 네트워킹 솔루션인 weave-net 등 역시 데몬셋의 중요한

활용 예시다.

 

3.데몬셋 생성 방법

YAML 파일에 데몬셋 명세를 작성할 수 있다. 예를 들어 아래 daemonset.yaml 파일은 fluentd-elasticsearch 도커 이미지를 실행하는 데몬셋을 설명한다. YAML 파일을 기반으로 데몬셋을 생성한다.

 
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:
      # 이 톨러레이션(toleration)은 데몬셋이 컨트롤 플레인 노드에서 실행될 수 있도록 만든다.
      # 컨트롤 플레인 노드가 이 파드를 실행해서는 안 되는 경우, 이 톨러레이션을 제거한다.
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        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
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log