EFK完成k8s應用日誌收集

2021-09-02 19:08:16 字數 4683 閱讀 9036

方案選擇

kubernetes官方提供了efk的日誌收集解決方案,但是這種方案並不適合所有的業務場景,它本身就有一些侷限性,例如:

所有日誌都必須是out前台輸出,真實業務場景中無法保證所有日誌都在前台輸出

只能有乙個日誌輸出檔案,而真實業務場景中往往有多個日誌輸出檔案

fluentd並不是常用的日誌收集工具,我們更習慣用logstash,現使用filebeat替代

我們已經有自己的elk集群且有專人維護,沒有必要再在kubernetes上做乙個日誌收集服務

基於以上幾個原因,我們決定使用自己的elk集群。

kubernetes集群中的日誌收集解決方案

編號方案

優點缺點

1強耦合,不方便應用和日誌收集元件公升級和維護且會導致映象過大

2低耦合,擴充套件性強,方便維護和公升級

需要對kubernetes的yaml檔案進行單獨配置,略顯繁瑣

3將所有的pod的日誌都掛載到宿主機上,每台主機上單獨起乙個日誌收集pod

完全解耦,效能最高,管理起來最方便

需要統一日誌收集規則,目錄和輸出方式

綜合以上優缺點,我們選擇使用方案二。

該方案在擴充套件性、個性化、部署和後期維護方面都能做到均衡,因此選擇該方案。

filebeat日誌收集架構圖

- filebeat日誌收集架構圖

我們部署乙個應用filebeat來收集日誌的功能測試。

建立應用yaml檔案filebeat-test.yaml。

說明

該檔案中包含了配置檔案filebeat的配置檔案的configmap,因此不需要再定義環境變數。

當然你也可以不同configmap,通過傳統的傳遞環境變數的方式來配置filebeat。

例如對filebeat的容器進行如下配置:

containers:

- image: 192.168.20.210:5000/filebeat:5.4.0

name: filebeat

volumemounts:

mountpath: /log

env:

- name: paths

value: "/log/*"

- name: es_server

value: 172.23.5.255:9200

- name: index

value: logstash-docker

- name: input_type

value: log

這裡如果有想不通路徑下的日誌區分,可以加上document_type

apiversion: v1

kind: configmap

metadata:

name: filebeat-config

data:

filebeat.yml: |

filebeat.prospectors:

- input_type: log

paths:

- "/log/*.log"

multiline.pattern: '^[[:space:]]+|^caused by:|^#|^;|^org|^com'

multiline.negate: false

multiline.match: after

- input_type: log

paths:

- "/logs/*.log"

document_type: access-logs

multiline.pattern: '^[[:space:]]+|^caused by:|^#|^;|^org|^com'

multiline.negate: false

multiline.match: after

output.elasticsearch:

hosts: ["192.168.30.21:9200"]

index: "filebeat-test-%"

目前使用這種方式會有個問題,及時paths只能傳遞單個目錄,如果想傳遞多個目錄需要修改filebeat映象的docker-entrypoint.sh指令碼,對該環境變數進行解析增加filebeat.yml檔案中的paths列表。

推薦使用configmap,這樣filebeat的配置就能夠更靈活。

注意事項

部署deployment

kubectl create -f filebeat-test.yaml
檢視將可以看到列表有這樣的indices:

green open filebeat-docker-test            7xpewebuqrirk8odx36gaa 5 1   2151     0   1.6mb 841.8kb
點開每個日誌條目,可以看到以下詳細字段:

filebeat收集的日誌詳細資訊

- filebeat收集的日誌詳細資訊

_index值即我們在yaml檔案的configmap中配置的index值

beat.hostname和beat.name即pod的名稱

source表示filebeat容器中的日誌目錄

我們可以通過人為得使index = service name,這樣就可以方便的收集和檢視每個service的日誌。

在使用了6.2.4版本的elk以後,使用如上配置,if [type]匹配不到在filebeat裡面使用document_type定義的字串。在多次除錯和詢問後,發現在6.0版本以上已經取消了document_type的定義。如果要實現以上的配置只能使用如下配置

三、解決方案

?解決方案為在filebeat裡面新增乙個fields欄位,service : gamestatis都是自己定義的,定義完成後使用logstash的if 判斷,條件為if [fields][service] == "gamestatis".就可以了。

?filebeat配置:

filebeat.yml: |

filebeat.prospectors:

- input_type: log

paths:

- "/log/*.log"

fields:

K8S之EFK日誌收集

1.1 部署es 2 共6個檔案 root k8s master01 efk ls es service.yaml es statefulset.yaml fluentd es configmap.yaml fluentd es ds.yaml kibana deployment.yaml kiba...

基於k8s集群 搭建efk日誌系統

1.官方位址 2.搭建es集群 kubectl get po n kube system grep elasticsearch 等待pod狀態到running kubectl describe po elasticsearch logging 0 n kube system grep ip curl...

k8s集群日誌

硬體環境 三颱虛擬機器,10.10.20.203 部署docker etcd flannel kube apiserver kube controller manager kube scheduler elsticsearch kibana 10.10.20.206 部署docker flannel...