- ReplicationController
- ReplicaSet
- Deployment
- DaemonSet ← 오늘 볼 내용
- StatefulSet
- Job
- CronJob
4. DaemonSet
DaemonSet은 쿠버네티스에서 런타임 환경이나 로그 수집과 같은 특정한 작업을 클러스터의 모든 노드에 분산하여 실행할 때 사용되는 리소스다.
각 노드에 하나의 파드가 실행되도록 보장하여 클러스터 전체에서 특정한 서비스나 작업을 유지할 수 있도록 도와준다.
DaemonSet이 관리하는 파드는 노드의 상태에 따라 자동으로 생성되거나 삭제되어 노드가 추가되거나 제거될 때 자동으로 조정된다.
DaemonSet의 주요 특징
- 클러스터 전체에 특정한 서비스 제공 : 모든 노드에 특정한 서비스, 데몬, 에이전트 등을 배포하고자 할 때 사용됩니다.
- 노드에 자동으로 배포 : 새로운 노드가 클러스터에 추가되면 자동으로 해당 노드에 파드가 배포됩니다.
- 노드에서 자동으로 제거 : 노드가 클러스터에서 제거되면 해당 노드에 있던 파드도 자동으로 제거됩니다.
- 로그 수집 에이전트, 모니터링 에이전트 등의 배포 : 로그 수집, 모니터링, 보안 등의 용도로 각 노드에 특정한 에이전트를 배포할 때 유용합니다.
기본 형태
ReplicaSet definition | DaemonSet definition |
apiVersion: apps/v1 kind: ReplicaSet metadata: name: rs-nginx spec: replicas: 3 selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.24 |
apiVersion: apps/v1 kind: DaemonSet metadata: name: daemonset-nginx spec: selector: matchLabels: app: webui template: metadata: name: nginx-pod labels: app: webui spec: containers: - name: nginx-container image: nginx:1.24 |
DaemonSet은 ReplicaSet이나 Deployment 등 다른 오브젝트와 구성을 거의 비슷하다.
다만 DaemonSet은 노드 당 파드 하나를 보장하기 때문에 replicas 필드가 필요없다.
예제
데몬셋 yaml 파일 생성
위 코드를 그대로 사용해서 데몬셋을 생성한다.
# daemonset-nginx.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: daemonset-nginx
spec:
selector:
matchLabels:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.24
node3 삭제
그 전에 노드 하나를 삭제하고 노드가 추가되었을 때 데몬셋이 어떻게 동작하는지 확인해보자.
node3을 삭제한다.
# node3 삭제
kubectl delete node node3
데몬셋 실행
# DaemonSet 실행
kubectl create -f daemonset-nginx.yaml
node3 추가
node3에는 이전에 마스터와 접속되었던 이력이 남아있기에 노드를 초기화 시킨다.
# 반드시 워커 노드에서 실행
kubeadm reset
먼저는 새로운 워커노드가 조인할 수 있는 token이 필요하다.
이미 존재하는 토큰이 있는지 확인한다.
# token 확인
kubeadm token list
만약 토큰이 있다면 그것을 이용해서 사용해도 되지만 어차피 토큰은 생성된 후 24시간이 지나면 사라지기 때문에 없애도 굳이 큰 상관은 없다.
단순히 토큰은 다른 노드와 조인하기 위한 수단이기에 만약 존재하면 지운다.
# token 삭제
kubeadm token delete <토큰 이름>
다음은 토큰을 새로 생성하는 명령이다.
# token 생성
kubeadm token create --print-join-command --ttl 30m
- --print-join-command : 워커노드에 입력할 수 있는 명령을 함께 출력
- --ttl 30m : 생성한 토큰의 유효기간을 30분으로 지정
실패했을 경우
--v=5
위 플래그를 추가로 기재하면 디버그 레벨 5로 실행되므로 스택 트레이스를 포함한 자세한 오류 메시지를 출력합니다. 이를 통해 해당 플래그가 인식되지 않는 원인을 더 자세히 파악할 수 있습니다.
생성되는 명령은 다음과 같은 형태를 가진다.
# 새로운 워커 노드에서 실행
kubeadm join <마스터-노드-주소>:<포트> --token <토큰> --discovery-token-ca-cert-hash <해시값>
위 명령을 실행하면 node3가 다시 조인된다.
조인을 수행하면 즉시 데몬셋 컨트롤러에 의해 node3에 파드를 하나 배포한다.
조인되었을 때 다시 파드의 상태를 확인한다.
데몬셋의 특성 확인
데몬셋 컨트롤러는 각 노드 당 파드 하나를 반드시 보장하는 컨트롤러이므로 만약 생성된 파드 중 하나가 삭제되더라도 해당 노드에 다시 생성해준다.
롤링 업데이트
데몬셋은 롤링 업데이트도 지원한다.
# Rolling Update를 위한 데몬셋 구성 편집
kubectl edit daemonset daemonset-nginx
이와 같이 데몬셋은 롤링 업데이트가 가능하다.
히스토리
히스토리도 확인이 가능하며
롤백
롤백도 가능하다.
이와 같은 특성을 지니고 있는 것이 데몬셋이기에 로그/모니터링 에이컨트에 적합한 컨트롤러라고 할 수 있다.
필요한 상황에서 잘 써먹어보자.
아래 영상을 참고했습니다.
https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE
'Kubernetes' 카테고리의 다른 글
Kubernetes 기초 - Controller(6) (0) | 2023.12.15 |
---|---|
Kubernetes 기초 - Controller(5) (0) | 2023.12.14 |
Kubernetes 기초 - Controller(3) (0) | 2023.12.14 |
Kubernetes 기초 - Controller(2) (0) | 2023.12.12 |
Kubernetes 기초 - Controller(1) (0) | 2023.12.11 |