DaemonSet
은 Deployment
와 비슷하게 pod를 관리하지만, 재밌게도 node
마다 pod를 관리한다는 것이다.
가령, DaemonSet
을 하나 만들어서 node마다 하나의 pod를 만들라고하면, node마다 하나의 pod씩이 만들어지고 DaemonSet
이 이를 관리하는 것이다.
----------------------------
| DeamonSet |
----------------------------
| | |
| | |
--Node1-- --Node2-- --Node3--
| pod1 | | pod2 | | pod3 |
--------- --------- ---------
위의 그림과 같이 DaemonSet
은 각 node마다 정의한 pod를 1개씩 배포한다. 만약 특정 node에서 pod가 다운되면, DaemonSet
이 이를 확인하여 pod
하나를 새로 다시 해당 node에 올려준다.
DaemonSet
의 정의는 ReplicaSet
과 거의 동일하다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: monitoring-daemon
spec:
selector:
matchLabels:
app: monitoring-daemon
template:
metadata:
labels:
app: monitoring-daemon
spec:
containers:
- name: monitoring-daemon
image: monitoring-daemon
ReplicaSet
이 selector
와 template
를 가지고 있는 것과 같이, DamonSet
역시도 마찬가지이다.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: monitoring-daemon
spec:
selector:
matchLabels:
app: monitoring-daemon
template:
metadata:
labels:
app: monitoring-daemon
spec:
nodeSelector:
disk: ssd
containers:
- name: monitoring-daemon
image: monitoring-daemon
거의 ReplicaSet
과 동일한데, 재미난 점은 spec.nodeSelector
의 target이 node
라는 것이다. node
가 가지고 있는 label
이 nodeSelector
에 해당한다면 template
에 있는 pod
를 node
에 배포하는 것이다. 여기서는 disk: ssd
label을 가진 node에 template
에 있는 pod를 배포하겠다는 것이다. 만약 nodeSelector
로 target node를 쓰지 않으면 모든 node에 pod가 배포된다.
참고로 daemonset
은 replicas
가 없다. 따라서 node
당 하나의 pod만 생성하는 로직이라고 생각하면 된다.
DeamonSet
이 동작하는 방식은 매우 간단하다. default scheduler와 NodeAffinity를 사용하여 해당하는 node에 pod를 할당하고 모니터링하는 것이 전부이다.
이렇게 각 node마다 pod를 배포하고 관리한다는 측면에서 node의 자원량을 모니터링하거나 node에 저장된 각 pod log들을 가져온다는 측면에서 강점이 있다.
kubectl get daemonsets
만약 daemonset을 만들라는 문제가 나온다면, deployment
를 만든 다음에 불필요한 값들을 삭제해주면 된다.
kubectl create deployment elasticsearch --image elasticsearch:latest --dry-run client -o yaml > daemonset.yaml