[k8s] daemonset

daemonset์€ daemon ์‹œ์Šคํ…œ์„ ๋„์šฐ๋Š”๋ฐ ์ตœ์ ํ™”๋œ ํŒŒ๋“œ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์œ„๋‹ค.
๋ฐ๋ชฌ์ด๋ž€ ๊ทธ๋ƒฅ 365์ผ 24์‹œ๊ฐ„ ๋‘ฅ๋‘ฅ ๋– ์„œ ๋ฃจํ”„ ๋Œ๋ฉด์„œ ๊ณ„์† ๋ญ”๊ฐ€๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค.

๋ฐ๋ชฌ์…‹ ๋ชฉ๋ก์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get daemonsets --all-namespaces

๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ๊ด€๋ฆฌ ๋„๊ตฌ calico์™€ ๋‚ด๋ถ€ ํ”„๋ก์‹œ๊ฐ€ ๋ฐ๋ชฌ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฑธ ์ง€๊ธˆ ๊ฑด๋“ค ์ผ์€ ์—†๊ณ , ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.




daemonset ๋งŒ๋“ค์–ด๋ณด๊ธฐ

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ yaml๋กœ ๋ง์•„์ฃผ๋ฉด ๋œ๋‹ค.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: test-daemon
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: test-daemon
  template:
    metadata:
      labels:
        name: test-daemon
    spec:
      tolerations:
      # ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์€ ๋ฐ๋ชฌ์…‹์ด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.
      # ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๊ฐ€ ์ด ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ, ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ œ๊ฑฐํ•œ๋‹ค.
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: test-daemon
        image: myyrakle/node-daemon-for-test # ๋„์ปค ์ด๋ฏธ์ง€
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

์—ฌ๊ธฐ์„œ myyrakle/node-daemon-for-test๋Š” ๋‚ด๊ฐ€ ๋ง์•„๋†“์€ ์ด๋ฏธ์ง€์ธ๋ฐ, ๊ทธ ๊ตฌ์„ฑ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด
https://github.com/myyrakle/infrastructures/tree/master/Dockerfiles/examples/node-daemon-for-test
์—ฌ๊ธฐ์„œ ๋ณด๋ฉด ๋œ๋‹ค.
1์ดˆ๋งˆ๋‹ค ์žฌ์‹คํ–‰๋˜๋ฉด์„œ ํ˜„์žฌ ๋‚ด๋ถ€ IP์™€ ์‹œ๊ฐ„๋งŒ ์ฝ˜์†”๋กœ ์ฐ์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.

์ €๊ฑธ ์ƒ์„ฑํ•˜๋ฉด

์ด์ œ ๋ฐ๋ชฌ ๋ชฉ๋ก์— ๋œจ๊ฒŒ ๋œ๋‹ค.

ํŒŒ๋“œ ๋กœ๊ทธ๋ฅผ ๋ฝ‘์•„๋ณด๋ฉด

์ •์ƒ์ ์œผ๋กœ ์ฐํžˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • daemonset์œผ๋กœ ๋ฌถ์ธ ํŒŒ๋“œ๋ฅผ ์ „์ฒด์กฐํšŒํ•˜๊ณ ์‹ถ๋‹ค๋ฉด, ๋ ˆ์ด๋ธ”๋ช…์„ ํ†ตํ•ด ๋ณด๋Š”๊ฒŒ ํŽธํ•˜๋‹ค.

kubectl logs -l name=์ด๋ฆ„ ...
kubectl logs -l name=test-daemon --namespace=kube-system




๋กค๋ง ์—…๋ฐ์ดํŠธ๋กœ ์žฌ๋ฐฐํฌํ•˜๊ธฐ

๋ญ”๊ฐ€ ์ฝ”๋“œ์˜ ๋ณ€๊ฒฝ์ด ์žˆ๋‹ค๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ๋ฐ›๊ณ  ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋„์šฐ๋Š”๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค.

๊ทธ ์ž‘์—…์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ updateStrategy๋กœ ์—…๋ฐ์ดํŠธ ์ „๋žต์„ ๋ช…์‹œํ•ด์ฃผ๊ณ 

updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1

๋ฐฐํฌ๋ฅผ ๋„์šธ๋•Œ๋งˆ๋‹ค ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กœ ๋ฐ›์•„์˜ค๋„๋ก ์•„๋ž˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

imagePullPolicy: Always

์•ˆ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฏธ์ง€ ๋ฒ„์ „์„ :latest๋กœ ๋ฐ•๋”๋ผ๋„, ์ด์ „์— ๋ฐ›์•˜๋˜๊ฑธ ๊ณ„์† ์žฌํƒ•ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ yaml์„ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์„œ

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: test-daemon
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: test-daemon
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
  template:
    metadata:
      labels:
        name: test-daemon
    spec:
      tolerations:
      # ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์€ ๋ฐ๋ชฌ์…‹์ด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ ๋‹ค.
      # ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๊ฐ€ ์ด ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ฒฝ์šฐ, ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜์„ ์ œ๊ฑฐํ•œ๋‹ค.
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: test-daemon
        image: myyrakle/node-daemon-for-test
        imagePullPolicy: Always
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

apply๋ฅผ ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  rollout ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์„œ ์žฌ๋ฐฐํฌ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๊ฑธ๋ฉด ๋œ๋‹ค.

kubectl rollout restart daemonset/test-daemon --namespace=kube-system

์žฌ๋ฐฐํฌ ์ƒํƒœ๋Š” ์•„๋ž˜ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl rollout status daemonset/test-daemon -n kube-system

์ด๋ ‡๊ฒŒ ์„ฑ๊ณต์ด ๋œจ๋ฉด ์ด์ œ

๋ฐฐํฌํ•œ๋Œ€๋กœ ๋ฐ˜์˜์ด ์ž˜ ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

์ด์ „๋ฒ„์ „์—๋Š” ๋กœ๊ทธ์— ์˜คํƒ€๊ฐ€ ๋“ค์–ด๊ฐ€์„œ ")}"์ด ๋ถˆํŽธํ•˜๊ฒŒ ๋ถ™์—ˆ์—ˆ๋Š”๋ฐ, ์ด์ œ๋Š” ๋œจ์ง€ ์•Š๋Š”๋‹ค.




daemonset ์‚ญ์ œ

๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋“ค๊ณผ ๋งคํ•œ๊ฐ€์ง€๋กœ, delete daemonsets ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ”๋กœ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค.



์ฐธ์กฐ
https://kubernetes.io/ko/docs/concepts/workloads/controllers/daemonset/
https://kubernetes.io/ko/docs/reference/kubectl/cheatsheet/
https://stackoverflow.com/questions/33112789/how-do-i-force-kubernetes-to-re-pull-an-image