上圖是EFK架構圖,k8s環境下常見的日誌採集方式。html
1 集中採集微服務的日誌,能夠根據請求id追蹤到完整的日誌;node
2 統計請求接口的耗時,超出最長響應時間的,須要作報警,並針對性的進行調優;git
3 慢sql排行榜,並報警;github
4 異常日誌排行榜,並報警;sql
5 慢頁面請求排行,並告警;docker
k8s自己不會爲你作日誌採集,須要本身作;shell
k8s的容器日誌處理方式採用的 集羣層級日誌,api
即容器銷燬,pod漂移,Node宕機不會對容器日誌形成影響;瀏覽器
容器的日誌會輸出到stdout,stderr,對應的存儲在宿主機的目錄中,緩存
即 /var/lib/docker/container ;
在每一個node上部署一個daemonset , 跑一個logging-agent收集日誌,
好比fluentd, 採集宿主機對應的數據盤上的日誌,而後輸出到日誌存儲服務或者消息隊列;
優缺點分析:
對比 | 說明 |
---|---|
優勢 | 1每一個Node只須要部署一個Pod採集日誌 2對應用無侵入 |
缺點 | 應用輸出的日誌都必須直接輸出到容器的stdout,stderr中 |
經過在pod中啓動一個sidecar容器,好比fluentd, 讀取容器掛載的volume目錄,輸出到日誌服務端;
日誌輸入源: 日誌文件
日誌處理: logging-agent ,好比fluentd
日誌存儲: 好比elasticSearch , kafka
優缺點分析:
對比 | 說明 |
---|---|
優勢 | 1 部署簡單;2 對宿主機友好; |
缺點 | 1. 消耗較多的資源;2. 日誌經過kubectl logs 沒法看到 |
示例:
apiVersion: v1 kind: Pod metadata: name: counter spec: containers: - name: count image: busybox args: - /bin/sh - -c - > i=0; while true; do echo "$i:$(data)" >> /var/log/1.log echo "$(data) INFO $i" >> /var/log/2.log i=$((i+1)) sleep 1; done volumeMounts: - name: varlog mountPath: /var/log - name: count-agent image: k8s.gcr.io/fluentd-gcp:1.30 env: - name: FLUENTD_ARGS value: -c /etc/fluentd-config/fluentd.conf valumeMounts: - name: varlog mountPath: /var/log - name: config-volume mountPath: /etc/fluentd-config volumes: - name: varlog emptyDir: {} - name: config-volume configMap: name: fluentd-config
適用於應用容器只能把日誌輸出到文件,沒法輸出到stdout,stderr中的場景;
經過一個sidecar容器,直接讀取日誌文件,再從新輸出到stdout,stderr中,
便可使用Node上經過日誌代理轉發的模式;
優缺點分析:
對比 | 說明 |
---|---|
優勢 | 只需耗費比較少的cpu和內存,共享volume處理效率比較高 |
缺點 | 宿主機上存在兩份相同的日誌,磁盤利用率不高 |
適用於有成熟日誌系統的場景,日誌不須要經過k8s;
fluentd是一個統一日誌層的開源數據收集器。
flentd容許你統一日誌收集並更好的使用和理解數據;
四大特徵:
統一日誌層
fluentd隔斷數據源,從後臺系統提供統一日誌層;
簡單靈活
提供了500多個插件,鏈接很是多的數據源和輸出源,內核簡單;
普遍驗證
5000多家數據驅動公司以來Fluentd
最大的客戶經過它收集5萬多臺服務器的日誌
**雲原生**
是雲原生CNCF的成員項目
4大優點:
統一JSON日誌
fluentd嘗試採用JSON結構化數據,這就統一了全部處理日誌數據的方面,收集,過濾,緩存,輸出日誌到多目的地,下行流數據處理使用Json更簡單,由於它已經有足夠的訪問結構並保留了足夠靈活的scemas;
插件化架構
fluntd 有靈活的插件體系容許社區擴展功能,500多個社區貢獻的插件鏈接了不少數據源和目的地; 經過插件,你能夠開始更好的使用你的日誌
最小資源消耗
c和ruby寫的,須要極少的系統資源,40M左右的內存能夠處理13k/時間/秒 ,若是你須要更緊湊的內存,可使用Fluent bit ,更輕量的Fluentd
內核可靠
Fluentd支持內存和基於文件緩存,防止內部節點數據丟失;
也支持robust失敗而且能夠配置高可用模式, 2000多家數據驅動公司在不一樣的產品中依賴Fluentd,更好的使用和理解他們的日誌數據
使用fluentd的緣由:
簡單靈活
10分鐘便可在你的電腦上安裝fluentd,你能夠立刻下載它,500多個插件打通數據源和目的地,插件也很好開發和部署;
開源
**基於Apache2.0證書 徹底開源 **
可靠高性能
5000多個數據驅動公司的不一樣產品和服務依賴fluentd,更好的使用和理解數據,實際上,基於datadog的調查,是使用docker運行的排行top7的技術;
一些fluentd用戶實時採集上千臺機器的數據,每一個實例只須要40M左右的內存,伸縮的時候,你能夠節省不少內存
社區
fluentd能夠改進軟件並幫助其它人更好的使用
大公司使用背書: 微軟 , 亞馬遜; pptv ;
能夠結合elasticSearch + kibana來一塊兒組成日誌套件;
快速搭建EFK集羣並收集應用的日誌,配置性能排行榜;
Elasticsearch 是一個分佈式、RESTful 風格的搜索和數據分析引擎,
可以解決不斷涌現出的各類用例。 做爲 Elastic Stack 的核心,
它集中存儲您的數據,幫助您發現意料之中以及意料以外的狀況。
詳細介紹:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html
Kibana 是一款開源的數據分析和可視化平臺,它是 Elastic Stack 成員之一,
設計用於和 Elasticsearch 協做。您可使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、
查看、交互操做。您能夠很方便的利用圖表、表格及地圖對數據進行多元化的分析和呈現。
Kibana 可使大數據通俗易懂。它很簡單,
基於瀏覽器的界面便於您快速建立和分享動態數據儀表板來追蹤 Elasticsearch 的實時數據變化.
詳細介紹:https://www.elastic.co/guide/cn/kibana/current/introduction.html
https://github.com/kayrus/elk-kubernetes
直接拖代碼下來,而後配置後 context, namespace , 便可安裝;
cd elk-kubernetes ./deploy.sh --watch
下面是deploy.sh的腳本,能夠簡單看一下:
#!/bin/sh CDIR=$(cd `dirname "$0"` && pwd) cd "$CDIR" print_red() { printf '%b' "\033[91m$1\033[0m\n" } print_green() { printf '%b' "\033[92m$1\033[0m\n" } render_template() { eval "echo \"$(cat "$1")\"" } KUBECTL_PARAMS="--context=250091890580014312-cc3174dcd4fc14cf781b6fc422120ebd8" NAMESPACE=${NAMESPACE:-sm} KUBECTL="kubectl ${KUBECTL_PARAMS} --namespace=\"${NAMESPACE}\"" eval "kubectl ${KUBECTL_PARAMS} create namespace \"${NAMESPACE}\"" #NODES=$(eval "${KUBECTL} get nodes -l 'kubernetes.io/role!=master' -o go-template=\"{{range .items}}{{\\\$name := .metadata.name}}{{\\\$unschedulable := .spec.unschedulable}}{{range .status.conditions}}{{if eq .reason \\\"KubeletReady\\\"}}{{if eq .status \\\"True\\\"}}{{if not \\\$unschedulable}}{{\\\$name}}{{\\\"\\\\n\\\"}}{{end}}{{end}}{{end}}{{end}}{{end}}\"") NODES=$(eval "${KUBECTL} get nodes -l 'sm.efk=data' -o go-template=\"{{range .items}}{{\\\$name := .metadata.name}}{{\\\$unschedulable := .spec.unschedulable}}{{range .status.conditions}}{{if eq .reason \\\"KubeletReady\\\"}}{{if eq .status \\\"True\\\"}}{{if not \\\$unschedulable}}{{\\\$name}}{{\\\"\\\\n\\\"}}{{end}}{{end}}{{end}}{{end}}{{end}}\"") ES_DATA_REPLICAS=$(echo "$NODES" | wc -l) if [ "$ES_DATA_REPLICAS" -lt 3 ]; then print_red "Minimum amount of Elasticsearch data nodes is 3 (in case when you have 1 replica shard), you have ${ES_DATA_REPLICAS} worker nodes" print_red "Won't deploy more than one Elasticsearch data pod per node exiting..." exit 1 fi print_green "Labeling nodes which will serve Elasticsearch data pods" for node in $NODES; do eval "${KUBECTL} label node ${node} elasticsearch.data=true --overwrite" done for yaml in *.yaml.tmpl; do render_template "${yaml}" | eval "${KUBECTL} create -f -" done for yaml in *.yaml; do eval "${KUBECTL} create -f \"${yaml}\"" done eval "${KUBECTL} create configmap es-config --from-file=es-config --dry-run -o yaml" | eval "${KUBECTL} apply -f -" eval "${KUBECTL} create configmap fluentd-config --from-file=docker/fluentd/td-agent.conf --dry-run -o yaml" | eval "${KUBECTL} apply -f -" eval "${KUBECTL} create configmap kibana-config --from-file=kibana.yml --dry-run -o yaml" | eval "${KUBECTL} apply -f -" eval "${KUBECTL} get pods $@"
簡單分解一下部署的流程:
個人k8s環境中沒有搭建成功,後續搭建成功了再出詳細的安裝筆記。
一句話歸納本篇:EFK是一種經過日誌代理客戶端採集應用日誌比較經常使用的實現方式。
原創不易,關注誠難得,轉發價更高!轉載請註明出處,讓咱們互通有無,共同進步,歡迎溝通交流。