获取日志的等级_K8S集群模式下fluentbit日志收集方案设计和实践
「随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中结合作者使用经验,分析和设计 K8s 日志收集实践过程。」1、回顾随着集群规模不断扩大,日志收集问题将一直萦绕在我们耳边,前段时间我用七篇文章安利了使用 fluentd 及 fluent-bit 好处,具体可以参考如下链接:Kubernetes日志收集解决方案Kubernetes集...
「随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中结合作者使用经验,分析和设计 K8s 日志收集实践过程。」
1、回顾
随着集群规模不断扩大,日志收集问题将一直萦绕在我们耳边,前段时间我用七篇文章安利了使用 fluentd 及 fluent-bit 好处,具体可以参考如下链接:
Kubernetes日志收集解决方案
Kubernetes集群环境下fluentd日志收集方案介绍
日志收集工具fluentd安装配置及使用介绍
一文了解日志收集工具fluent-bit
轻量级日志收集转发 | fluent-bit指令详解(一)
轻量级日志收集转发 | fluent-bit配置详解(二)
轻量级日志收集转发 | fluent-bit外部插件详解(三)
下面我就直接介绍fluent-bit整体收集架构和插件,如果对整体有不理解的部分,可以参考如上链接。
单纯的日志收集解决方案特别多,相对非常成熟,比如 ELK、EFK 等,这里不在赘述,本文只针对 Kubernetes 中使用 fluent-bit 日志收集,Kubernetes 下日志收集相对于之前的物理机或者虚拟机的方式略有不同,很大一部分是因为 Kubernetes 的扩容和弹性能力。日志形式种类更多,不仅业务日志,更要考虑 docker、Kubernetes 等组件日志。日志的动态性更强,Kubernetes 集群中节点宕机导致 Pod 自动转移、Pod 销毁、扩容缩容、某些场景提前无法预知。这将导致线上服务出现问题之后,不能集中查看日志、定位问题所在。
2、集中收集方案介绍
fluent-bit 以 ds 方式运行在各个节点,每个节点一个副本,收集完成后,统一发送到fluentd 进行集中日志查看。如下图所示:
DaemonSet 本身能够保证集群中所有节点(如果添加约束,可以控制在部分节点上运行)都运行一个 Pod 副本,当有 Node 加入集群时,也会为他们新增一个 Pod 。当有 Node 从集群移除时,这些 Pod 也会被回收。删除 DaemonSet 将会删除它创建的所有 Pod。通过 Kubernetes DaemonSet 资源的特点,每个节点上运行 fluent-bit,保证每个节点的日志能够收集。
3、Kubernetes yaml实践
3.1、fluent-bit的配置存储在Kubernetes中ConfigMap中
apiVersion: v1kind: ConfigMapmetadata: name: fluent-bit-config labels: k8s-app: fluent-bitdata:# Configuration files: server, input, filters and output# ====================================================== fluent-bit.conf: | [SERVICE] Flush 1 Log_Level info Daemon off @INCLUDE input-kubernetes.conf @INCLUDE output-file.confinput-kubernetes.conf: | [INPUT] Name tail Path /home/logs/biz/biz*.log Db /tmp/biz_log.db Db.sync Full Tag biz-${NODE_NAME} [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 output-file.conf: | [OUTPUT] Name forward Match * Host 110.223.1.1 Port 24221
如上利用了Kubernetes 分布式配置 ConfigMap 的能力,其中 fluent-bit 配置主要分成了三部分;- Service 用于定义 fluent-bit 服务启动设置;
- INPUT 用于定义日志输入信息;
- OUTPUT 用于定义日志输出目的地址,示例中使用了 forward,当然 fluent-bit 本身支持常见数据收集组件,比如:ES、KAFAKA 等。
apiVersion: extensions/v1beta1kind: DaemonSetmetadata: name: fluent-bit labels: k8s-app: fluent-bit-logging version: v1 kubernetes.io/cluster-service: "true"spec: updateStrategy: type: RollingUpdate template: metadata: labels: k8s-app: fluent-bit-logging version: v1 kubernetes.io/cluster-service: "true" spec: containers: - name: fluent-bit image: fluent/fluent-bit:1.3 imagePullPolicy: IfNotPresent command: ["/fluent-bit/bin/fluent-bit","-c", "/fluent-bit/etc/fluent-bit.conf"] env: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: MY_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: MY_POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MY_POD_IP valueFrom: fieldRef: fieldPath: status.podIP resources: requests: cpu: 5m memory: 20Mi limits: cpu: 60m memory: 60Mi volumeMounts: - name: varlog mountPath: /var/log - name: varlibdockercontainers mountPath: /var/lib/docker/containers readOnly: true - name: fluent-bit-config mountPath: /fluent-bit/etc/ - name: biz-logs mountPath: /home/logs/ - 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: biz-logs hostPath: path: /home/logs/ - name: fluent-bit-config configMap: name: fluent-bit-config
DaemonSet是Kubernetes中资源对象,在定义过程中有三点需要注意- 添加resource,即Kubernetes资源配额,保证服务质量,确保正常情况下日志的性能消耗不超过整体 CPU 占用的 5%;
- 日志输出路径要通过hostpath方式挂载到容器内部,否则将无法收集日志信息;
- env本身用于定义环境变量,根据自身需求,eg : 项目需要获取具体节点信息,如上ConfigMap所示,甚至需要获取pod或者容器信息。通过设置 env 可以在 fluent-bit 运行过程中动态获取环境变量。
Kubernetes入门培训(内含PPT) 从Ice到Kubernetes容器技术,微服务架构经历了什么?
原创不易,随手关注或者”在看“,诚挚感谢!
更多推荐
所有评论(0)