本文主要介紹在k8s中收集應用的日誌方案,應用運行中日誌,通常狀況下都須要收集存儲到一個集中的日誌管理系統中,能夠方便對日誌進行分析統計,監控,甚至用於機器學習,智能分析應用系統問題,及時修復應用所存在的問題。html
在k8s集羣中應用通常有以下日誌輸出方式node
本文會綜合部署上述日誌收集方案。nginx
日誌收集組件說明git
本次實驗使用了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 複製代碼
# 本次部署雖然使用 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 複製代碼
# 部署 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 以 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 複製代碼
建立
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 查看是否有新日誌進入 複製代碼
# 部署 kubectl apply -f log-contanier-file-filebeat.yaml # 查看 kubectl get pods -o wide 複製代碼
添加
index filebeat-k8s-*
查看日誌docker
# 部署 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
替代logstash
,fluent-bit
和filebeat
性能和內存佔用相差不大
fluentd/filebeat
收集fluentd/filebeat
收集fluent-bit/filebeat
收集通用日誌收集系統架構
架構說明
大流量日誌收集系統架構圖
架構說明
以收集nginx
日誌爲例,進行日誌收集分析實驗, 複用以前實驗建立的elasticsearch,kibana
應用。實驗採用大流量日誌收集架構
# 部署 kubectl apply -f redis.yaml # 查看 kubectl get pods -n logging 複製代碼
# 部署 kubectl apply -f logstash-indexer.yaml # 查看 kubectl get pods -n logging 複製代碼
# 部署 kubectl apply -f logstash-shipper.yaml # 查看 kubectl get pods -n logging 複製代碼
# 部署 kubectl apply -f nginx-log-filebeat.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-filebeat/ >/dev/null;sleep 1;count=$(($count+1));done' # 查看 kubectl get pods 複製代碼
添加
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 複製代碼
因爲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-*
製做 Visualize 的時候須要使用
按指定條件搜索日誌
保存 Search
建立好的 Visualize 能夠添加到 Dashboard 中
選擇製做 Visualize
選擇 Visualize 類型
選擇使用上面步驟保存的 Search
選擇指定的 bucket
選擇 code 字段進行統計
保存 Visualize
使用如上的步驟建立多個 Visualize
選擇建立 Dashboard
把 Visualize 添加到 Dashboard
保存 Dashboard
編輯調整位置和大小
最終圖表展現
若是快速體驗能夠在 菜單 Managerment 的 Saved Ojects 標籤直接使用導入功能,導入本次實驗下載目錄k8s-log下的
k8s-kibana-all.json
文件