Damonset이 뭔가요?

작성자 김아름 수정일 2022-12-02 13:21

#kubernetes, #쿠버네티스, #daemon, #daemonset, #데몬

들어가며

  • k8s의 기본 오브젝트 종류 중 contreoller가 있습니다.

  • controller의 주 역할은 pod를 생성하고 관리합니다.

  • 이 controller의 종류 중 하나인 Daemonset에 대해 알아보겠습니다.




DaemonSet이란?

Daemonset은 cluster 전체에 pod를 띄울 때 사용하는 controller 입니다.

즉, 노드당 1개의 pod를 보장하는 것입니다.


Daemonset을 이용해서 pod를 실행하게 되면, 해당 pod는 cluster 전체 node에 뜨게 됩니다.

만일 node가 추가된다면, 새롭게 추가된 node에도 자동으로 pod가 실행되게 됩니다.


스파클링소다 4.0 기준으로 daemonset을 조회해보면 아래와 같이 출력됩니다.


kubectl get ds -A
NAMESPACE     NAME                                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-system   calico-node                                      2         2         2       2            2           kubernetes.io/os=linux   43d
kube-system   kube-proxy                                       2         2         2       2            2           kubernetes.io/os=linux   43d
kube-system   nvidia-device-plugin-daemonset                   2         2         2       2            2           <none>                   43d
kube-system   nvidia-gpu-exporter                              1         1         1       1            1           <none>                   43d
monitoring    kube-prometheus-stack-prometheus-node-exporter   2         2         2       2            2           <none>                   43d
sodaflow      node-gpus-svc                                    1         1         1       1            1           <none>                   43d


위 출력값에서 DESIRED 값이 1인 daemonset과 2인 daemonset이 있습니다.

현재 cluster의 node는 총 2 입니다.


그렇다면, cluster 전체에 pod를 띄우는 daemonset은 모두 DESIRED 값이 2 이어야 하는걸까요?

그렇지 않습니다.

사실 Daemonset은 모든 노드 혹은 특정 노드에 실행되어야 할 특정 pod를 관리하는 것입니다.


DESIRED 이 2인 daemonset을 좀 더 살펴보겠습니다.


node-gpus-svc 라는 이름의 daemonset은 현재 worker 노드에서만 실행 중 입니다.

kubectl get po -owide | grep node-gpus-svc
NAME                                                      READY   STATUS      RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
node-gpus-svc-9vv4m                                       1/1     Running     2          6d2h   6.2.171.83    worker   <none>           <none>


그 이유는, 해당 daemonset을 정의할 때, affinity 값을 명시했기 때문입니다.

아래 해당 daemonset yaml파일의 일부분을 보겠습니다.

piVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-gpus-svc
  namespace: sodaflow
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: sodaflow/gpu-enabled
                    operator: In
                    values:
                      - "true"


matchExpression의 key값이 sodaflow/gpu-enabled, value값이 true로 설정되어 있습니다.

이는 node의 label 중 sodaflow/gpu-enabled 값이 true 로 설정되어 있는 node에만 실행하도록 한 것입니다.

kubectl get node --show-labels
NAME     STATUS   ROLES    AGE   VERSION    LABELS
master   Ready    master   43d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,master=true,node-role.kubernetes.io/master=,sodaflow/nginx-proxy=true,sodaflow/sodaflow-master-area=true,sodaflow/sodaflow-worker-area=true
worker   Ready    <none>   43d   v1.18.19   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=worker,kubernetes.io/os=linux,ned-test-node-labels=true,sodaflow/gpu-enabled=true,sodaflow/sodaflow-worker-area=true,worker=true


만일, gpu-enable가 true인 label을 가지는 node가 추가된다면 해당 daemonset은 추가된 node에도 pod를 구동시킬 것입니다.


Daemonset은 Rolling Update 및 RollBack 기능도 제공합니다.

kubectl edit daemonset <daemonset name> -n <namespace>
...
imagePullPolicy: Always --> imagePullPolicy: IfNotPresent
...

편집기로 진입한 후, 수정하고 저장하면 기존 pod를 제거하고 새로운 pod를 생성합니다.

kubectl get po -owide -w
NAME                                                      READY   STATUS        RESTARTS   AGE    IP            NODE     NOMINATED NODE   READINESS GATES
node-gpus-svc-9vv4m                                       1/1     Terminating   2          6d2h   6.2.171.83    worker   <none>           <none>
node-gpus-svc-9vv4m                                       0/1     Terminating   2          6d2h   <none>        worker   <none>           <none>
node-gpus-svc-cvkbc                                       0/1     ContainerCreating   0          1s     <none>        worker   <none>           <none>
node-gpus-svc-cvkbc                                       1/1     Running             0          5s     6.2.171.94    worker   <none>           <none>



마무리

  • pod 생성 및 관리하는 k8s의 controller 중 daemonset에 대해 알아보았습니다.

아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300