天天看點

k8s日志收集實戰

簡介

本文主要介紹在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隊列。

# 部署
kubectl apply -f fluentd-indexer.yaml

# 檢視
kubectl get pods -n logging
複制代碼           
# 部署
kubectl apply -f fluentd-shipper.yaml

# 檢視
kubectl get pods -n logging
複制代碼           
# 部署
kubectl apply -f nginx-log-fluentbit.yaml

# 檢視
kubectl get pods
複制代碼           
# 部署
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
複制代碼           

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
複制代碼           

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

檔案

本文轉自掘金-

k8s日志收集實戰

繼續閱讀