kubernetes官方提供了efk的日誌收集解決方案,但是這種方案並不適合所有的業務場景,它本身就有一些侷限性,例如:
所有日誌都必須是out前台輸出,真實業務場景中無法保證所有日誌都在前台輸出kubernetes集群中的日誌收集解決方案只能有乙個日誌輸出檔案,而真實業務場景中往往有多個日誌輸出檔案
fluentd並不是常用的日誌收集工具,我們更習慣用logstash,現使用filebeat替代
我們已經有自己的elk集群且有專人維護,沒有必要再在kubernetes上做乙個日誌收集服務
基於以上幾個原因,我們決定使用自己的elk集群。
編號方案
優點缺點
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收集的日誌詳細資訊在使用了6.2.4版本的elk以後,使用如上配置,if [type]匹配不到在filebeat裡面使用document_type定義的字串。在多次除錯和詢問後,發現在6.0版本以上已經取消了document_type的定義。如果要實現以上的配置只能使用如下配置- filebeat收集的日誌詳細資訊
_index值即我們在yaml檔案的configmap中配置的index值
beat.hostname和beat.name即pod的名稱
source表示filebeat容器中的日誌目錄
我們可以通過人為得使index = service name,這樣就可以方便的收集和檢視每個service的日誌。
三、解決方案
?解決方案為在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...