daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat
namespace: default
labels:
app.kubernetes.io/name: filebeat
spec:
selector:
matchLabels:
app.kubernetes.io/name: filebeat
template:
metadata:
labels:
app.kubernetes.io/name: filebeat
spec:
serviceAccountName: filebeat
terminationGracePeriodSeconds: 30
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.15.0
args:
- "-e"
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
securityContext:
runAsUser: 0
resources: {}
ports:
- name: internal-http
containerPort: 5066
livenessProbe:
httpGet:
path: /
port: internal-http
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: internal-http
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
volumeMounts:
- mountPath: /usr/share/filebeat/filebeat.yml
readOnly: true
name: config
subPath: filebeat.yml
- mountPath: /usr/share/filebeat/data
name: data
- mountPath: /var/lib/docker/containers
readOnly: true
name: varlibdockercontainers
- mountPath: /var/log
readOnly: true
name: varlog
volumes:
- name: config
configMap:
name: filebeat-config
defaultMode: 0640
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: varlog
hostPath:
path: /var/log
- name: data
hostPath:
path: /var/lib/filebeat-data
type: DirectoryOrCreate
- labels는 app.kubernetes.io/name: filebeat을 사용한다. 그래서 마치 Deployment처럼 selector로 매칭을 하게 된다.
- template아래는 Pod 명세이며, image로는docker.elastic.co/beats/filebeat:7.15.0을 사용한다.
- 포트는 internal-http로 5066으로 열었다.
- volumes와 volumesMounts도 각각 잘 매핑될 수 있도록 정의되어 있다.
configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: filebeat-config
namespace: default
data:
filebeat.yml: |
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
http:
enabled: true
host: 0.0.0.0
port: 5066
output.console:
enabled: true
- filebeat.yml이라는 파일을 configmap의 key로하고 내용을 value로 한 걸 볼 수 있다.
- filebeat는 input과 output을 하게 된다.
- input으로는 container 로그 파일을 수집을 해놨고, 이 로그 파일들은 hostPath를 통해서 이전 yml 파일을 마운트를 해뒀기 때문에 전체 컨테이너 로그들에 접근할 수 있는 상태가 된다.
- output은 elasticsearch로 보내거나, logstash로 보내거나, kafka로 보내는 과정을 거치게 되는데 실습은 간단히 하기 위해 console로 로깅하도록 해두었다.
rbac.yml
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: default
labels:
app.kubernetes.io/name: filebeat
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: filebeat
labels:
app.kubernetes.io/name: filebeat
rules:
- apiGroups: [""]
resources:
- namespaces
- nodes
- pods
- services
verbs:
- get
- watch
- list
- apiGroups: ["apps"]
resources:
- replicasets
verbs:
- get
- watch
- list
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: filebeat
labels:
app.kubernetes.io/name: filebeat
subjects:
- kind: ServiceAccount
name: filebeat
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: filebeat
- 이거는 filebeat에 필요한 권한들을 주는 설정이라고 할 수 있다.
실습을 진행해보자.
- kubectl apply -f .
- 모든 yml을 apply한다.
- kubectl get daemonset
- kubectl get node
- Desired와 Current가 1인 걸 알 수 있다.
- 이는 노드의 개수가 1개이기 때문이다.
- kubectl get pod
- filebeat가 1개 띄워진 걸 볼 수 있다.
- kubectl logs pod filebeat-tp2jx
- pod 조회시 얻은 이름을 넣어 실행해보면 로그가 계속해서 찍히는 걸 볼 수 있다.
- 이는 filebeat가 각각의 노드에 존재하는 컨테이너 로그들을 수집(input)해서 콘솔로 계속 output하도록 설정했기 때문이다.