摘要:是一個開源和多平臺的,它允許您從不同的來源收集數據日志,統一并將它們發送到多個目的地。例如日志收集日志分析主要講部署的集群。日志主要有和的日志,一般采用部署,自然而然就是要支持格式日志的采集。業務落盤的日志。部署方案采取部署。
前言
收集日志的組件多不勝數,有ELK久負盛名組合中的logstash, 也有EFK組合中的filebeat,更有cncf新貴fluentd,另外還有大數據領域使用比較多的flume。本次主要說另外一種,和fluentd一脈相承的fluent bit。
Fluent Bit是一個開源和多平臺的Log Processor and Forwarder,它允許您從不同的來源收集數據/日志,統一并將它們發送到多個目的地。它與Docker和Kubernetes環境完全兼容。Fluent Bit用C語言編寫,具有可插拔的架構,支持大約30個擴展。它快速輕便,通過TLS為網絡運營提供所需的安全性。
之所以選擇fluent bit,看重了它的高性能。下面是官方貼出的一張與fluentd對比圖:
Fluentd | Fluent Bit | |
---|---|---|
Scope | Containers / Servers | Containers / Servers |
Language | C & Ruby | C |
Memory | ~40MB | ~450KB |
Performance | High Performance | High Performance |
Dependencies | Built as a Ruby Gem, it requires a certain number of gems. | Zero dependencies, unless some special plugin requires them. |
Plugins | More than 650 plugins available | Around 35 plugins available |
License | Apache License v2.0 | Apache License v2.0 |
在已經擁有的插件滿足需求和場景的前提下,fluent bit無疑是一個很好的選擇。
fluent bit 簡介在使用的這段時間之后,總結以下幾點優點:
支持routing,適合多output的場景。比如有些業務日志,或寫入到es中,供查詢。或寫入到hdfs中,供大數據進行分析。
fliter支持lua。對于那些對c語言hold不住的團隊,可以用lua寫自己的filter。
output 除了官方已經支持的十幾種,還支持用golang寫output。例如:fluent-bit-kafka-output-plugin
k8s日志收集 k8s日志分析主要講kubeadm部署的k8s集群。日志主要有:
kubelet和etcd的日志,一般采用systemd部署,自然而然就是要支持systemd格式日志的采集。filebeat并不支持該類型。
kube-apiserver等組件stderr和stdout日志,這個一般輸出的格式取決于docker的日志驅動,一般為json-file。
業務落盤的日志。支持tail文件的采集組件都滿足。這點不在今天的討論范圍之內。
部署方案fluent bit 采取DaemonSet部署。 如下圖:
部署yaml--- apiVersion: v1 kind: Service metadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile kubernetes.io/name: "Elasticsearch" spec: ports: - port: 9200 protocol: TCP targetPort: db selector: k8s-app: elasticsearch-logging --- # RBAC authn and authz apiVersion: v1 kind: ServiceAccount metadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: elasticsearch-logging labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile rules: - apiGroups: - "" resources: - "services" - "namespaces" - "endpoints" verbs: - "get" --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: kube-system name: elasticsearch-logging labels: k8s-app: elasticsearch-logging kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile subjects: - kind: ServiceAccount name: elasticsearch-logging namespace: kube-system apiGroup: "" roleRef: kind: ClusterRole name: elasticsearch-logging apiGroup: "" --- # Elasticsearch deployment itself apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch-logging namespace: kube-system labels: k8s-app: elasticsearch-logging version: v6.3.0 kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: Reconcile spec: serviceName: elasticsearch-logging replicas: 2 selector: matchLabels: k8s-app: elasticsearch-logging version: v6.3.0 template: metadata: labels: k8s-app: elasticsearch-logging version: v6.3.0 kubernetes.io/cluster-service: "true" spec: serviceAccountName: elasticsearch-logging containers: - image: k8s.gcr.io/elasticsearch:v6.3.0 name: elasticsearch-logging resources: # need more cpu upon initialization, therefore burstable class limits: cpu: 1000m requests: cpu: 100m ports: - containerPort: 9200 name: db protocol: TCP - containerPort: 9300 name: transport protocol: TCP volumeMounts: - name: elasticsearch-logging mountPath: /data env: - name: "NAMESPACE" valueFrom: fieldRef: fieldPath: metadata.namespace # Elasticsearch requires vm.max_map_count to be at least 262144. # If your OS already sets up this number to a higher value, feel free # to remove this init container. initContainers: - image: alpine:3.6 command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"] name: elasticsearch-logging-init securityContext: privileged: true volumeClaimTemplates: - metadata: name: elasticsearch-logging annotations: volume.beta.kubernetes.io/storage-class: gp2 spec: accessModes: - "ReadWriteOnce" resources: requests: storage: 10Gi --- apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config namespace: kube-system labels: k8s-app: fluent-bit 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 [INPUT] Name systemd Tag host.* Systemd_Filter _SYSTEMD_UNIT=kubelet.service Path /var/log/journal DB /var/log/flb_host.db filter-kubernetes.conf: | [FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc.cluster.local:443 Merge_Log On K8S-Logging.Parser On K8S-Logging.Exclude On [FILTER] Name kubernetes Match host.* Kube_URL https://kubernetes.default.svc.cluster.local:443 Merge_Log On Use_Journal On output-elasticsearch.conf: | [OUTPUT] Name es Match * Host ${FLUENT_ELASTICSEARCH_HOST} Port ${FLUENT_ELASTICSEARCH_PORT} Logstash_Format On Retry_Limit False parsers.conf: | [PARSER] Name apache Format regex Regex ^(?總結[^ ]*) [^ ]* (? [^ ]*) [(?
真實場景的日志收集比較復雜,在日志量大的情況下,一般要引入kafka。
此外關于注意日志的lograte。一般來說,docker是支持該功能的。可以通過下面的配置解決:
cat > /etc/docker/daemon.json <在k8s中運行的業務日志,不僅要考慮清除過時的日志,還要考慮新增pod的日志的收集。這個時候,往往需要在fluent bit上面再包一層邏輯,獲取需要收集的日志路徑。比如log-pilot。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/33104.html
摘要:是一個開源和多平臺的,它允許您從不同的來源收集數據日志,統一并將它們發送到多個目的地。例如日志收集日志分析主要講部署的集群。日志主要有和的日志,一般采用部署,自然而然就是要支持格式日志的采集。業務落盤的日志。部署方案采取部署。 前言 收集日志的組件多不勝數,有ELK久負盛名組合中的logstash, 也有EFK組合中的filebeat,更有cncf新貴fluentd,另外還有大數據領域...
摘要:最近我們遇到奇葩的需求,不得不利用編寫的,來滿足需求。所以找到官方的代碼倉庫,下來,稍作更改。新的如下注意增加了。使用姿勢使用比較簡單的。遇到問題和使用一些不明白的地方,解決起來費力。官方文檔寫的也不夠詳細,只是描述了個大概。 前言 之前我們介紹過fluent bit這個日志收集神器。最近我們遇到奇葩的需求,不得不利用lua編寫fluent bit的filter,來滿足需求。 首先介紹...
摘要:最近我們遇到奇葩的需求,不得不利用編寫的,來滿足需求。所以找到官方的代碼倉庫,下來,稍作更改。新的如下注意增加了。使用姿勢使用比較簡單的。遇到問題和使用一些不明白的地方,解決起來費力。官方文檔寫的也不夠詳細,只是描述了個大概。 前言 之前我們介紹過fluent bit這個日志收集神器。最近我們遇到奇葩的需求,不得不利用lua編寫fluent bit的filter,來滿足需求。 首先介紹...
摘要:采用實現的插件前言目前社區日志采集和處理的組件不少,之前方案中的,社區中的,方案中的以及大數據用到比較多的。適合采用的方案,實現日志中心化收集的方案。主要負責采集,負責處理和傳送。 采用golang實現Fluent Bit的output插件 前言 目前社區日志采集和處理的組件不少,之前elk方案中的logstash,cncf社區中的fluentd,efk方案中的filebeat,以及大...
摘要:采用實現的插件前言目前社區日志采集和處理的組件不少,之前方案中的,社區中的,方案中的以及大數據用到比較多的。適合采用的方案,實現日志中心化收集的方案。主要負責采集,負責處理和傳送。 采用golang實現Fluent Bit的output插件 前言 目前社區日志采集和處理的組件不少,之前elk方案中的logstash,cncf社區中的fluentd,efk方案中的filebeat,以及大...
閱讀 3479·2023-04-25 22:45
閱讀 1282·2021-11-11 16:54
閱讀 2790·2019-08-30 15:44
閱讀 3190·2019-08-30 15:44
閱讀 1646·2019-08-30 13:55
閱讀 941·2019-08-29 18:45
閱讀 1195·2019-08-29 17:25
閱讀 1007·2019-08-29 12:59