Pages - Menu

2022年2月17日 星期四

[ECK]filebeat 補充說明

前言

ECK真的很深阿...
但真的弄起來後,還挺好分析的。
前提是,你有那些資料可供分析。
這次是為了要取得GKE上面 的pod Name跟其他資料,
這樣在搜尋欄位時,才能夠找到log

正文

filebeat抓資料的方式

  1. autodiscover
  2. without autodiscover

要注意的是,如果用(2) 的方式,在GKE上面,你要使用 add_kubernetes_metadata,去取得pod name,namespace…等,
通通抓不到。

因為(2)是直接去node的log裡面抓資料,並沒有透過api的方式,
所以如果要取得 pod name的話,可能要從log path著手。
應該是可以從ingest 去處理。

但用(1),資料就通通進來了。



所以還是用(1)吧。

ref.


排除資料的方式

沒有記錄log不知道,一記錄了才知道。
資料有夠肥。

開始跟同仁說,沒有必要的不要留。
但有些是先天限制,就是會拚命印,那該怎麼解決。

  1. 排除訊息內的特定文字,通通不收
    在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

  1. 排除特定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'

ref. Drop fields from events


詳細參數說明

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.

沒有留言:

張貼留言