ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 컨트롤러 : 데몬셋(DaemonSet)
    Kubernetes 2018. 6. 20. 09:00
    반응형
    데몬셋(daemonset)은 클러스터 전체에 포드를 띄울때 사용하는 컨트롤러 입니다. 데몬셋을 이용해서 포드를 실행하면 항상 그 포드가 클러스터 전체 노드에 떠 있게 됩니다. 데몬셋으로 포드를 실행하면 클러스터내에 새롭게 노드가 추가되었을때 자동으로 그 노드에 데몬셋으로 띄운 포드가 실행되게 됩니다. 반대로 노드가 클러스터에서 빠졌을때는 그 노드에 있던 포드는 그대로 사라지고 다른 곳으로 옮겨가서 실행되거나 하지는 않습니다. 그렇기 때문에 데몬셋은 보통 로그수집기를 실행하거나 노드를 모니터링 하는 모니터링용 데몬등 클러스터 전체에 항상 실행시켜 두어야 하는 포드를 실행하는데 사용합니다.

    로그수집기를 실행하는 데몬셋 yaml 샘플은 다음과 같습니다.
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd-elasticsearch
      namespace: kube-system
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd-elasticsearch
      template:
        metadata:
          labels:
            name: fluentd-elasticsearch
        spec:
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          containers:
          - name: fluentd-elasticsearch
            image: k8s.gcr.io/fluentd-elasticsearch:1.20
            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

    데몬셋을 전체 클러스터의 노드가 아니라 특정 노드들에만 선택해서 실행할수도 있습니다. 테인트(taint)와 톨러레이션(toleration) 옵션을 사용하면 그렇게 할 수 있습니다. 테인트가 지정된 노드에는 새로운 포드가 뜰수 없습니다. 거기에 강제로 포드를 띄우기 위해서는 톨러레이션 옵션을 주면 됩니다. 톨러레이션 옵션을 준 포드는 테인트가 있더라도 무시하고 실행됩니다.

    데몬셋을 업데이트하는 방법에는 2가지가 있습니다. .spec.updateStrategy.type에 옵션을 지정하면 되고 OnDelete, RollingUpdate 2가지중 하나를 선택할 수 있습니다. 기본값은 1.5버전 이하와의 하위 호환성을 위해서 OnDelete입니다. OnDelete로 지정된 경우 데몬셋의 템플릿을 수정하더라도 바로 적용되지 않습니다. 변경된 템플릿을 적용하려면 데몬셋으로 실행한 포드를 직접 지워야지 그 노드에 새로운 템플릿 버전의 포드가 실행됩니다. RollingUpdate 으로 지정하면 템플릿을 변경했을때 바로 변경사항이 반영됩니다. 하지만 이때 모든 포드가 한꺼번에 변경되는것이 아니라 지정된 개수 만큼 이전 포드를 내리고 새로운 포드를 실행하게 됩니다. 이때 .spec.updateStrategy.rollingUpdate.maxUnavailable(기본값 1)와 .spec.minReadySeconds 옵션으로 한번에 교체되는 포드 개수를 조절할 수 있습니다.

    반응형

    댓글

Designed by Tistory.