云原生日志管理瑞士军刀 Fluent Operator 中文入门教程
公眾號關(guān)注?「奇妙的 Linux 世界」
設(shè)為「星標(biāo)」,每天帶你玩轉(zhuǎn) Linux !
Fluent Operator 介紹
隨著云原生技術(shù)的快速發(fā)展,技術(shù)的不斷迭代,對于日志的采集、處理及轉(zhuǎn)發(fā)提出了更高的要求。云原生架構(gòu)下的日志方案相比基于物理機(jī)或者是虛擬機(jī)場景的日志架構(gòu)設(shè)計(jì)存在很大差別。作為 CNCF 的畢業(yè)項(xiàng)目,Fluent Bit 無疑為解決云環(huán)境中的日志記錄問題的首選解決方案之一。但是在 Kubernetes 中安裝部署以及配置 Fluent Bit 都具有一定的門檻,加大了用戶的使用成本。
2019 年 1 月 21 日,KubeSphere 社區(qū)為了滿足以云原生的方式管理 Fluent Bit 的需求開發(fā)了?Fluentbit Operator,并在 2020 年 2 月 17 日發(fā)布了 v0.1.0 版本。此后產(chǎn)品不斷迭代,在?2021 年 8 月 4?日正式將 Fluentbit Operator 捐獻(xiàn)給 Fluent 社區(qū)。
Fluentbit Operator 降低了 Fluent Bit 的使用門檻,能高效、快捷的處理日志信息,但是 Fluent Bit 處理日志的能力稍弱,我們還沒有集成日志處理工具,比如 Fluentd,它有更多的插件可供使用。基于以上需求,Fluentbit Operator 集成了 Fluentd,旨在將 Fluentd 集成為一個(gè)可選的日志聚合和轉(zhuǎn)發(fā)層,并重新命名為?Fluent Operator(GitHub 地址:https://github.com/fluent/fluent-operator)。在 2022 年 3 月 25 日 Fluent Operator 發(fā)布了 v1.0.0 版本,并將繼續(xù)迭代 Fluentd Operator,預(yù)計(jì)在 2022 年第 2 季度發(fā)布 v1.1.0 版本,增加更多的功能與亮點(diǎn)。
使用 Fluent Operator 可以靈活且方便地部署、配置及卸載 Fluent Bit 以及 Fluentd。同時(shí), 社區(qū)還提供支持 Fluentd 以及 Fluent Bit 的海量插件,用戶可以根據(jù)實(shí)際情況進(jìn)行定制化配置。官方文檔提供了詳細(xì)的示例,極易上手,大大降低了 Fluent Bit 以及 Fluentd 的使用門檻。
日志流水線的各個(gè)階段
Fluent Operator 可以單獨(dú)部署 Fluent Bit 或者 Fluentd,并不會強(qiáng)制要求使用 Fluent Bit 或 Fluentd,同時(shí)還支持使用 Fluentd 接收 Fluent Bit 轉(zhuǎn)發(fā)的日志流進(jìn)行多租戶日志隔離,這極大地增加了部署的靈活性和多樣性。為了更全面的了解 Fluent Operator,下圖以完整的日志流水線為例,將流水線分為三部分:采集和轉(zhuǎn)發(fā)、過濾以及輸出。
采集和轉(zhuǎn)發(fā)
Fluent Bit 與 Fluentd 均可以采集日志。
單獨(dú)部署時(shí),可以通過 Fluent Bit 的 intput 插件或者 Fluentd 的 forward 以及 http 等插件來滿足對日志收集的需求。兩者結(jié)合時(shí),Fluentd 可使用 forward 接受 Fluent Bit 的日志流轉(zhuǎn)發(fā)。
在性能方面,Fluent Bit 相比 Fluentd 更輕量,內(nèi)存消耗更小(約為 650KB),所以主要由 Fluent Bit 負(fù)責(zé)采集與轉(zhuǎn)發(fā)日志。在各個(gè)節(jié)點(diǎn)上通過以 DaemonSet 形式安裝的 Fluent Bit 來收集和轉(zhuǎn)發(fā)日志。
過濾
日志收集的數(shù)據(jù)往往過于雜亂與冗余,這要求日志處理中間件提供對日志信息進(jìn)行過濾和處理的能力。Fluent Bit 或 Fluentd 均支持 filter 插件,用戶可以根據(jù)自身需求,整合和定制日志數(shù)據(jù)。
輸出
Fluent Bit output 或 Fluentd output 插件將處理后的日志信息輸出到多個(gè)目的地,目的地可以是 Kafka、Elasticsearch 等第三方組件。
CRD 簡介
Fluent Operator 為 Fluent Bit 和 Fluentd 分別定義了兩個(gè) Group:fluentbit.fluent.io 和 fluentd.fluent.io。
fluentbit.fluent.io
fluentbit.fluent.io 分組下包含以下 6 個(gè) CRDs:
Fluentbit CRD 定義了 Fluent Bit 的屬性,比如鏡像版本、污點(diǎn)、親和性等參數(shù)。
ClusterFluentbitConfig CRD 定義了 Fluent Bit 的配置文件。
ClusterInput CRD 定義了 Fluent Bit 的 input 插件,即輸入插件。通過該插件,用戶可以自定義采集何種日志。
ClusterFilter CRD 定義了 Fluent Bit 的 filter 插件,該插件主要負(fù)責(zé)過濾以及處理 fluentbit 采集到的信息。
ClusterParser CRD 定義了 Fluent Bit 的 parser 插件,該插件主要負(fù)責(zé)解析日志信息,可以將日志信息解析為其他格式。
ClusterOutput CRD 定義了 Fluent Bit 的 output 插件,該插件主要負(fù)責(zé)將處理后的日志信息轉(zhuǎn)發(fā)到目的地。
fluentd.fluent.io
fluentd.fluent.io 分組下包含以下 7 個(gè) CRDs:
Fluentd CRD 定義了 Fluentd 的屬性,比如鏡像版本、污點(diǎn)、親和性等參數(shù)。
ClusterFluentdConfig CRD 定義了 Fluentd 集群級別的配置文件。
FluentdConfig CRD 定義了 Fluentd 的 namespace 范圍的配置文件。
ClusterFilter CRD 定義了 Fluentd 集群范圍的 filter 插件,該插件主要負(fù)責(zé)過濾以及處理 Fluentd 采集到的信息。如果安裝了 Fluent Bit,則可以更進(jìn)一步的處理日志信息。
Filter CRD 該 CRD 定義了 Fluentd namespace 的 filter 插件,該插件主要負(fù)責(zé)過濾以及處理 Fluentd 采集到的信息。如果安裝了 Fluent Bit,則可以更進(jìn)一步的處理日志信息。
ClusterOutput CRD 該 CRD 定義了 Fluentd 的集群范圍的 output 插件,該插件主要負(fù)責(zé)將處理后的日志信息轉(zhuǎn)發(fā)到目的地。
Output CRD 該 CRD 定義了 Fluentd 的 namespace 范圍的 output 插件,該插件主要負(fù)責(zé)將處理后的日志信息轉(zhuǎn)發(fā)到目的地。
編排原理簡介 (instance + mounted secret + CRD 的抽象能力)
盡管 Fluent Bit 與 Fluentd 都有收集、處理(解析和過濾)以及輸出日志的能力,但它們有著不同的優(yōu)點(diǎn)。Fluent Bit 相對 Fluentd 更為輕量與高效,而 Fluentd 插件更為豐富。
為了兼顧這些優(yōu)點(diǎn),Fluent Operator 允許用戶以多種方式靈活地使用 Fluent Bit 和 Fluentd:
Fluent Bit only 模式:如果您只需要在收集日志并在簡單處理后將日志發(fā)送到最終目的地,您只需要 Fluent Bit。
Fluentd only 模式:如果需要通過網(wǎng)絡(luò)以 HTTP 或 Syslog 等方式接收日志,然后將日志處理并發(fā)送到最終的目的地,則只需要 Fluentd。
Fluent Bit + Fluentd 模式:如果你還需要對收集到的日志進(jìn)行一些高級處理或者發(fā)送到更多的 sink,那么你可以組合使用 Fluent Bit 和 Fluentd。
Fluent Operator 允許您根據(jù)需要在上述 3 種模式下配置日志處理管道。Fluentd 與 Fluent Bit 具有豐富的插件以滿足用戶的各種自定義化需求,由于 Fluentd 與 Fluent Bit 的配置掛載方式相似,所以以 Fluent Bit 配置文件的掛載方式來進(jìn)行簡單介紹。
在 Fluent Bit CRD 中每個(gè) ClusterInput, ClusterParser, ClusterFilter,ClusterOutput 代表一個(gè) Fluent Bit 配置部分,由 ClusterFluentBitConfig 標(biāo)簽選擇器選擇。Fluent Operator 監(jiān)視這些對象,構(gòu)建最終配置,最后創(chuàng)建一個(gè) Secret 來存儲安裝到 Fluent Bit DaemonSet 中的配置。整個(gè)工作流程如下所示:
因?yàn)?Fluent Bit 本身沒有重新加載接口(詳細(xì)信息請參閱此已知問題[1]),為了使 Fluent Bit 能夠在 Fluent Bit 配置更改時(shí)獲取并使用最新配置,添加了一個(gè)名為 fluentbit watcher 的包裝器,以便在檢測到 Fluent Bit 配置更改時(shí)立即重新啟動(dòng) Fluent Bit 進(jìn)程。這樣,無需重新啟動(dòng) Fluent Bit pod 即可重新加載新配置。
為了使用戶配置更為方便,我們基于 CRD 強(qiáng)大的抽象能力將應(yīng)用以及配置的參數(shù)提取出來。用戶可以通過定義的 CRD 來對 Fluent Bit 以及 Fluentd 進(jìn)行配置。Fluent Operator 監(jiān)控這些對象的變化從而更改 Fluent Bit 以及 Fluentd 的狀態(tài)及配置。特別是插件的定義,為了使用戶更為平滑地過渡,我們在命名上基本與 Fluent Bit 原有的字段保持一致,降低使用的門檻。
如何實(shí)現(xiàn)多租戶日志隔離
Fluent Bit 可以高效的采集日志,但是如果需要對日志信息進(jìn)行復(fù)雜處理,Fluent Bit 則稍顯力不從心,而 Fluentd 則可以借助其豐富的插件完成對日志信息的高級處理。fluent-operator 為此抽象了 Fluentd 的各種插件,以便可以對日志信息進(jìn)行處理來滿足用戶的自定義需求。
從上面 CRD 的定義可以看出,我們將 Fluentd 的 config 及插件的 CRD 分成了 cluster 級別與 namespace 級別的 CRD。通過將 CRD 定義為兩種范圍,借助 Fluentd 的 label router 插件,就可以達(dá)到多租戶隔離的效果。
我們在 clusterfluentconfig 添加了 watchNamespace 字段,用戶可以根據(jù)自己的需求選擇監(jiān)聽哪些 namespace,如果為空,則表示監(jiān)控所有的 namespace。而 namesapce 級別的 fluentconfig 只能監(jiān)聽自己所位于的 namespace 中的 CR 及全局級別的配置。所以 namespace 級別的日志既可以輸出到該 namespace 中的 output,也可以輸出到 clsuter 級別的 output,從而達(dá)到多租戶隔離的目的。
Fluent Operator vs logging-operator
差別
兩者皆可自動(dòng)部署 Fluent Bit 與 Fluentd。logging-operator 需要同時(shí)部署 Fluent Bit 和 Fluentd,而 Fluent Operator 支持可插拔部署 Fluent Bit 與 Fluentd,非強(qiáng)耦合,用戶可以根據(jù)自己的需要自行選擇部署 Fluentd 或者是 Fluent Bit,更為靈活。
在 logging-operator 中 Fluent Bit 收集的日志都必須經(jīng)過 Fluentd 才能輸出到最終的目的地,而且如果數(shù)據(jù)量過大,那么 Fluentd 存在單點(diǎn)故障隱患。Fluent Operator 中 Fluent Bit 可以直接將日志信息發(fā)送到目的地,從而規(guī)避單點(diǎn)故障的隱患。
logging-operator 定義了 loggings,outputs,flows,clusteroutputs 以及 clusterflows 四種 CRD,而 Fluent Operator 定義了 13 種 CRD。相較于 logging-operator,Fluent Operator 在 CRD 定義上更加多樣,用戶可以根據(jù)需要更靈活的對 Fluentd 以及 Fluent Bit 進(jìn)行配置。同時(shí)在定義 CRD 時(shí),選取與 Fluentd 以及 Fluent Bit 配置類似的命名,力求命名更加清晰,以符合原生的組件定義。
兩者均借鑒了 Fluentd 的 label router 插件實(shí)現(xiàn)多租戶日志隔離。
展望:
支持 HPA 自動(dòng)伸縮;
完善 Helm Chart,如收集 metrics 信息;
...
用法詳解
借助 Fluent Operator 可以對日志進(jìn)行復(fù)雜處理,在這里我們可以通過?fluent-operator-walkthrough[2]?中將日志輸出到 elasticsearch 與 kafka 的例子對 Fluent Operator 的實(shí)際功能進(jìn)行介紹。要獲得 Fluent Operator 的一些實(shí)際操作經(jīng)驗(yàn),您需要一個(gè) Kind 集群。同時(shí)你還需要在這種類型的集群中設(shè)置一個(gè) Kafka 集群和一個(gè) Elasticsearch 集群。
#?創(chuàng)建一個(gè)?kind?的集群并命名為?fluent ./create-kind-cluster.sh#?在?Kafka?namespace?下創(chuàng)建一個(gè)?Kafka?集群 ./deploy-kafka.sh#?在?elastic?namespace?下創(chuàng)建一個(gè)?Elasticsearch?集群 ./deploy-es.shFluent Operator 控制 Fluent Bit 和 Fluentd 的生命周期。您可以使用以下腳本在 fluent 命名空間中啟動(dòng) Fluent Operator:
./deploy-fluent-operator.shFluent Bit 和 Fluentd 都已被定義為 Fluent Operator 中的 CRD,您可以通過聲明 FluentBit 或 Fluentd 的 CR 來創(chuàng)建 Fluent Bit DaemonSet 或 Fluentd StatefulSet。
Fluent Bit Only 模式
Fluent Bit Only 將只啟用輕量級的 Fluent Bit 對日志進(jìn)行采集、處理以及轉(zhuǎn)發(fā)。
使用 Fluent Bit 收集 kubelet 的日志并輸出到 Elasticsearch
cat?<<EOF?|?kubectl?apply?-f?-
apiVersion:?fluentbit.fluent.io/v1alpha2
kind:?FluentBit
metadata:name:?fluent-bitnamespace:?fluentlabels:app.kubernetes.io/name:?fluent-bit
spec:image:?kubesphere/fluent-bit:v1.8.11positionDB:hostPath:path:?/var/lib/fluent-bit/resources:requests:cpu:?10mmemory:?25Milimits:cpu:?500mmemory:?200MifluentBitConfigName:?fluent-bit-only-configtolerations:-?operator:?Exists
---
apiVersion:?fluentbit.fluent.io/v1alpha2
kind:?ClusterFluentBitConfig
metadata:name:?fluent-bit-only-configlabels:app.kubernetes.io/name:?fluent-bit
spec:service:parsersFile:?parsers.confinputSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"filterSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"outputSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"
---
apiVersion:?fluentbit.fluent.io/v1alpha2
kind:?ClusterInput
metadata:name:?kubeletlabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"
spec:systemd:tag:?service.kubeletpath:?/var/log/journaldb:?/fluent-bit/tail/kubelet.dbdbSync:?NormalsystemdFilter:-?_SYSTEMD_UNIT=kubelet.service
---
apiVersion:?fluentbit.fluent.io/v1alpha2
kind:?ClusterFilter
metadata:name:?systemdlabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"
spec:match:?service.*filters:-?lua:script:key:?systemd.luaname:?fluent-bit-luacall:?add_timetimeAsTable:?true
---
apiVersion:?v1
data:systemd.lua:?|function?add_time(tag,?timestamp,?record)new_record?=?{}timeStr?=?os.date("!*t",?timestamp["sec"])t?=?string.format("%4d-%02d-%02dT%02d:%02d:%02d.%sZ",timeStr["year"],?timeStr["month"],?timeStr["day"],timeStr["hour"],?timeStr["min"],?timeStr["sec"],timestamp["nsec"])kubernetes?=?{}kubernetes["pod_name"]?=?record["_HOSTNAME"]kubernetes["container_name"]?=?record["SYSLOG_IDENTIFIER"]kubernetes["namespace_name"]?=?"kube-system"new_record["time"]?=?tnew_record["log"]?=?record["MESSAGE"]new_record["kubernetes"]?=?kubernetesreturn?1,?timestamp,?new_recordend
kind:?ConfigMap
metadata:labels:app.kubernetes.io/component:?operatorapp.kubernetes.io/name:?fluent-bit-luaname:?fluent-bit-luanamespace:?fluent
---
apiVersion:?fluentbit.fluent.io/v1alpha2
kind:?ClusterOutput
metadata:name:?eslabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"fluentbit-only"
spec:matchRegex:?(?:kube|service)\.(.*)es:host:?elasticsearch-master.elastic.svcport:?9200generateID:?truelogstashPrefix:?fluent-log-fb-onlylogstashFormat:?truetimeKey:?"@timestamp"
EOF使用 Fluent Bit 收集 Kubernetes 的應(yīng)用日志并輸出到 Kafka
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?FluentBit metadata:name:?fluent-bitnamespace:?fluentlabels:app.kubernetes.io/name:?fluent-bit spec:image:?kubesphere/fluent-bit:v1.8.11positionDB:hostPath:path:?/var/lib/fluent-bit/resources:requests:cpu:?10mmemory:?25Milimits:cpu:?500mmemory:?200MifluentBitConfigName:?fluent-bit-configtolerations:-?operator:?Exists --- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?ClusterFluentBitConfig metadata:name:?fluent-bit-configlabels:app.kubernetes.io/name:?fluent-bit spec:service:parsersFile:?parsers.confinputSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"k8s"filterSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"k8s"outputSelector:matchLabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"k8s" --- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?ClusterInput metadata:name:?taillabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"k8s" spec:tail:tag:?kube.*path:?/var/log/containers/*.logparser:?dockerrefreshIntervalSeconds:?10memBufLimit:?5MBskipLongLines:?truedb:?/fluent-bit/tail/pos.dbdbSync:?Normal --- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?ClusterFilter metadata:name:?kuberneteslabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/mode:?"k8s" spec:match:?kube.*filters:-?kubernetes:kubeURL:?https://kubernetes.default.svc:443kubeCAFile:?/var/run/secrets/kubernetes.io/serviceaccount/ca.crtkubeTokenFile:?/var/run/secrets/kubernetes.io/serviceaccount/tokenlabels:?falseannotations:?false-?nest:operation:?liftnestedUnder:?kubernetesaddPrefix:?kubernetes_-?modify:rules:-?remove:?stream-?remove:?kubernetes_pod_id-?remove:?kubernetes_host-?remove:?kubernetes_container_hash-?nest:operation:?nestwildcard:-?kubernetes_*nestUnder:?kubernetesremovePrefix:?kubernetes_ --- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?ClusterOutput metadata:name:?kafkalabels:fluentbit.fluent.io/enabled:?"false"fluentbit.fluent.io/mode:?"k8s" spec:matchRegex:?(?:kube|service)\.(.*)kafka:brokers:?my-cluster-kafka-bootstrap.kafka.svc:9091,my-cluster-kafka-bootstrap.kafka.svc:9092,my-cluster-kafka-bootstrap.kafka.svc:9093topics:?fluent-log EOFFluent Bit + Fluentd 模式
憑借 Fluentd 豐富的插件,Fluentd 可以充當(dāng)日志聚合層,執(zhí)行更高級的日志處理。您可以使用 Fluent Operator 輕松地將日志從 Fluent Bit 轉(zhuǎn)發(fā)到 Fluentd。
將日志從 Fluent Bit 轉(zhuǎn)發(fā)到 Fluentd
要將日志從 Fluent Bit 轉(zhuǎn)發(fā)到 Fluentd,您需要啟用 Fluent Bit 的 forward 插件,如下所示:
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentbit.fluent.io/v1alpha2 kind:?ClusterOutput metadata:name:?fluentdlabels:fluentbit.fluent.io/enabled:?"true"fluentbit.fluent.io/component:?logging spec:matchRegex:?(?:kube|service)\.(.*)forward:host:?fluentd.fluent.svcport:?24224 EOF部署 Fluentd
Fluentd forward Input 插件會在部署 Fluentd 時(shí)默認(rèn)啟用,因此你只需要部署下列 yaml 來部署 Fluentd:
apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Fluentd metadata:name:?fluentdnamespace:?fluentlabels:app.kubernetes.io/name:?fluentd spec:globalInputs:-?forward:bind:?0.0.0.0port:?24224replicas:?1image:?kubesphere/fluentd:v1.14.4fluentdCfgSelector:matchLabels:config.fluentd.fluent.io/enabled:?"true"ClusterFluentdConfig: Fluentd 集群范圍的配置
如果你定義了 ClusterFluentdConfig,那么你可以收集任意或者所有 namespace 下的日志。我么可以通過 watchedNamespaces 字段來選擇所需要采集日志的 namespace。以下配置是采集?kube-system?以及?default?namespace 下的日志:
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFluentdConfig metadata:name:?cluster-fluentd-configlabels:config.fluentd.fluent.io/enabled:?"true" spec:watchedNamespaces:-?kube-system-?defaultclusterOutputSelector:matchLabels:output.fluentd.fluent.io/scope:?"cluster"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-eslabels:output.fluentd.fluent.io/scope:?"cluster"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-cluster-fd EOFFluentdConfig: Fluentd namespace 范圍的配置
如果你定義了 FluentdConfig,那么你只能將與該 FluentdConfig 同一 namespace 下的日志發(fā)送到 Output,通過這種方式實(shí)現(xiàn)了不同 namespace 下的日志隔離。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?FluentdConfig metadata:name:?namespace-fluentd-confignamespace:?fluentlabels:config.fluentd.fluent.io/enabled:?"true" spec:outputSelector:matchLabels:output.fluentd.fluent.io/scope:?"namespace"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Output metadata:name:?namespace-fluentd-output-esnamespace:?fluentlabels:output.fluentd.fluent.io/scope:?"namespace"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-namespace-fd EOF根據(jù) namespace 將日志路由到不同的 Kafka topic
同樣您可以使用 Fluentd 的 filter 插件根據(jù)不同的 namespace 將日志分發(fā)到不同的 topic。在這里我們包含在 Fluentd 內(nèi)核中的插件 recordTransformer,該插件可以對事件進(jìn)行增刪改查。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFluentdConfig metadata:name:?cluster-fluentd-config-kafkalabels:config.fluentd.fluent.io/enabled:?"true" spec:watchedNamespaces:-?kube-system-?defaultclusterFilterSelector:matchLabels:filter.fluentd.fluent.io/type:?"k8s"filter.fluentd.fluent.io/enabled:?"true"clusterOutputSelector:matchLabels:output.fluentd.fluent.io/type:?"kafka"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFilter metadata:name:?cluster-fluentd-filter-k8slabels:filter.fluentd.fluent.io/type:?"k8s"filter.fluentd.fluent.io/enabled:?"true" spec:filters:-?recordTransformer:enableRuby:?truerecords:-?key:?kubernetes_nsvalue:?${record["kubernetes"]["namespace_name"]} --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-kafkalabels:output.fluentd.fluent.io/type:?"kafka"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?kafka:brokers:?my-cluster-kafka-bootstrap.default.svc:9091,my-cluster-kafka-bootstrap.default.svc:9092,my-cluster-kafka-bootstrap.default.svc:9093useEventTime:?truetopicKey:?kubernetes_ns EOF同時(shí)使用集群范圍與 namespace 范圍的 FluentdConfig
當(dāng)然,你可以像下面一樣同時(shí)使用 ClusterFluentdConfig 與 FluentdConfig。FluentdConfig 會將?fluent?namespace 下的日志發(fā)送到 ClusterOutput,而 ClusterFluentdConfig 同時(shí)也會將 watchedNamespaces 字段下的 namespace(即 kube-system 以及 default 兩個(gè) namespace)發(fā)送到 ClusterOutput。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFluentdConfig metadata:name:?cluster-fluentd-config-hybridlabels:config.fluentd.fluent.io/enabled:?"true" spec:watchedNamespaces:-?kube-system-?defaultclusterOutputSelector:matchLabels:output.fluentd.fluent.io/scope:?"hybrid"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?FluentdConfig metadata:name:?namespace-fluentd-config-hybridnamespace:?fluentlabels:config.fluentd.fluent.io/enabled:?"true" spec:clusterOutputSelector:matchLabels:output.fluentd.fluent.io/scope:?"hybrid"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-es-hybridlabels:output.fluentd.fluent.io/scope:?"hybrid"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-hybrid-fd EOF在多租戶場景下同時(shí)使用集群范圍與 namespace 范圍的 FluentdConfig
在多租戶場景下,我們可以同時(shí)使用集群范圍與 namespace 范圍的 FluentdConfig 達(dá)到日志隔離的效果。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?FluentdConfig metadata:name:?namespace-fluentd-config-user1namespace:?fluentlabels:config.fluentd.fluent.io/enabled:?"true" spec:outputSelector:matchLabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/user:?"user1"clusterOutputSelector:matchLabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/user:?"user1" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFluentdConfig metadata:name:?cluster-fluentd-config-cluster-onlylabels:config.fluentd.fluent.io/enabled:?"true" spec:watchedNamespaces:-?kube-system-?kubesphere-systemclusterOutputSelector:matchLabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/scope:?"cluster-only" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Output metadata:name:?namespace-fluentd-output-user1namespace:?fluentlabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/user:?"user1" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-user1-fd --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-user1labels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/user:?"user1" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-cluster-user1-fd --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-cluster-onlylabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/scope:?"cluster-only" spec:outputs:-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-cluster-only-fd EOF為 Fluentd 輸出使用緩沖區(qū)
您可以添加一個(gè)緩沖區(qū)來緩存 output 插件的日志。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFluentdConfig metadata:name:?cluster-fluentd-config-bufferlabels:config.fluentd.fluent.io/enabled:?"true" spec:watchedNamespaces:-?kube-system-?defaultclusterFilterSelector:matchLabels:filter.fluentd.fluent.io/type:?"buffer"filter.fluentd.fluent.io/enabled:?"true"clusterOutputSelector:matchLabels:output.fluentd.fluent.io/type:?"buffer"output.fluentd.fluent.io/enabled:?"true" --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterFilter metadata:name:?cluster-fluentd-filter-bufferlabels:filter.fluentd.fluent.io/type:?"buffer"filter.fluentd.fluent.io/enabled:?"true" spec:filters:-?recordTransformer:enableRuby:?truerecords:-?key:?kubernetes_nsvalue:?${record["kubernetes"]["namespace_name"]} --- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?ClusterOutput metadata:name:?cluster-fluentd-output-bufferlabels:output.fluentd.fluent.io/type:?"buffer"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?stdout:?{}buffer:type:?filepath:?/buffers/stdout.log-?elasticsearch:host:?elasticsearch-master.elastic.svcport:?9200logstashFormat:?truelogstashPrefix:?fluent-log-buffer-fdbuffer:type:?filepath:?/buffers/es.log EOFFluentd Only 模式
你同樣可以開啟 Fluentd Only 模式,該模式只會部署 Fluentd statefulset。
使用 Fluentd 從 HTTP 接收日志并輸出到標(biāo)準(zhǔn)輸出
如果你想單獨(dú)開啟 Fluentd 插件,你可以通過 HTTP 來接收日志。
cat?<<EOF?|?kubectl?apply?-f?- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Fluentd metadata:name:?fluentd-httpnamespace:?fluentlabels:app.kubernetes.io/name:?fluentd spec:globalInputs:-?http:bind:?0.0.0.0port:?9880replicas:?1image:?kubesphere/fluentd:v1.14.4fluentdCfgSelector:matchLabels:config.fluentd.fluent.io/enabled:?"true"--- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?FluentdConfig metadata:name:?fluentd-only-confignamespace:?fluentlabels:config.fluentd.fluent.io/enabled:?"true" spec:filterSelector:matchLabels:filter.fluentd.fluent.io/mode:?"fluentd-only"filter.fluentd.fluent.io/enabled:?"true"outputSelector:matchLabels:output.fluentd.fluent.io/mode:?"true"output.fluentd.fluent.io/enabled:?"true"--- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Filter metadata:name:?fluentd-only-filternamespace:?fluentlabels:filter.fluentd.fluent.io/mode:?"fluentd-only"filter.fluentd.fluent.io/enabled:?"true" spec:filters:-?stdout:?{}--- apiVersion:?fluentd.fluent.io/v1alpha1 kind:?Output metadata:name:?fluentd-only-stdoutnamespace:?fluentlabels:output.fluentd.fluent.io/enabled:?"true"output.fluentd.fluent.io/enabled:?"true" spec:outputs:-?stdout:?{} EOF引用鏈接
[1]
已知問題:?https://github.com/fluent/fluent-bit/issues/365
[2]fluent-operator-walkthrough:?https://github.com/kubesphere-sigs/fluent-operator-walkthrough
本文轉(zhuǎn)載自:「KubeSphere云原生」,原文:https://tinyurl.com/2p8td5h7,版權(quán)歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。
最近,我們建立了一個(gè)技術(shù)交流微信群。目前群里已加入了不少行業(yè)內(nèi)的大神,有興趣的同學(xué)可以加入和我們一起交流技術(shù),在 「奇妙的 Linux 世界」 公眾號直接回復(fù) 「加群」 邀請你入群。
你可能還喜歡
點(diǎn)擊下方圖片即可閱讀
23 個(gè)必知必會的 Kubernetes 高頻面試題
點(diǎn)擊上方圖片,『美團(tuán)|餓了么』外賣紅包天天免費(fèi)領(lǐng)
更多有趣的互聯(lián)網(wǎng)新鮮事,關(guān)注「奇妙的互聯(lián)網(wǎng)」視頻號全了解!
總結(jié)
以上是生活随笔為你收集整理的云原生日志管理瑞士军刀 Fluent Operator 中文入门教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [react] 为什么标签里的for要写
- 下一篇: [react] 在React中你有经常使