Fluent-bit
- Fluent-bit는 모든 노드에서 컨테이너 로그를 수집하기 위해 daemonset으로 배포되고, Elasticsearch 서비스 엔드포인트에 연결하여 로그를 전달합니다.
- Fluent-bit 없이 Fluentd만 설치하여 로그를 보낼 수 있지만 규모가 큰 클러스터에서는 Fluentd의 작업량이 많아져 부하가 생기기 때문에 로그를 전송하는 역할만하는 Fluent-bit을 따로 설치하는게 좋다.
- Fluent-bit 에서 필요하지 않은 로그를 필터링해 전송하는 로그양을 줄이고 Fluentd에서 파싱을 적절히 하여 ElasticSearch로 전송하는데 도움을 준다.
1. Fluent-bit 서비스 계정 생성
: 서비스 계정은 pod가 수행할 수 있는 작업을 결정하는 pod 집합에 대한 Kubernetes API에 대한 액세스를 제어할 수 있는 Kubernetes 리소스입니다. 역할 및 역할 바인딩을 서비스 계정에 연결하여 Kubernetes API에 액세스할 수 있는 특정 권한을 부여할 수 있습니다. 이는 Kubernetes 역할 및 역할 바인딩 리소스를 통해 수행됩니다.
$ vi fluent-bit-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluent-bit-sa
namespace: efk
labels:
app: fluent-bit-sa
2. Fluent-bit ClusterRole 생성
: 노드 , 포드 및 네임스페이스 개체 와 같은 Kubernetes 리소스의 유창한 비트 서비스 계정에 , get, list, watch 권한을 부여하는 ClusterRole입니다 .
$ vi fluent-bit-cr.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: fluent-bit-role
labels:
app: fluent-bit-role
rules:
– nonResourceURLs:
– /metrics
verbs:
– get
– apiGroups: [""]
resources:
– namespaces
– pods
– pods/logs
verbs: ["get", "list", "watch"]
3. Fluent-bit RoleBinding 만들기
: ClusterRole을 "fluent-bit-sa" 서비스 계정에 바인딩하는 ClusterRoleBinding은 해당 ServiceAccount에 ClusterRole에 정의된 권한을 부여합니다.
$ vi fluent-bit-crb.yaml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluent-bit-rb
roleRef:
kind: ClusterRole
name: fluent-bit-role
apiGroup: rbac.authorization.k8s.io
subjects:
– kind: ServiceAccount
name: fluent-bit-sa
namespace: efk
4. Fluent-bit ConfigMap 만들기
: 이 ConfigMap은 pod 정의에서 ConfigMap 필드를 지정하여 Fluent-bit pod를 구성하는 데 사용됩니다. 이렇게 하면 pod가 시작될 때 configmap에 정의된 구성을 사용합니다. ConfigMap은 업데이트 및 변경이 가능하며 pod 자체를 다시 생성할 필요 없이 반영됩니다.
$ vi fluent-bit-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: fluent-bit-config
namespace: efk
labels:
k8s-app: f-bit-pod
data:
# Configuration files: server, input, filters and output
# ======================================================
fluent-bit.conf: |
[SERVICE]
Flush 1
Log_Level info
Daemon off
Parsers_File parsers.conf
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
@INCLUDE input-kubernetes.conf
@INCLUDE filter-kubernetes.conf
@INCLUDE output-elasticsearch.conf
input-kubernetes.conf: |
[INPUT]
Name tail
Tag kube.*
Path /var/log/containers/*.log
Parser docker
DB /var/log/flb_kube.db
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
filter-kubernetes.conf: |
[FILTER]
Name kubernetes
Match kube.*
Kube_URL <https://kubernetes.default.svc:443>
Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token
Kube_Tag_Prefix kube.var.log.containers.*
Merge_Log On
Merge_Log_Key log_processed
K8S-Logging.Parser On
K8S-Logging.Exclude Off
output-elasticsearch.conf: |
[OUTPUT]
Name es
Match *
Host ${FLUENT_ELASTICSEARCH_HOST}
Port ${FLUENT_ELASTICSEARCH_PORT}
HTTP_User ${FLUENT_ELASTICSEARCH_USER}
HTTP_Passwd ${FLUENT_ELASTICSEARCH_PASSWORD}
Logstash_Format On
Replace_Dots On
Retry_Limit False
parsers.conf: |
[PARSER]
Name apache
Format regex
Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^\\"]*?)(?: +\\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name apache2
Format regex
Regex ^(?[^ ]*) [^ ]* (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^ ]*) +\\S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name apache_error
Format regex
Regex ^\\[[^ ]* (?[^\\]]*)\\] \\[(?[^\\]]*)\\](?: \\[pid (?[^\\]]*)\\])?( \\[client (?[^\\]]*)\\])? (?.*)$
[PARSER]
Name nginx
Format regex
Regex ^(?[^ ]*) (?[^ ]*) (?[^ ]*) \\[(?[^\\]]*)\\] "(?\\S+)(?: +(?[^\\"]*?)(?: +\\S*)?)?" (?[^ ]*) (?[^ ]*)(?: "(?[^\\"]*)" "(?[^\\"]*)")?$
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name json
Format json
Time_Key time
Time_Format %d/%b/%Y:%H:%M:%S %z
[PARSER]
Name docker
Format json
Time_Key time
Time_Format %Y-%m-%dT%H:%M:%S.%L
Time_Keep On
[PARSER]
Name syslog
Format regex
Regex ^\\<(?[0-9]+)\\>(?[^ ]* {1,2}[^ ]* [^ ]*) (?[^ ]*) (?[a-zA-Z0-9_\\/\\.\\-]*)(?:\\[(?[0-9]+)\\])?(?:[^\\:]*\\:)? *(?.*)$
Time_Key time
Time_Format %b %d %H:%M:%S
이 매니페스트 파일의 구성은 다음을 포함하여 여러 섹션을 지정합니다.
- [SERVICE]: 서비스의 플러시 시간과 로그 수준을 지정합니다.
- [INPUT]: Fluent-bit가 로그 데이터를 수집하는 데 사용해야 하는 입력 플러그인을 지정합니다. 이 경우 플러그인은 "tail"이며 지정된 경로의 파일에서 로그를 수집하는 데 사용됩니다. 여기서는 "/var/log/containers/*.log"입니다.
- [FILTER]: Fluent-bit가 로그 데이터를 처리하는 데 사용해야 하는 필터 플러그인을 지정합니다. 다음은 로그 라인에서 Kubernetes 관련 메타데이터를 구문 분석하는 데 사용되는 "kubernetes"입니다.
- [OUTPUT]: 여기에서 Fluent-bit가 로그 데이터를 Elasticsearch로 보내는 데 사용해야 하는 출력 플러그인을 지정합니다. 또한 다른 구성과 함께 Elasticsearch 끝점 호스트 및 포트를 포함합니다.
- [PARSER] 로그 데이터의 형식과 구문 분석 방법을 지정합니다.
5. Fluent-bit Daemonset 만들기
: Fluent-bit Daemonset은 자동으로 모든 노드에서 로그 수집을 시작하고 이를 Elasticsearch로 보냅니다.
$ vi fluent-bit-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: f-bit-pod
namespace: efk
labels:
k8s-app: fluent-bit-logging
version: v1
kubernetes.io/cluster-service: "true"
spec:
selector:
matchLabels:
k8s-app: fluent-bit-logging
template:
metadata:
labels:
k8s-app: fluent-bit-logging
version: v1
kubernetes.io/cluster-service: "true"
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "2020"
prometheus.io/path: /api/v1/metrics/prometheus
spec:
containers:
– name: fluent-bit
image: fluent/fluent-bit:1.3.11
imagePullPolicy: Always
ports:
– containerPort: 2020
env:
– name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch"
– name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
– name: FLUENT_ELASTICSEARCH_USER
value: "elastic"
– name: FLUENT_ELASTICSEARCH_PASSWORD
valueFrom:
secretKeyRef:
name: kibana-password
key: password
volumeMounts:
– name: varlog
mountPath: /var/log
– name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
– name: fluent-bit-config
mountPath: /fluent-bit/etc/
terminationGracePeriodSeconds: 10
volumes:
– name: varlog
hostPath:
path: /var/log
– name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
– name: fluent-bit-config
configMap:
name: fluent-bit-config
serviceAccountName: fluent-bit-sa
tolerations:
– key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
– operator: "Exists"
effect: "NoExecute"
– operator: "Exists"
effect: "NoSchedule"
6. Fluent-bit 배포 확인
: 지속적으로 로그를 생성하는 pod를 생성하면 Fluent-bit가 로그를 올바르게 수집하고 Elasticsearch로 전달하는지 확인할 수 있습니다.
로그를 생성하는 스크립트나 프로그램이 있는 이미지를 이용하여 지속적으로 로그를 생성하는 pod를 생성할 수 있습니다. 예를 들어 이미지를 사용 하고 pod 내부의 루프에서 명령을 실행할 수 있습니다.
Fluent-bit용 테스트 포드를 만들어 보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: log-generator
spec:
containers:
– name: log-generator
image: busybox
command: ['sh', '-c', 'i=0; while true; do echo "$i: Log message"; i=$((i+1)); sleep 1; done']
이를 통해 Fluent-bit가 예상대로 작동하는지 확인할 수 있으며 로그를 수집하여 Kibana에서 분석하고 시각화할 수 있는 Elasticsearch로 전달합니다.
'개발인생 > Kubernetes' 카테고리의 다른 글
Install) EFK(2) - Kibana 설치 (0) | 2023.05.08 |
---|---|
Install) EFK(1) - ElasticSearch 설치 (0) | 2023.05.04 |
install) kubernetes + Harbor (Helm으로 설치) (0) | 2023.02.27 |
install) kubernetes + sonarqube (yaml 파일로 배포하기) (0) | 2023.02.09 |
install) kubernetes + jenkins (yaml 파일로 배포하기) (0) | 2023.02.09 |