[Retry, k8s] 05. 워크로드 API - 데몬셋

Date:     Updated:

카테고리:

태그:

[Retry, k8s] 05. 워크로드 API - 데몬셋



🔔 데몬셋

데몬셋(DaemonSet)은 각 노드에 파드를 하나씩 배치하는 기능을 제공하는 리소스로, 모든 노드에서 반드시 동작해야 하는 프로세스를 위해 사용하는 것이 유용하다. 예를 들어 각 프드가 출력하는 로그를 호스트 단위로 수집하는 “Fluentd”, 각 파드의 리소스 사용 현황 및 노드 상태를 모니터링하는 Datadog 등이 있다.


🔔 데몬셋의 특징

  • 데몬셋은 각 노드에 파드를 하나씩 배치하는 리소스이기 때문에 모든 노드에서 동작해야 하는 프로세스에 적합하다.

  • 데몬셋은 기본적으로는 레플리카 수를 지정할 수 없지만 배치하고 싶지 않은 노드가 있을 경우 nodeSelector나 노드 안티어피니티를 사용한 스케줄링으로 예외 처리를 할 수 있다.


📜 데몬셋 생성

cat <<EOF > sample-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds
spec:
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
EOF
# 데몬셋이 각 노드에 하나씩 파드가 기동된 것을 확인할 수 있다.
$ kubectl get pod -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP          NODE         NOMINATED NODE   READINESS GATES
sample-ds-4ls67   1/1     Running   0          52s   10.36.0.1   k8s-node02   <none>           <none>
sample-ds-9t5qx   1/1     Running   0          52s   10.44.0.1   k8s-node01   <none>           <none>


📜 데몬셋 업데이트 전략

(a) OnDelete

  • 데몬셋 매니페스트가 변경되었을 때 파드를 업데이트하지 않고 다른 이유로 파드가 다시 생성될 때 새로운 정의로 파드를 생성한다.

  • 디플로이먼트와 달리 데몬셋은 모니터링이나 로그 전송과 같은 용도로 많이 사용하기 때문에 업데이트는 다음 번에 다시 생성할 때나 수동으로 임의의 시점에 하게 되어 있다.

  • OnDelete로 설정하고 아무것도 하지 않을 경우, 다양한 이유로 파드가 정지되어 다시 생성되기 전까지는 업데이트되지 않기 때문에 운영상의 이유로 정지하면 안 되는 파드이거나 업데이트가 급하게 필요 없는 경우 OnDelete 설정으로 사용해도 되지만, 이전 버전이 계속 장기간 사용된다는 점에 주의해야 한다.

cat <<EOF > sample-ds-ondelete.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds-ondelete
spec:
  updateStrategy:
    type: OnDelete
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
EOF

(b) RollingUpdate

  • 데몬셋의 업데이트 전략 기본값은 RollingUpdate이며, 디플로이먼트와 마찬가지로 즉시 파드를 업데이트한다.

  • 디플로이먼트와 달리 하나의 노드에 동일한 파드를 여러 개 생성할 수 없으므로, maxSurge(최대 파드 수)를 설정할 수는 없고, maxUnavailable(동시에 정지 가능한 최대 파드 수)만 지정하여 RollingUpdate를 하게 된다.

  • 예를 들어 maxUnavailable=2 의 경우 파드를 두 개씩 동시에 업데이트해 나가는 형태가 되며, 기본값은 1이고 0으로는 지정할 수 없다.

cat <<EOF > sample-ds-rollingupdate.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: sample-ds-rollingupdate
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
  selector:
    matchLabels:
      app: sample-app
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
        - name: nginx-container
          image: nginx:1.16
EOF


KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기