Kubernetes

Kubernetes 기초 - Controller(4)

사실 나도 모름 2023. 12. 14. 05:27
  1. ReplicationController
  2. ReplicaSet
  3. Deployment
  4. DaemonSet        ←  오늘 볼 내용
  5. StatefulSet
  6. Job
  7. 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

node3 제

 

 

 

데몬셋 실행
# DaemonSet 실행
kubectl create -f daemonset-nginx.yaml

삭제된 node3을 제외한 나머지에 파드가 하나씩 생성

 

 

 

 

node3 추가

 

node3에는 이전에 마스터와 접속되었던 이력이 남아있기에 노드를 초기화 시킨다.

# 반드시 워커 노드에서 실행
kubeadm reset

node3 초기화

 

 

먼저는 새로운 워커노드가 조인할 수 있는 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가 다시 조인된다.

조인을 수행하면 즉시 데몬셋 컨트롤러에 의해 node3에 파드를 하나 배포한다.

조인되었을 때 다시 파드의 상태를 확인한다.

node3 조인 후 파드 하나 더 생성
데몬셋 상태

 

 

 

데몬셋의 특성 확인

 

데몬셋 컨트롤러는 각 노드 당 파드 하나를 반드시 보장하는 컨트롤러이므로 만약 생성된 파드 중 하나가 삭제되더라도 해당 노드에 다시 생성해준다.

파드 삭제하면 다시 생성

 

 

 

롤링 업데이트

 

데몬셋은 롤링 업데이트도 지원한다.

# Rolling Update를 위한 데몬셋 구성 편집
kubectl edit daemonset daemonset-nginx

다음과 같이 수정한다
노드 하나씩 롤링 업데이트 중

 

이와 같이 데몬셋은 롤링 업데이트가 가능하다.

 

 

히스토리

히스토리

 

히스토리도 확인이 가능하며

 

 

롤백

롤백

 

롤백도 가능하다.


 

 

 

 

이와 같은 특성을 지니고 있는 것이 데몬셋이기에 로그/모니터링 에이컨트에 적합한 컨트롤러라고 할 수 있다.

필요한 상황에서 잘 써먹어보자.

 

 


 

 

아래 영상을 참고했습니다.

https://youtube.com/playlist?list=PLApuRlvrZKohaBHvXAOhUD-RxD0uQ3z0c&si=hbPclcPuc-6lTNdE

 

[따배쿠] 쿠버네티스 시리즈

 

www.youtube.com

 

'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