들어가며
- 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에 대해 알아보았습니다.
아티클이 유용했나요?
훌륭합니다!
피드백을 제공해 주셔서 감사합니다.
도움이 되지 못해 죄송합니다!
피드백을 제공해 주셔서 감사합니다.
피드백 전송
소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.