목차

목차

Kubernetes DaemonSet

목차
  • Deployment와 유사하지만 노드단위 배포로 이루어지기에 Replicas 옵션은 없다

  • 노드의 백그라운드에서 항상 Pod를 데몬으로 실행할 수 있게 해주는 workload resource

    • 모니터링 시스템, 로그 수집 에이전트, 노드 데이터 백업과 같은 장기간 지속되는 작업
  • 업데이트 전략 기본은 RollingeUpdate (or OnDelete)

    • “OnDelete” → 이전 데몬이 종료된 경우에만 교최
  • Taint와 toleration 옵션을 사용하여 특정 노드에 배포 선택 가능

  • 대규모 클러스터인경우 nodeSelector를 사용하여 특정 노드 선택가능

    • 로그 수집할 노드에 라벨링 → kubectl label node 노드명 log-collect-node=true
noedSelector:
  log-collect-node: "true"
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: #마스터 노드에 설정 안할려면 이부분 삭제
      # these tolerations are to have the daemonset runnable on control plane nodes
      # remove them if your control plane nodes should not run pods
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      nodeSelecter: #노드를 정하여 사용도 가능
        gpu: nvidia
      containers:
      - name: fluentd-elasticsearch
        image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
      # it may be desirable to set a high priority class to ensure that a DaemonSet Pod
      # preempts running Pods
      # priorityClassName: important
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
#현재 사용중인 daemonSet
$ kubectl get ds -A
NAMESPACE        NAME                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
default          kubeshark-worker-daemon-set   3         3         3       3            3           <none>                   12d
kube-system      calico-node                   3         3         3       3            3           kubernetes.io/os=linux   12d
kube-system      kube-proxy                    3         3         3       3            3           kubernetes.io/os=linux   12d
metallb-system   speaker                       3         3         3       3            3           kubernetes.io/os=linux   8d
openebs          openebs-ndm                   2         2         2       2            2           <none>                   7d23h
openebs          openebs-ndm-node-exporter     2         2         2       2            2           <none>                   7d23h

#생플코드 실행
$ kubectl apply -f https://k8s.io/examples/controllers/daemonset.yaml

$ kubectl get ds,po -A -o wide | grep fluentd
kube-system      daemonset.apps/fluentd-elasticsearch         3         3         3       3            3           <none>                   40s     fluentd-elasticsearch   quay.io/fluentd_elasticsearch/fluentd:v2.5.2                            name=fluentd-elasticsearch
kube-system            pod/fluentd-elasticsearch-5qjts                     1/1     Running     0          40s     10.109.131.32    k8s-node2    <none>           <none>
kube-system            pod/fluentd-elasticsearch-jgzp4                     1/1     Running     0          40s     10.111.156.107   k8s-node1    <none>           <none>
kube-system            pod/fluentd-elasticsearch-w64nd                     1/1     Running     0          40s     10.108.82.193    k8s-master   <none>           <none>

#노드별 시핻된 것 확인
$ kubectl describe pod fluentd-elasticsearch --namespace=kube-system | grep Node:
Node:             k8s-node2/10.10.10.92
Node:             k8s-node1/10.10.10.91
Node:             k8s-master/10.10.10.90

#마스터 노드 제외 taint(tolerations)삭제후 실행 및 라벨링을 통한 노드 지정하여 실행
#라벨 지정방법 kubectl label nodes 노드명 gpu=nvidia