k8s使用EFK實現日誌採集存儲展現

k8s集羣上會跑各類各樣的系統和應用程序的pod,而爲了快速發現問題和更好的作日誌監控,就必需要作日誌的採集和集中存儲展現了。綜合考慮之下,咱們推薦使用EFK技術棧來實現這個目的。git

k8s日誌採集架構選型

1,每臺節點採用DaemonSet部署agent:
原理:每臺節點採用DaemonSet部署一個採集日誌的agent,從/var/log/containers/目錄採集全部容器的日誌,而容器中的日誌須要遵循docker的日誌規範,把日誌打入stdout/stderr,這樣k8s會自動在/var/log/containers/目錄生成對應容器的日誌。
優勢:部署維護簡單,且能收集全部容器的日誌
缺點:須要應用程序日誌支持stdout/stderr輸出,若是每一個節點的日誌規模過多,單個採集日誌的agent可能成爲瓶頸,不太靈活github

2,pod的SideCar方式:
原理:每一個pod經過SideCar方式部署一個採集日誌的agent
優勢:每一個pod可單獨配置agent,靈活性高
缺點:每一個pod都須要一個SideCar比較麻煩docker

3,應用程序直接推送日誌到日誌存儲:
原理:部署在pod的應用程序支持把日誌直接推送到日誌存儲程序
優勢:不用維護日誌採集程序,運維簡單
缺點:須要應用程序定製開發,開發成本大json

總結:
建議採用1+2的方案就行日誌採集,1能適應大部分場景,若是特殊應用程序不支持日誌stdout/stderr的輸出,採用2進行採集。vim

k8s日誌採集軟件選型

肯定了總體採集架構,就須要肯定經過哪一個軟件實現了。一般咱們使用的有以下四種,咱們進行大體的對比,選擇適合咱們的軟件。
1,logstash
大名鼎鼎ELK開源架構中的一員,優勢是支持複雜日誌的解析功能很是強大,缺點是性能相對比較差
2,filebeat
相似於logstash,屬於輕量級的日誌採集開源軟件,採用go語言編寫,性能比logstash好。
3,fluent
Treasure Data資助的有數據採集,處理,聚合功能的開源工具,是CNCF的項目,採用c和ruby開發,插件衆多,性能好,是k8s官方推薦的容器日誌採集軟件。
4,fluentbit
Treasure Data資助的有數據採集,處理功能的開源工具,是CNCF的項目,採用c語言開發,相對fluent功能較少,插件較少。這個軟件誕生的初衷就是爲了開發一款輕量級和性能更好的日誌採集工具。 fluentbit性能和其它3款對比最好,更適合於資源受限狀況下的日誌採集,且完美支持k8s。
fluentbit官方給的和fluent的對比見:
https://docs.fluentbit.io/manual/about/fluentd-and-fluent-bitapi

總結:
建議使用fluentbit來經過DaemonSet方式部署在節點進行容器日誌採集,由於有更好的性能和更少的資源消耗。須要特殊複雜的日誌解析處理case,能夠用fluent或者filebeat使用SideCar方式採集。ruby

k8s日誌存儲選型

考慮到日誌存儲+日子分析+數據展現繪圖的需求,故開源實現裏面最優秀的就是ELK架構了,故建議採用elasticsearch作日誌存儲+kibana作繪圖展現。架構

部署flunetbit

本文安裝的flunetbit使用fluentbit 1.4的官方文檔中kubernetes相關部分完成部署app

# kubectl create namespace logging
# kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-service-account.yaml
# kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role.yaml
# kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/fluent-bit-role-binding.yaml

先獲取訪問elasticsearch的用戶名elastic和對應密碼,而後下載configmap manifest,根據使用的elasticsearch環境修改fluent-bit-configmap.yaml中相關output-elasticsearch.conf的配置。主要字段說明以下:
1,HTTP_User和HTTP_Passwd:爲訪問elasticsearch的認證
2,tls和tls.verify:默認elasticsearch必須使用https訪問,故須要開啓tls認證。而elasticsearch的證書爲自簽名證書,故能夠關閉tls驗證功能。
3,Logstash_Format:開啓logstash日誌格式的兼容
4,Logstash_Prefix:當Logstash_Format開啓以後,此字段配置了index的前綴名字,若是配置爲k8s-fluentbit,則index name格式爲mydata-YYYY.MM.DD。而YYYY.MM.DD的value取值爲每條日誌生成的時間的年月日。
5,Time_Key:當Logstash_Format開啓以後,默認此字段的value爲@timestamp,會自動給每條message中添加一個@timestamp字段。這個字段的取值也是每條日誌的生成時間,目前在k8s環境,@timestamp的value爲k8s container日誌的time字段的value。
6,Current_Time_Index:不使用每條日誌的時間做來生成相關的時間戳字段,例如Logstash_Prefix和Time_Key配置中的相關時間戳字段。運維

# kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo
J1fO9bu88j8pYK8rIu91a73o

# wget https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/elasticsearch/fluent-bit-configmap.yaml

# vim fluent-bit-configmap.yaml
  output-elasticsearch.conf: |
    [OUTPUT]
        Name            es
        Match           *
        Host            ${FLUENT_ELASTICSEARCH_HOST}
        Port            ${FLUENT_ELASTICSEARCH_PORT}
        Logstash_Format On
        Logstash_Prefix k8s-fluentbit
        Replace_Dots    On
        Retry_Limit     False
        tls             On
        tls.verify      Off
        HTTP_User       elastic
        HTTP_Passwd     J1fO9bu88j8pYK8rIu91a73o
        Type            flb

# kubectl apply -f fluent-bit-configmap.yaml

下載daemonset manifest,根據使用的elasticsearch環境修改相關的3個配置:
1,因爲咱們使用的k8s爲1.18.2版本,故須要修改apiVersion爲新版本:

apiVersion: apps/v1

2,在spec下面添加selector,因爲默認的manifest apply的時候會報'Missing required field "selector"',故須要添加一個selector(和spec.template.metadata.labels.k8s-app的值相同,經過這個manifest建立的pod都會有此label),標識了daemonset操做的對象:

selector:
    matchLabels:
      k8s-app: fluent-bit-logging

3,修改FLUENT_ELASTICSEARCH_HOST的value爲以下:

value: "quickstart-es-http.default.svc"

應用manifest,在全部節點都會啓動一個pod:

# kubectl apply -f fluent-bit-ds.yaml

# kubectl get pods -n logging -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP               NODE      NOMINATED NODE   READINESS GATES
fluent-bit-b5sfx   1/1     Running   0          43m   10.109.125.213   work3     <none>           <none>
fluent-bit-cdxsl   1/1     Running   0          43m   10.105.104.131   master2   <none>           <none>
fluent-bit-cqtsd   1/1     Running   0          43m   10.99.1.102      work1     <none>           <none>
fluent-bit-js8rf   1/1     Running   0          43m   10.100.136.2     master3   <none>           <none>
fluent-bit-z2kbc   1/1     Running   0          43m   10.97.40.73      master1   <none>           <none>
fluent-bit-zw***   1/1     Running   0          43m   10.107.199.125   work2     <none>           <none>

經過kibana查看日誌是否正常流入elasticsearch:
k8s使用EFK實現日誌採集存儲展現

參考

https://docs.fluentbit.io/manual/about/what-is-fluent-bit
https://gist.github.com/StevenACoffman/4e267f0f60c8e7fcb3f77b9e504f3bd7
https://docs.fluentbit.io/manual/installation/kubernetes
https://docs.fluentbit.io/manual/pipeline/outputs/elasticsearch
https://docs.fluentbit.io/manual/pipeline/outputs/tcp-and-tls
https://kubernetes.io/zh/docs/concepts/workloads/controllers/daemonset/

相關文章
相關標籤/搜索