通常狀況下咱們都會在公司部署elk來收集服務的運行狀態,能夠直接讓開發方便查看,不用登錄機器查看,另外也能夠報警,方便快速問題定位。
若是想要部署能夠看一下我以前的文檔部署,有結合redis和kafka的部署node
今天主要是針對k8s部署監控全部pod的nginx
2、架構選型
存儲層: Elasticsearch 是一個實時的、分佈式的可擴展的搜索引擎,容許進行全文、結構化搜索,它一般用於索引和搜索大量日誌數據,也可用於搜索許多不一樣類型的文檔。web
展現層:Kibana 是 Elasticsearch 的一個功能強大的數據可視化 Dashboard,Kibana 容許你經過 web 界面來瀏覽 Elasticsearch 日誌數據。redis
緩存層: 須要收集大數據量的日誌通常使用Redis、kafka作爲中間緩存層來緩衝數據。緩存
採集層:架構
Fluentd:是一個流行的開源數據收集器, 具備衆多插件,經過獲取容器日誌文件、過濾和轉換日誌數據,而後將數據傳遞到 Elasticsearch 集羣,在該集羣中對其進行索引和存儲。
Fluentd-bit: 更適用於嵌入設備等資源受限的場景。佔用系統資源較少,在插件能夠知足需求的同時,無疑是更好的選擇。另外Fluent Bit 提供了輸出插件,能夠把數據發給 Fluentd,所以他們能夠在系統中做爲獨立服務互相協做。對好比下app
【備註】:日誌採集工具--Logstash、Filebeat、Fluentd、Logagent對比
https://developer.51cto.com/art/201904/595529.htmelasticsearch
3、部署Elasticsearch 集羣
yaml文件我已經上傳到了百度盤,能夠直接下載使用,記得修改報警郵件的受權碼分佈式
連接:https://pan.baidu.com/s/1MpOn-7PkIKdqrKOofLUQQw
提取碼:ap6h ide
記得先部署,nfs的動態存儲
StorageClass持久化存儲
【注】這個參考 prometheus當中的部署,包也在百度盤
使用3個 Elasticsearch Pod 來避免高可用下多節點集羣中出現的「腦裂」問題
建立一個名爲 logging 的 namespace:
kubectl create namespace logging
kubectl create -f elasticsearch-svc.yaml
kubectl create -f elasticsearch-statefulset.yaml
驗證ES服務是否正常
將本地端口9200轉發到 Elasticsearch 節點(如es-0)對應的端口:
部署Kibana服務
kubectl create -f kibana.yaml
訪問一下kibana
5、部署Fluentd採集插件
因爲咱們使用的採集方案,只須要在每臺節點上部署一個採集器便可,對資源沒有過大的消耗,因此選擇對插件支持更多,使用更加普遍的Fluentd 來做爲日誌收集工具。下面咱們使用DasemonSet 控制器來部署 Fluentd 應用,以確保在集羣中的每一個節點上始終運行一個 Fluentd 收集容器。
kubectl create -f fluentd-configmap.yaml
剛纔咱們使用ConfigMap對象編寫的Fluentd的配置文件,也已經經過volumes 掛載到了Fluentd 容器中。咱們也能夠經過給節點打標籤的方式,靈活控制哪些節點的日誌能夠被收集。在上面文件中咱們定義了nodeSelector字段,來收集集羣中含有這個beta.kubernetes.io/fluentd-ds-ready: "true"標籤的節點日誌。
爲須要收集日誌的節點添加標籤
kubectl label nodes k8s-node1 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes k8s-node3 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes k8s-master beta.kubernetes.io/fluentd-ds-ready=true kubectl get nodes --show-labels
kubectl get pods -n logging
kubectl create -f dummylogs.yaml
kubectl get pod
由於存在了因此不能建立了
好比咱們啓動一個nginx看一下如何收集
咱們指定了只收集具備logging=true標籤的Pod日誌
去kibana查看一下
按照條件查一下
kubernetes.pod_name is nignx
在好比部署一個jenkins容器看一下
記得添加標籤logging=true標籤
也收集過來了
接下來開始報警
6、實現基於日誌的報警
在應用層面咱們可使用 Promethus 對應用的各項指標進行監控,可是在業務層面,應用的日誌中也會產生一些錯誤日誌,影響業務的正常運行,因此咱們還須要對錯誤日誌進行監控報警,可使用 elastalert 組件來完成這個工做。
下面咱們使用郵件方式報警,編寫資源文件elastalert.yaml
使用郵件進行報警的時候,須要指定一個smtp_auth_file 的文件,文件中包含用戶名和密碼:(smtp_auth_file.yaml)
kubectl create secret generic smtp-auth --from-file=smtp_auth_file.yaml -n logging
kubectl apply -f elastalert.yaml
咱們的示例應用會隔一段時間就產生 ERROR 級別的錯誤日誌,因此正常狀況下咱們就能夠收到以下所示的郵件信息了:
好了今天就先到這裏歡迎留言評論