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