k8s日誌收集實戰

簡介

本文主要介紹在k8s中收集應用的日誌方案,應用運行中日誌,通常狀況下都須要收集存儲到一個集中的日誌管理系統中,能夠方便對日誌進行分析統計,監控,甚至用於機器學習,智能分析應用系統問題,及時修復應用所存在的問題。html

在k8s集羣中應用通常有以下日誌輸出方式node

  • 直接遵循docker官方建議把日誌輸出到標準輸出或者標準錯誤輸出
  • 輸出日誌到容器內指定目錄中
  • 應用直接發送日誌給日誌收集系統

本文會綜合部署上述日誌收集方案。nginx

日誌收集組件說明git

  • elastisearch 存儲收集到的日誌
  • kibana 可視化收集到的日誌
  • logstash 彙總處理日誌發送給elastisearch 存儲
  • filebeat 讀取容器或者應用日誌文件處理髮送給elastisearch或者logstash,也可用於彙總日誌
  • fluentd 讀取容器或者應用日誌文件處理髮送給elastisearch,也可用於彙總日誌
  • fluent-bit 讀取容器或者應用日誌文件處理髮送給elastisearch或者fluentd

部署

本次實驗使用了3臺虛擬機作k8s集羣,每臺虛擬機3G內存github

部署前的準備

# 拉取文件
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-*,因爲須要拉取鏡像啓動容器,可能須要等待幾分鐘才能看到索引和數據web

查看日誌redis

應用日誌收集測試

應用日誌輸出到標準輸出測試

# 啓動測試日誌輸出
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-* 查看日誌docker

應用日誌輸出到容器指定目錄(fluent-bit收集)

# 部署
kubectl apply -f log-contanier-file-fluentbit.yaml

# 查看
kubectl get pods -o wide
複製代碼

添加index fluentbit-k8s-* 查看日誌json

應用直接發送日誌到日誌系統

# 本次測試應用直接輸出日誌到 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替代logstashfluent-bitfilebeat性能和內存佔用相差不大

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文件

參考文檔

相關文章
相關標籤/搜索