簡介
本文主要介紹在k8s中收集應用的日誌方案,應用執行中日誌,一般情況下都需要收集儲存到一個集中的日誌管理系統中,可以方便對日誌進行分析統計,監控,甚至用於機器學習,智慧分析應用系統問題,及時修復應用所存在的問題。
在k8s叢集中應用一般有如下日誌輸出方式
- 直接遵循docker官方建議把日誌輸出到標準輸出或者標準錯誤輸出
- 輸出日誌到容器內指定目錄中
- 應用直接傳送日誌給日誌收集系統
本文會綜合部署上述日誌收集方案。
日誌收集元件說明
- elastisearch 儲存收集到的日誌
- kibana 視覺化收集到的日誌
- logstash 彙總處理日誌傳送給elastisearch 儲存
- filebeat 讀取容器或者應用日誌檔案處理髮送給elastisearch或者logstash,也可用於彙總日誌
- fluentd 讀取容器或者應用日誌檔案處理髮送給elastisearch,也可用於彙總日誌
- fluent-bit 讀取容器或者應用日誌檔案處理髮送給elastisearch或者fluentd
部署
本次實驗使用了3臺虛擬機器做k8s叢集,每臺虛擬機器3G記憶體
部署前的準備
# 拉取檔案
git clone https://github.com/mgxian/k8s-log.git
cd k8s-log
git checkout v1
# 建立 logging namespace
kubectl apply -f logging-namespace.yaml
複製程式碼
部署elastisearch
# 本次部署雖然使用 StatefulSet 但是沒有使用pv進行持久化資料儲存
# pod重啟之後,資料會丟失,生產環境一定要使用pv持久化儲存資料
# 部署
kubectl apply -f elasticsearch.yaml
# 檢視狀態
kubectl get pods,svc -n logging -o wide
# 等待所有pod變成running狀態
# 訪問測試
# 如果測試都有資料返回代表部署成功
kubectl run curl -n logging --image=radial/busyboxplus:curl -i --tty
nslookup elasticsearch-logging
curl 'http://elasticsearch-logging:9200/_cluster/health?pretty'
curl 'http://elasticsearch-logging:9200/_cat/nodes'
exit
# 清理測試
kubectl delete deploy curl -n logging
複製程式碼
部署kibana
# 部署
kubectl apply -f kibana.yaml
# 檢視狀態
kubectl get pods,svc -n logging -o wide
# 訪問測試
# 瀏覽器訪問下面輸出的地址 看到 kibana 介面代表正常
# 11.11.11.112 為叢集中某個 node 節點ip
KIBANA_NODEPORT=$(kubectl get svc -n logging | grep kibana-logging | awk '{print $(NF-1)}' | awk -F[:/] '{print $2}')
echo "http://11.11.11.112:$KIBANA_NODEPORT/"
複製程式碼
部署fluentd收集日誌
# fluentd 以 daemoset 方式部署
# 在每個節點上啟動fluentd容器,收集k8s元件,docker以及容器的日誌
# 給每個需要啟動fluentd的節點打相關label
# kubectl label node lab1 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes --all beta.kubernetes.io/fluentd-ds-ready=true
# 部署
kubectl apply -f fluentd-es-configmap.yaml
kubectl apply -f fluentd-es-ds.yaml
# 檢視狀態
kubectl get pods,svc -n logging -o wide
複製程式碼
kibana檢視日誌
建立
index fluentd-k8s-*
,由於需要拉取映象啟動容器,可能需要等待幾分鐘才能看到索引和資料
檢視日誌
應用日誌收集測試
應用日誌輸出到標準輸出測試
# 啟動測試日誌輸出
kubectl run echo-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do echo log to stdout $count;sleep 1;count=$(($count+1));done'
# 檢視狀態
kubectl get pods -o wide
# 命令列檢視日誌
ECHO_TEST_POD=$(kubectl get pods | grep echo-test | awk '{print $1}')
kubectl logs -f $ECHO_TEST_POD
# 重新整理 kibana 檢視是否有新日誌進入
複製程式碼
應用日誌輸出到容器指定目錄(filebeat收集)
# 部署
kubectl apply -f log-contanier-file-filebeat.yaml
# 檢視
kubectl get pods -o wide
複製程式碼
新增
index filebeat-k8s-*
檢視日誌
應用日誌輸出到容器指定目錄(fluent-bit收集)
# 部署
kubectl apply -f log-contanier-file-fluentbit.yaml
# 檢視
kubectl get pods -o wide
複製程式碼
新增
index fluentbit-k8s-*
檢視日誌
應用直接傳送日誌到日誌系統
# 本次測試應用直接輸出日誌到 elasticsearch
# 部署
kubectl apply -f log-contanier-es.yaml
# 檢視
kubectl get pods -o wide
複製程式碼
新增
index k8s-app-*
檢視日誌
清理
kubectl delete -f log-contanier-es.yaml
kubectl delete -f log-contanier-file-fluentbit.yaml
kubectl delete -f log-contanier-file-filebeat.yaml
kubectl delete deploy echo-test
複製程式碼
日誌收集系統總結
本小節的圖表以ELK技術棧展示說明,實際使用過程中可以使用EFK技術棧,使用
fluentd
代替logstash
,使用fluent-bit
代替filebeat
。由於fluentd
在記憶體佔用和效能上有更好的優勢,推薦使用fluentd
替代logstash
,fluent-bit
和filebeat
效能和記憶體佔用相差不大
k8s叢集日誌通用收集方案
- 叢集內相關元件日誌使用
fluentd/filebeat
收集 - 應用輸出到標準輸出或標準錯誤輸出的日誌使用
fluentd/filebeat
收集 - 應用輸出到容器中指定檔案日誌使用
fluent-bit/filebeat
收集
通用日誌收集系統
通用日誌收集系統架構
架構說明
- 日誌收集與處理解耦
- 由於收集和處理過程間加入了佇列,當日志出現暴增時,可以避免分析處理節點被打垮,給分析處理節點足夠時間消化日誌資料
- 日誌分析處理節點可以動態伸縮
大流量日誌收集系統
大流量日誌收集系統架構圖
架構說明
- 當日志流量過大時,如果每一個日誌收集節點都直連佇列寫資料,由於有很多分散的連線及寫請求,會給佇列造成壓力。如果日誌都傳送到logstash收集節點,再集中寫入佇列,會減輕佇列壓力。
應用日誌收集實驗(ELK技術棧)
以收集nginx
日誌為例,進行日誌收集分析實驗, 複用之前實驗建立的elasticsearch,kibana
應用。實驗採用大流量日誌收集架構
部署redis佇列
# 部署
kubectl apply -f redis.yaml
# 檢視
kubectl get pods -n logging
複製程式碼
部署indexer分析日誌
# 部署
kubectl apply -f logstash-indexer.yaml
# 檢視
kubectl get pods -n logging
複製程式碼
部署shipper集中日誌
# 部署
kubectl apply -f logstash-shipper.yaml
# 檢視
kubectl get pods -n logging
複製程式碼
部署nginx測試日誌收集
# 部署
kubectl apply -f nginx-log-filebeat.yaml
# 檢視
kubectl get pods
複製程式碼
持續訪問nginx生成日誌
# 部署
kubectl run curl-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 $count" http://nginx-log-filebeat/ >/dev/null;sleep 1;count=$(($count+1));done'
# 檢視
kubectl get pods
複製程式碼
訪問kibana檢視日誌
新增
index k8s-logging-elk-*
由於 logstash 啟動較慢,可能需要等待數分鐘才能看到資料
清理
kubectl delete -f redis.yaml
kubectl delete -f logstash-indexer.yaml
kubectl delete -f logstash-shipper.yaml
kubectl delete -f nginx-log-filebeat.yaml
kubectl delete deploy curl-test
複製程式碼
應用日誌收集實驗(EFK技術棧)
由於fluentd官方不提供redis佇列的支援,本次實驗移除了redis佇列。
部署indexer分析日誌
# 部署
kubectl apply -f fluentd-indexer.yaml
# 檢視
kubectl get pods -n logging
複製程式碼
部署shipper集中日誌
# 部署
kubectl apply -f fluentd-shipper.yaml
# 檢視
kubectl get pods -n logging
複製程式碼
部署nginx測試日誌收集
# 部署
kubectl apply -f nginx-log-fluentbit.yaml
# 檢視
kubectl get pods
複製程式碼
持續訪問nginx生成日誌
# 部署
kubectl run curl-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do curl -s -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36 $count" http://nginx-log-fluentbit/ >/dev/null;sleep 1;count=$(($count+1));done'
# 檢視
kubectl get pod
複製程式碼
訪問kibana檢視日誌
新增
index k8s-logging-efk-*
清理
kubectl delete -f fluentd-indexer.yaml
kubectl delete -f fluentd-shipper.yaml
kubectl delete -f nginx-log-fluentbit.yaml
kubectl delete deploy curl-test
複製程式碼
應用日誌視覺化
部署日誌收集需要的元件
# 部署 indexer shipper fluentbit
kubectl apply -f fluentd-indexer.yaml
kubectl apply -f fluentd-shipper.yaml
kubectl apply -f nginx-log-fluentbit.yaml
# 檢視
kubectl get pods
kubectl get pods -n logging
複製程式碼
模擬使用者訪問
# 部署
kubectl apply -f web-load-gen.yaml
# 檢視
kubectl get pods
複製程式碼
訪問kibana檢視日誌
新增
index k8s-logging-efk-*
建立圖表
建立 Search
製作 Visualize 的時候需要使用
按指定條件搜尋日誌
儲存 Search
建立 Visualize
建立好的 Visualize 可以新增到 Dashboard 中
選擇製作 Visualize
選擇 Visualize 型別
選擇使用上面步驟儲存的 Search
選擇指定的 bucket
選擇 code 欄位進行統計
儲存 Visualize
使用如上的步驟建立多個 Visualize
建立 Dashboard
選擇建立 Dashboard
把 Visualize 新增到 Dashboard
儲存 Dashboard
編輯調整位置和大小
最終圖表展示
如果快速體驗可以在 選單 Managerment 的 Saved Ojects 標籤直接使用匯入功能,匯入本次實驗下載目錄k8s-log下的
k8s-kibana-all.json
檔案
參考文件
- kubernetes.io/docs/concep…
- banzaicloud.com/blog/k8s-lo…
- docs.fluentd.org/v0.12/artic…
- jimmysong.io/kubernetes-…
- github.com/kubernetes/…
- www.elastic.co/blog/shippi…
- github.com/elastic/bea…
- www.elastic.co/guide/en/be…
- www.elastic.co/guide/en/be…
- github.com/fluent/flue…
- github.com/fluent/flue…
- github.com/fluent/flue…
- www.docker.elastic.co/
- fluentbit.io/documentati…
- docs.fluentd.org/v1.0/articl…
- www.elastic.co/guide/en/lo…