Kubernetes/05. 컨트롤러 종류 및 설명

[쿠버네티스] 데몬셋이란?

Jaden Park 2021. 6. 17. 16:25

데몬셋 소개

데몬셋 생성

데몬셋 확인

노드 레이블 지정

노드 레이블 제거

데몬셋 삭제


데몬셋 소개

데몬셋(DaemonSet)은 노드 레이블과 매칭이 되는 모든 노드 또는 노드 레이블이 없다면 모든 노드에 파드를 하나씩 배치하는 컨트롤러입니다.

일반적으로 많이 사용하지않는 컨트롤러입니다.

 

기능은 레플리카셋과 비슷하지만 복제본은 지정하지 않습니다. 당연하게도 (노드 레이블과 매칭이 되는) 모든 노드에 하나씩의 파드만을 배치하기 때문입니다.

노드가 추가되면 자동으로 컨트롤러는 하나의 파드를 배치하게 되고, 노드가 제거되면 삭제된 파드를 다른 노드에 배치하지 않습니다. 이는 복제본을 제공하는 컨트롤러가 아니기 때문입니다.

 

 

각각의 노드마다 배치해야되는 특성이 있는 성능 수집이나 로그 수집이나 스토리지 서비스가 필요할 때 사용합니다.


데몬셋 생성

데몬셋 오브젝트의 API 버전 역시 apps 그룹의 v1 버전을 사용합니다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: myapp-ds
spec:
  selector:
    matchLabels:
      app: myapp-ds
  template:
    metadata:
      labels:
        app: myapp-ds
    spec:
      nodeSelector:
        node: development
      containers:
      - name: myapp
        image: ghcr.io/c1t1d0s7/go-myweb
        ports:
        - containerPort: 8080

.spec.template.spec.nodeSelector: 노드 레이블 셀렉터, 파드를 특정 노드에 배치합니다.

노드의 레이블 셀렉터 필드는 레플리케이션 컨트롤러, 레플리카셋, 데몬잡, 잡, 디플로이먼트 컨트롤러에서도 사용할 수 있습니다.


데몬셋 확인

데몬셋을 생성하고 확인해보겠습니다.

DESIRED, CURRENT, READY가 0인 것을 알 수 있습니다. 당연하게도 파드는 생성되지 않습니다.

오브젝트 정의에 노드셀렉터로 node=development 레이블을 선택하도록 정의하였습니다. 이 때문에 노드 레이블과 매칭되는 노드가 없기 때문에 아무 파드를 생성하지 않습니다.

노드의 레이블을 확인하기 위해 --show-labels 옵션을 사용하면 노드에 설정된 레이블을 확인할 수 있습니다.

LABELS 필드에 보이는 값이 노드 레이블입니다. 지금 확인되는 레이블들은 기본적으로 쿠버네티스 클러스터에 필요에 의해 사용하는 레이블입니다. 해당 레이블에는 node=development라는 레이블이 없으므로 매칭되는 노드가 없는 것이며, 이에 파드는 생성되지 않습니다.


노드 레이블 지정

생성한 데몬셋 오브젝트가 파드를 생성하기 위해 노드에 레이블 추가로 지정해보겠습니다. 추가할 레이블은 오브젝트에 정의한 node=development 레이블입니다.

kube-node1 노드에 node=development 노드 레이블을 설정해보겠습니다.

$ kubectl label nodes kube-node1 node=development
node/kube-node1 labeled

다시 데몬셋 상태를 확인해보면 파드가 실행된 것을 확인할 수 있습니다.


노드 레이블 제거

노드 레이블을 제거하여 데몬셋이 실행되는 파드를 제거할 수 있습니다. 레이블 제거는 레이블 값을 제거할 수도 있고, 레이블의 키를 제거할 수도 있습니다. 키를 제거한다는 것은 값도 제거된다는 의미입니다.

노드 레이블 값 제거

$ kubectl label node kube-node1 node-

혹은

$ kubectl label node kube-node1 node='' --overwrite

노드 레이블 셀렉터와 매칭이 되지 않기 떄문에 pod는 제거되게 됩니다.