关注分享主机优惠活动
国内外VPS云服务器

使用 k8s 和 log-- fluid bit 收集 k8s 日志

摘要:它是开源和多平台的,允许您从各种来源收集数据日志,整合它们,并将它们发送到多个目的地。 例如,日志收集和日志分析主要针对已部署的集群。 日志主要包括常用部署日志和日志。 当然,你还需要支持格式日志的收集。 业务介绍日志。 部署计划采用部署。

简介

用于收集日志的组件有很多,包括来自著名的 ELK 产品组合的 Logstash、来自 EFK 产品组合的 filebeat 以及来自初创公司的 Fluentd。 在cncf中。 ,Flume在大数据领域也有广泛的应用。 这次我将主要讨论与 fluentd 属于同一家族的另一种类型的 Fluent bit。

Fluent Bit 是一个开源、多平台日志处理器和转发器,允许您从各种来源收集数据/日志、集成它们并将它们发送到多个目的地。 完全兼容 Docker 和 Kubernetes 环境。 Fluent Bit 采用 C 语言编写,具有可插拔架构,并支持大约 30 个扩展。 它快速、轻量,并提供通过 TLS 进行网络操作所需的安全性。

我选择Fluent Bit的原因是它的高性能。 下面是官方与 Fluentd 的对比图:

Fluentd

流畅位

范围

容器/服务器

容器/服务器

语言

C 和 Ruby

C

内存

~40MB

~450KB

性能

高性能

高性能

依赖

作为Ruby gem构建,所以一定数量的gem是必要的。

没有依赖项,除非特殊插件需要。

插件

超过 650 个可用插件

大约 35 个可用插件

许可证

Apache许可证v2.0

Apache License v2.0

现有插件满足以下条件: 考虑到不同的场景,Fluent Bit 绝对是一个不错的选择。

Fluent Bit简介

使用一定时间后,可以总结如下:它具有以下优点:

支持路由,适合多种输出场景。 比如一些业务日志可能会写入es中进行查询。 或者写入HDFS进行大数据分析。

过滤器支持lua。 不能坚持使用 C 的团队可以用 Lua 编写自己的过滤器。

除了官方支持的几十种输出类型之外,我们还支持用golang编写输出。 例子:我们主要讲一下 Fluent-bit-kafka-output-plugin

k8s 日志采集k8s 日志分析

马苏。 kubeadm部署k8s集群。

Kubelet和etcd日志通常使用systemd部署,它天然支持收集systemd风格的日志。 filebeat 不支持此类型。

Kube-apiserver 和其他组件的 Stderr 和 stdout 日志。 此一般输出的格式因 Docker 日志驱动程序而异。 通常是 json- 文件。

业务介绍日志。 所有支持尾随文件的集合组件均已满足。 这超出了今天讨论的范围。

部署计划

Fluent Bit采用DaemonSet部署。 如下图:

部署yaml

---apiVersion: v1kind: Servicemetadata: name: elasticsearch[k4 ]logging namespace :kube-系统标签:k8s-app:elasticsearch-logging kubernetes.io/cluster-service:“true”addonmanager.kubernetes.io/mode:kubernetes.io/name:“Elasticsearch”规范:端口:- 端口:9200 协议:TCP targetPort:数据库选择器:k8s-app:elasticsearch-logging---# RBAC 调整。   authn 和 authzapiVersion:v1kind:ServiceAccountmetadata:名称:elasticsearch-logging 命名空间:kube-系统标签:k8s-app:elasticsearch-logging kubernetes.io/cluster-service:“true”addonmanager。    kubernetes.io/mode:协调---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:名称:elasticsearch-logging 标签:k8s-app:elasticsearch-logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcilerules:- apiGroups: - "" 资源: - “服务” - “命名空间” [k4 ] “端点”动词:-“获取“---类型:ClusterRoleBindingapi版本:rbac.authorization.k8s.io/v1metadata:命名空间:kube-系统名称:elasticsearch-日志记录标签:k8s-app:elasticsearch[k4 ] ]logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcilesubjects:- kind: ServiceAccount name: elasticsearch-logging 命名空间: kube-system apiGroup: " " roleRef : type: ClusterRole name: elasticsearch-logging apiGroup: ""---# Elasticsearch 部署本身 apiVersion: apps/v1kind: StatefulSetmetadata: name: elasticsearch-logging 命名空间: kube[k4 ]系统标签:k8s-app:elasticsearch-日志记录版本:v6.3.0 kubernetes.io/cluster-service:“true”addonmanager.kubernetes.io/mode:Reconcilespec:serviceName:elasticsearch-logging 副本:2 个选择器:matchLabels:k8s-app:elasticsearch-logging 版本:v6.3.0 模板:元数据:标签:k8s-app:elasticsearch-logging 版本:v6.0 kubernetes.io/cluster-service: "true" 规范: serviceAccountName: elasticsearch-logging 容器: - image: k8s.gcr.io/elasticsearch:v6.3.0 name: elasticsearch-logging 资源: #初始化期间需要更多 CPU 时可突发类限制: cpu: 1000m 请求:cpu: 100m 端口:- 容器端口:9200 名称:db 协议:TCP - 容器端口:9300 名称:传输协议:TCP volumeMounts:- name: elasticsearch-logging mountPath: /data env: - name: "NAMESPACE" valueFrom: fieldRef: fieldPath:metadata.namespace # Elasticsearch 要求 vm.max_map_count 至少为 262144。  # 如果操作系统已存在,请将此数字设置为更高的值。  # 随意删除这个初始化容器。   initContainers: - 图像: alpine:3.6 命令: ["/sbin/sysctl", "-w", "vm.max_map_count= 262144"] 名称: elasticsearch-logging-init securityContext: 权限: truevolumeClaimTemplates:-元数据:名称:elasticsearch-记录注释:volume.beta.kubernetes.io/storage-类:gp2规范:accessModes:-“ReadWriteOnce”资源ces:请求:存储:10Gi---api版本:v1kind:ConfigMapmetadata:名称:流畅-位-config命名空间:kube-系统标签:k8s-app:流畅[ k4]bitdata: # 配置文件:服务器、输入、过滤器、输出 # =================================== = ==================== Fluent-bit.conf: | [Service] 1 Log_Level 刷新信息守护进程 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[ k4]kubernetes.conf: | [Input] 名称结束标记 kube.* 路径 /var /log /容器/*。日志解析器 docker DB /var/log/flb_kube.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 [INPUT] 名称 systemd 标记主机。* Systemd_Filter _SYSTEMD_UNIT=kubelet.service 路径 /var/log/journal DB /var/log/flb_host.db 过滤器-kubernetes.conf:| [FILTER] 名称 kubernetes 匹配 kube。* Kube_URL https://kubernetes.default.svc.cluster.local:443 K8S 上的 Merge_Log-Logging.Parser K8S-Logging.Exclude在 [FILTER] 名称 kubernetes 匹配主机 .* Kube_URL https://kubernetes.default.svc.cluster.local:443 Merge_Log On Use_Journal On Output-elasticsearch.conf: | [Output] 名称匹配 * 主机 ${FLUENT_ELASTICSEARCH_HOST} 端口 ${FLUENT_ELASTICSEARCH_PORT} Logstash_Format On Retry_Limit False parsers.conf: | [PARSER] 名称 apache格式正则表达式 正则表达式 ^(?[^ ]*) [^ ]* (?[^ ]*) [(?[^]]*)] "(?S+) ( ?: +(?[^"]*?)(?: +S*)?)?(?[^ ]*) (?[^]* )(?: " (?[^"]*)" (?[^"]*)")?$ Time_Key 时间 Time_Format %d/%b/%Y:%H:%M:%S %z [解析器] 名称apache2 格式 正则表达式 正则表达式 ^(?[^ ]*) [^ ]* (?[^ ]*) [(?[^]]*)] "( ? S+ ) (?: +(?[^]*) +S*)?" (?[^ ]*) (?[^ ]*)(?: "(?[^"]*)" (?[^ " ]*)")?$ Time_Key 时间 Time_Format %d/%b/%Y:%H:%M:%S %z [解析器] 名称 apache_error 格式 正则表达式 正则表达式 ^[[^ ]* (?[ ^ ]]*)] [(?[^]]*)](?: [pid (?[^]]*)])?( [客户端 (?[^]] * )])? (?.*)$ [解析器] 名称 nginx 格式 正则表达式 正则表达式 ^(?[^ ]*) (?[^ ]*) (?[ ^ ]*) [(?[^]]*)] "(?S+)(?: +(?[^"]*?)(?: +S*)?) ? " (?[^ ]*) (?[^ ]*)(?: "(?[^"]*)" "(?[^"]*)")? $ Time_Key 时间 Time_Format %d/%b/%Y:%H:%M:%S %z [解析器] 名称 json 格式 json Time_Key 时间 Time_Format %d/%b/%Y:%H:%M:%S % z [PARSER] 名称 docker 格式 json Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L Time_Keep On # 命令 | 可选操作 # ========== ==|==================|============== ==== Decode_Field_As 转义日志 [解析器] 名称 Syslog 格式 常规表达式 正则表达式 ^<(?[0-9]+)>(?[^ ]* {1,2}[^ ]* [^ ]*) (? [^ ] *) (?[a-zA-Z0-9_/.-]*)(?:[(?[0-9]+) ])? (?:[^:]*:)? *(?.*)$ Time_Key 时间 Time_Format %b %d %H:%M:%S---apiVersion: 扩展/v1beta1kind : DaemonSetmetadata : 名称: Fluent-bit 命名空间: kube- 系统标签: k8s- 应用程序: Fluent-bit- 日志记录版本: v1 kubernetes.io/cluster-service : "true"规范:模板:元数据a: 标签: k8s- 应用程序: Fluent-bit- 日志记录版本: v1 kubernetes.io/cluster-service: "true" 注释: prometheus.io/scrape: "true" prometheus.io/端口:“2020”prometheus.io/路径:/api/v1/metrics/prometheus 规范:容器:- 名称:fluid-bit 图像:fluid/fluid-bit:1.0.0 imagePullPolicy: 始终端口:-容器端口:2020环境:-名称:FLUENT_ELASTICSEARCH_HOST值:“elasticsearch-logging”-名称:FLUENT_ELASTICSEARCH_PORT值:“9200”volumeMounts:-名称:varlog挂载路径:/var/日志 [ k4] 名称:varlibdockercontainers 挂载路径:/data/docker/containers readOnly:true- 名称: Fluent-bit-config 挂载路径: / Fluent-bit/etc/ TerminationGracePeriodSeconds: 10 卷: - 名称: varlog 主机路径: 路径: /var/log - 名称: varlibdockercontainers hostPath: 路径: /data/docker/containers - 名称: Fluent-bit-config configMap: 名称: Fluent-bit-config serviceAccountName: Fluent-bit Tolerations: [k4 ] 键:node-role.kubernetes.io/master 操作符:Exists 效果:NoSchedule---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name: Fluent- bit - ]readroleRef: apiGroup: rbac.authorization.k8s.io 种类: ClusterRole 名称: Fluent-bit-readsubjects:- 种类: ServiceAccount 名称: Fluent-位命名空间:kube-system---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:名称:fluid-bit-readrules:- apiGroups:[“ "] 资源:- 命名空间 - Pod 动词:["get", "list", "watch"]---apiVersion: v1kind: ServiceAccountmetadata: name: Fluent- bit 命名空间: kube-system---apiVersion: apps/v1kind: 部署元数据: 名称: kibana-logging 命名空间: kube-system 标签: k8s-app : kibana-记录 kubernetes.io/cluster-service:“true”addonmanager.kubernetes.io/mode:Reconcilespec:副本:1 选择器:matchLabels:k8s-app:kibana-日志记录模板:元数据:标签:k8s - 应用程序:kibana- 记录注释:seccomp.security.alpha.kubernetes.io/pod:"docker/default" spec: Container: - Name: kibana-logging image: docker.elastic.co/kibana/kibana-oss:6.3.2 Resources: # 初始化期间需要更多 CPU 所以可突发类限制:CPU:1000m 请求:CPU:100m 环境:- 名称:ELASTICSEARCH_URL 值:http://elasticsearch-logging:9200 端口:- 容器端口:5601 名称:ui 协议:TCP-[k4 ]-apiVersion:v1kind:服务元数据:名称:kibana-logging 命名空间:kube-系统标签:k8s-app:kibana-logging kubernetes.io /cluster-service:“true " addonmanager.kubernetes.io/mode: kubernetes.io/name: 调整“Kibana”注释:service.beta.kubernetes.io/aws-load-balancer-类型:nlbspec:端口:-端口:5601协议:TCP targetPort:ui选择器:k8s-应用程序:kibana-日志记录类型:LoadBalancer ---

概述

现实场景中的日志收集更加复杂。 如果日志量较大,常见的是安装kafka。
另外,请注意日志率。 一般来说,docker都支持这个功能。 这可以通过以下设置来解决:

cat > /etc/docker/daemon.json <<EOF{ "log-opts": { "max-size": "100m" , " max-file": "3" }}EOF

对于k8s上运行的业务日志,不仅要考虑清除旧日志,还要考虑为新pod收集日志。 目前,您经常需要以流畅的方式包装另一层逻辑来获取您需要收集的日志路径。 例如,log-pilot。

未经允许不得转载:主机频道 » 使用 k8s 和 log-- fluid bit 收集 k8s 日志

评论 抢沙发

评论前必须登录!