데몬셋 (Daemon Set)
데몬셋은 레플리카셋이나 레플리케이션 컨트롤러처럼 object controller의 한 종류로 pod들을 관리하는 컨트롤러이다.
데몬셋은 Node Label 이 일치하는 노드들 에 pod 복제본이 각 1개씩 실행되도록 관리한다. 만약 Node Label에 대해서 따로 설정을 해주지 않는다면 기본적으로 control plane을 제외한 워커로드에서 pod가 1개씩 실행되도록 관리하는 컨트롤러이다.
레플리카셋 또는 레플리케이션 컨트롤러와 차이점은 별도로 pod 복제본 수를 제어하지 않는다는 점이다. 즉, 처음에 생성한 pod에 문제가 생겨서 삭제가 되면 레플리카셋이나 레플리케이션 컨트롤러는 복제본 pod을 스스로 생성해 준다. 그렇지만 데몬셋은 pod이 삭제가 되더어도 다시 pod을 생성하지 않는다. 데몬셋은 복제본 수를 제어하는 컨트롤러가 아니기 때문이다.
데몬셋을 사용하는 경우
- 각 노드들에서 로그들을 수집하는 경우
- 클러스터 스토리지를 각 노드들에서 운영하는 경우
- 각각의 노드들을 모니터링하려는 경우
데몬셋의 노드 레이블을 따로 지정하지 않은 경우
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: example-ds
spec:
selector:
matchLabels:
app: example-ds
template:
metadata:
labels:
app: example-ds
spec:
containers:
- name: example
image: httpd:2.4
ports:
- containerPort: 80
protocol: TCP
노드 1, 2, 3 에서 각각 pod이 하나씩 실행되고 있는 것을 확인할 수 있다.
vagrant@kube-control1:~/work/20230213$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
example-ds-85pqx 1/1 Running 0 14s 192.168.119.145 kube-node3 <none> <none>
example-ds-qcm8l 1/1 Running 0 14s 192.168.233.218 kube-node2 <none> <none>
example-ds-qg785 1/1 Running 0 14s 192.168.9.92 kube-node1 <none> <none>
Node Label을 지정하는 경우
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:alpine
ports:
- containerPort: 8080
protocol: TCP
pod template 의 하위에 있는 spec 필드에서 nodeSelector를 key: value 형태로 지정해주었다. key는 node이고 value는 development가 된다. node들 중에서 node=development 라는 라벨이 있는 node들만 데몬셋에 의해서 pod이 할당될 것이다.
kubectl get nodes --show-labels 명령어로 현재 노드들의 레이블을 확인한다.
vagrant@kube-control1:~/work/20230213$ kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
kube-control1 Ready control-plane,master 4d20h v1.22.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kube-control1,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
kube-node1 Ready <none> 4d20h v1.22.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kube-node1,kubernetes.io/os=linux
kube-node2 Ready <none> 4d20h v1.22.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kube-node2,kubernetes.io/os=linux
kube-node3 Ready <none> 4d20h v1.22.10 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=kube-node3,kubernetes.io/os=linux
node=development 레이블을 가진 노드는 현재 없으므로 pod도 생성되지 않는 것이다.
$kubectl get daemonsets DAEMONSET 명령어로 현재 데몬셋의 목록을 확인한다.
vagrant@kube-control1:~/work/20230213$ kubectl get daemonsets myapp-ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
myapp-ds 0 0 0 0 0 node=development 10s
pod을 할당받고 싶으면 할당받을 Node 에 지정한 노드 레이블을 추가해 주면 된다.
$kubectl label nodes NODE KEY:VALUE
참고 문서
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
'Cloud Engineering > Kubernetes ⚙️' 카테고리의 다른 글
[Kubernetes] Service 의 종류 (0) | 2023.02.16 |
---|---|
[Kubernetes] Jobs (잡)과 CronJob (0) | 2023.02.13 |
[Kubernetes] Replication Controller (레플리케이션 컨트롤러) (0) | 2023.02.11 |
[Kubernetes] 컨테이너 프로브 (Container Probe) (0) | 2023.02.11 |
[Kubernetes] Pod Lifecycle (Pod의 생명주기) 와 컨테이너의 상태 (0) | 2023.02.11 |