前言
ECK真的很深阿...
但真的弄起來後,還挺好分析的。
前提是,你有那些資料可供分析。
這次是為了要取得GKE上面 的pod Name跟其他資料,
這樣在搜尋欄位時,才能夠找到log
正文
filebeat抓資料的方式
- autodiscover
- without autodiscover
要注意的是,如果用(2) 的方式,在GKE上面,你要使用 add_kubernetes_metadata,去取得pod name,namespace…等,
通通抓不到。
因為(2)是直接去node的log裡面抓資料,並沒有透過api的方式,
所以如果要取得 pod name的話,可能要從log path著手。
應該是可以從ingest 去處理。
但用(1),資料就通通進來了。
所以還是用(1)吧。
ref.
排除資料的方式
沒有記錄log不知道,一記錄了才知道。
資料有夠肥。
開始跟同仁說,沒有必要的不要留。
但有些是先天限制,就是會拚命印,那該怎麼解決。
- 排除訊息內的特定文字,通通不收
在autodiscover 底下使用 exclude_lines
autodiscover:
providers:
- type: kubernetes
node: ${NODE_NAME}
hints:
enabled: true
default_config:
type: container
paths:
- /var/log/containers/*${data.kubernetes.container.id}.log
exclude_lines:
- ".*(NAT rule custom-iptables|unknown operand).*" # 排除 k8s-custom-iptables
ref. Log input
- 排除特定namespace
在 processors 底下加 drop_event,這邊有用到condition的條件,建議看一下文件比較清楚。
processors:
- add_cloud_metadata: {}
- drop_event.when:
or:
- equals:
kubernetes.namespace: "kube-system"
- equals:
kubernetes.namespace: "elastic-system"
ref.
移除特定欄位
有些欄位得到的值是重複的,
所以這些也都可以砍掉。
processors 底下加 drop_fields
processors:
- drop_fields:
fields:
- 'kubernetes.node'
- 'kubernetes.namespace_uid'
- 'agent.hostname'
- 'cloud.account'
- 'cloud.provider'
- 'cloud.instance.name'
- 'container.id'
詳細參數說明
type: log #input類型為log
enable: true #表示是該log類型配置生效
paths: #指定要監控的日誌,目前按照Go語言的glob函數處理。沒有對配置目錄做遞歸處理,比如配置的如果是:
- /var/log/* /*.log #則只會去/var/log目錄的所有子目錄中尋找以".log"結尾的文件,而不會尋找/var/log目錄下以".log"結尾的文件。
recursive_glob.enabled: #啟用全局遞歸模式,例如/foo/**包括/foo, /foo/*, /foo/*/*
encoding:#指定被監控的文件的編碼類型,使用plain和utf-8都是可以處理中文日誌的
exclude_lines: ['^DBG'] #不包含匹配正則的行
include_lines: ['^ERR', '^WARN'] #包含匹配正則的行
harvester_buffer_size: 16384 #每個harvester在獲取文件時使用的緩衝區的字節大小
max_bytes: 10485760 #單個日誌消息可以擁有的最大字節數。max_bytes之後的所有字節都被丟棄而不發送。默認值為10MB (10485760)
exclude_files: ['\.gz$'] #用於匹配希望Filebeat忽略的文件的正則表達式列表
ingore_older: 0 #默認為0,表示禁用,可以配置2h,2m等,注意ignore_older必須大於close_inactive的值.表示忽略超過設置值未更新的
文件或者文件從來沒有被harvester收集
close_* #close_ *配置選項用於在特定標準或時間之後關閉harvester。 關閉harvester意味著關閉文件處理程序。 如果在harvester關閉
後文件被更新,則在scan_frequency過後,文件將被重新拾取。 但是,如果在harvester關閉時移動或刪除文件,Filebeat將無法再次接收文件
,並且harvester未讀取的任何數據都將丟失。
close_inactive #啟動選項時,如果在制定時間沒有被讀取,將關閉文件句柄
讀取的最後一條日誌定義為下一次讀取的起始點,而不是基於文件的修改時間
如果關閉的文件發生變化,一個新的harverster將在scan_frequency運行後被啟動
建議至少設置一個大於讀取日誌頻率的值,配置多個prospector來實現針對不同更新速度的日誌文件
使用內部時間戳機制,來反映記錄日誌的讀取,每次讀取到最後一行日誌時開始倒計時使用2h 5m 來表示
close_rename #當選項啟動,如果文件被重命名和移動,filebeat關閉文件的處理讀取
close_removed #當選項啟動,文件被刪除時,filebeat關閉文件的處理讀取這個選項啟動後,必須啟動clean_removed
close_eof #適合只寫一次日誌的文件,然後filebeat關閉文件的處理讀取
close_timeout #當選項啟動時,filebeat會給每個harvester設置預定義時間,不管這個文件是否被讀取,達到設定時間後,將被關閉
close_timeout 不能等於ignore_older,會導致文件更新時,不會被讀取如果output一直沒有輸出日誌事件,這個timeout是不會被啟動的,
至少要要有一個事件發送,然後haverter將被關閉
設置0 表示不啟動
clean_inactived #從註冊表文件中刪除先前收穫的文件的狀態
設置必須大於ignore_older+scan_frequency,以確保在文件仍在收集時沒有刪除任何狀態
配置選項有助於減小註冊表文件的大小,特別是如果每天都生成大量的新文件
此配置選項也可用於防止在Linux上重用inode的Filebeat問題
clean_removed #啟動選項後,如果文件在磁盤上找不到,將從註冊表中清除filebeat
如果關閉close removed 必須關閉clean removed
scan_frequency #prospector檢查指定用於收穫的路徑中的新文件的頻率,默認10s
tail_files:#如果設置為true,Filebeat從文件尾開始監控文件新增內容,把新增的每一行文件作為一個事件依次發送,
而不是從文件開始處重新發送所有內容。
symlinks:#符號鏈接選項允許Filebeat除常規文件外,可以收集符號鏈接。收集符號鏈接時,即使報告了符號鏈接的路徑,
Filebeat也會打開並讀取原始文件。
backoff: #backoff選項指定Filebeat如何積極地抓取新文件進行更新。默認1s,backoff選項定義Filebeat在達到EOF之後
再次檢查文件之間等待的時間。
max_backoff: #在達到EOF之後再次檢查文件之前Filebeat等待的最長時間
backoff_factor: #指定backoff嘗試等待時間幾次,默認是2
harvester_limit:#harvester_limit選項限制一個prospector並行啟動的harvester數量,直接影響文件打開數
tags #列表中添加標籤,用過過濾,例如:tags: ["json"]
fields #可選字段,選擇額外的字段進行輸出可以是標量值,元組,字典等嵌套類型
默認在sub-dictionary位置
filebeat.inputs:
fields:
app_id: query_engine_12
fields_under_root #如果值為ture,那麼fields存儲在輸出文檔的頂級位置
multiline.pattern #必須匹配的regexp模式
multiline.negate #定義上面的模式匹配條件的動作是 否定的,默認是false
假如模式匹配條件'^b',默認是false模式,表示講按照模式匹配進行匹配 將不是以b開頭的日誌行進行合併
如果是true,表示將不以b開頭的日誌行進行合併
multiline.match # 指定Filebeat如何將匹配行組合成事件,在之前或者之後,取決於上面所指定的negate
multiline.max_lines #可以組合成一個事件的最大行數,超過將丟棄,默認500
multiline.timeout #定義超時時間,如果開始一個新的事件在超時時間內沒有發現匹配,也將發送日誌,默認是5smax_procs #設置可以同時執行的最大CPU數。默認值為系統中可用的邏輯CPU的數量。name #為該filebeat指定名字,默認為主機的hostname
ref.
filebeat log寫入到檔案
filebeat在運作時,會產生一堆log,這些我原本都不想讓他輸出,直接寫在自己的檔案就好。
![[57.fig-2.jpg]]
但沒測試成功,最後只好採用治標不治本的方式,
在該namespace底下的log通通不進ES。
留一下查到的資料。
logging:
to_files: true
metrics.enabled: false
files:
path: '/usr/share/filebeat/logs'
name: 'filebeat'
rotateeverybytes: 10485760 # = 10MB
keepfiles: 7
permission: '0640'
ref.
完整yaml,使用operator
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
name: yabo
namespace: elastic-system
spec:
type: filebeat
version: 7.15.0
elasticsearchRef:
name: yabo
kibanaRef:
name: yabo
config:
filebeat:
autodiscover:
providers:
- type: kubernetes
node: ${NODE_NAME}
# templates:
# - condition:
# not:
# equals:
# kubernetes.namespace: kube-system
# - kubernetes.namespace: elastic-system
# config:
# - type: container
# paths:
# - /var/log/containers/*${data.kubernetes.container.id}.log
hints:
enabled: true
default_config:
type: container
paths:
- /var/log/containers/*${data.kubernetes.container.id}.log
exclude_lines:
- ".*(NAT rule custom-iptables|unknown operand).*" # 排除 k8s-custom-iptables
- ".*(YABO_WS.Services.PromoWebSocketService|YABO_WS.BLL.ActivityEventLogic).*" # 排除yabo-ws
processors:
- add_cloud_metadata: {}
# - add_host_metadata: {}
- drop_event.when:
or:
- equals:
kubernetes.namespace: "kube-system"
- equals:
kubernetes.namespace: "elastic-system"
- drop_fields:
fields:
- 'kubernetes.node'
- 'kubernetes.namespace_uid'
- 'agent.hostname'
- 'cloud.account'
- 'cloud.provider'
- 'cloud.instance.name'
- 'container.id'
- decode_json_fields:
fields: ["message"]
target: ""
overwrite_keys: true
# 測試沒用,無法寫到
# logging:
# to_files: true
# metrics.enabled: false
# files:
# path: '/usr/share/filebeat/logs'
# name: 'filebeat'
# rotateeverybytes: 10485760 # = 10MB
# keepfiles: 7
# permission: '0644'
daemonSet:
podTemplate:
spec:
serviceAccountName: filebeat
automountServiceAccountToken: true
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true # Allows to provide richer host metadata
containers:
- name: filebeat
securityContext:
runAsUser: 0
# If using Red Hat OpenShift uncomment this:
#privileged: true
volumeMounts:
- name: varlogcontainers
mountPath: /var/log/containers
- name: varlogpods
mountPath: /var/log/pods
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumes:
- name: varlogcontainers
hostPath:
path: /var/log/containers
- name: varlogpods
hostPath:
path: /var/log/pods
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
resources:
- namespaces
- pods
- nodes
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: elastic-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: filebeat
subjects:
- kind: ServiceAccount
name: filebeat
namespace: elastic-system
roleRef:
kind: ClusterRole
name: filebeat
apiGroup: rbac.authorization.k8s.io
...
ref.
0 意見:
張貼留言