Kubernetes

워크로드 API 카테고리(데몬셋)

jih0ssang 2024. 1. 13. 14:32

워크로드 API 카테고리

컨테이너 실행에 관련된 리소스

- 파드

- 레플리케이션 컨트롤러

- 레플리카셋

- 디플로이먼트

- 데몬셋

- 스테이트풀셋

- 잡

- 크론잡

 

데몬셋

데몬셋은 레플리카셋의 특수한 형태이다.

레플리카셋은 각 노드의 상황에 맞게 파드를 배치한다.

모든 노드에 반드시 배치되는 것이 아니고 각 노드의 파드 수가 동일하지도 않다.

그러나 데몬셋은 각 노드에 파드를 하나씩 배치하는 리소스다.

따라서 데몬셋은 레플리카 수를 지정할 수 없고 하나의 노드에 두 개의 파드를 배치할 수 없다.

다만 파드를 배치하고 싶지 않은 노드가 있으면 예외처리(nodeSelector, node AntiAffinity) 할 수 있다.

 

노드를 늘렸을 때도 데몬셋의 파드는 자동으로, 늘어난 노드에서 기동된다.

그래서 데몬셋은

각 파드의 로그를 호스트 단위로 수집하는 fluentd나

각 파드 리소스 사용 현황 및 노드 상태를 모니터링하는 datadog 등

모든 노드에서 반드시 동작해야하는 프로세스를 구동할 때 사용하는 것이 유용하다.

 

데몬셋 생성

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds
spec:
  selector:
    matchLabels:
      apps: value
  template:
    metadata:
      labels:
        apps: value
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16

manifest로 데몬셋을 생성한다.

레플리카셋, 디플로이먼트와는 달리, 레플리카 수 등을 지정하는 항목은 없다.

# 데몬셋 생성
$ kubectl apply -f sample-ds.yaml
daemonset.apps/sample-ds created

 

파드 목록 확인

# 파드 목록 표시
$ kubectl get pods -o wide
NAME		READY	STATUS RESTARTS  AGE  IP 	 NODE
sample-ds-97c	1/1	Running  0	2m2s  10.0.1.31  gke-k8s-default-fkts
sample-ds-gpf	1/1	Running  0      2m1s  10.0.0.22  gke-k8s-default-pase
sample-ds-kfr	1/1	Running  0      2m1s  10.0.2.34  gke-k8s-default-apoe

데몬셋을 확인해보면 각 노드에 하나씩 파드가 기동된 것을 확인할 수 있다.

 

데몬셋 업데이트 전략

데몬셋의 업데이트 전략 기본값은 RollingUpdate이다.

하지만 업데이트 전략은

  • OnDelete
  • RollingUpdate

총 두 가지가 있다.

 

OnDelete

apiVersion: apps/v2
kind: DaemonSet
metadata:
  name: sample-ds-ondelete
spec:
  updateStrategy: 
    type: OnDelete
  selector:
    matchLabels:
      apps: value
  template:
    metadata:
      labels:
        apps: value
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16

OnDelete로 설정하고 아무것도 하지 않을 경우, 다양한 이유로 파드가 정지되어

다시 생성되기 전까지 업데이트되지 않는다.

그렇기 때문에 운영상의 이유로 정지하면 안되는 파드이거나 업데이트가 급하게 필요없는 경우

OnDelete 설정을 사용해도 되지만 이전 버전이 계속 장기간 사용된다는 점을 주의해야 한다.

 

RollingUpdate

데몬셋에서는 하나의 노드에 동일한 파드를 여러 개 생성할 수 없으므로 디플로이먼트와 달리,

동시에 생성할 수 있는 최대 파드 수(maxSurge)를 설정할 수 없다.

동시에 정지 가능한 최대 파드 수(macUnavailable)만 지정하여 RollingUpdate를 하게 된다.

예를 들어, maxUnavailable=2인 경우 파드를 두 개씩 동시에 업데이트해 나가는 형태가 된다.

maxUnavailable의 기본값은 1이며, 0을 지정할 수 없다.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds-rollingupdate
spec:
  updateStrategy:
    type: RollingUpdate
  selector:
    matchLabels:
      apps: value
  template:
    metadata:
      labels:
        apps: value
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.16