K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

通常狀況下咱們都會在公司部署elk來收集服務的運行狀態,能夠直接讓開發方便查看,不用登錄機器查看,另外也能夠報警,方便快速問題定位。
若是想要部署能夠看一下我以前的文檔部署,有結合redis和kafka的部署node

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
今天主要是針對k8s部署監控全部pod的nginx

2、架構選型
存儲層: Elasticsearch 是一個實時的、分佈式的可擴展的搜索引擎,容許進行全文、結構化搜索,它一般用於索引和搜索大量日誌數據,也可用於搜索許多不一樣類型的文檔。web

展現層:Kibana 是 Elasticsearch 的一個功能強大的數據可視化 Dashboard,Kibana 容許你經過 web 界面來瀏覽 Elasticsearch 日誌數據。redis

緩存層: 須要收集大數據量的日誌通常使用Redis、kafka作爲中間緩存層來緩衝數據。緩存

採集層:架構

Fluentd:是一個流行的開源數據收集器, 具備衆多插件,經過獲取容器日誌文件、過濾和轉換日誌數據,而後將數據傳遞到 Elasticsearch 集羣,在該集羣中對其進行索引和存儲。
Fluentd-bit: 更適用於嵌入設備等資源受限的場景。佔用系統資源較少,在插件能夠知足需求的同時,無疑是更好的選擇。另外Fluent Bit 提供了輸出插件,能夠把數據發給 Fluentd,所以他們能夠在系統中做爲獨立服務互相協做。對好比下app

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

【備註】:日誌採集工具--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持久化存儲
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

【注】這個參考 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)對應的端口:
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
部署Kibana服務
kubectl create -f kibana.yaml
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

訪問一下kibana

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
5、部署Fluentd採集插件
因爲咱們使用的採集方案,只須要在每臺節點上部署一個採集器便可,對資源沒有過大的消耗,因此選擇對插件支持更多,使用更加普遍的Fluentd 來做爲日誌收集工具。下面咱們使用DasemonSet 控制器來部署 Fluentd 應用,以確保在集羣中的每一個節點上始終運行一個 Fluentd 收集容器。

  1. 編寫fluentd的ConfigMap文件

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

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

  1. 使用Daemonset部署Fluentd Pod
    kubectl create -f fluentd-daemonset.yaml

kubectl get pods -n logging
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

  1. 測試應用日誌收集

kubectl create -f dummylogs.yaml
kubectl get pod
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
由於存在了因此不能建立了
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

好比咱們啓動一個nginx看一下如何收集
咱們指定了只收集具備logging=true標籤的Pod日誌

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
去kibana查看一下
按照條件查一下
kubernetes.pod_name is nignx
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
在好比部署一個jenkins容器看一下
記得添加標籤logging=true標籤
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
也收集過來了
接下來開始報警
6、實現基於日誌的報警
在應用層面咱們可使用 Promethus 對應用的各項指標進行監控,可是在業務層面,應用的日誌中也會產生一些錯誤日誌,影響業務的正常運行,因此咱們還須要對錯誤日誌進行監控報警,可使用 elastalert 組件來完成這個工做。

下面咱們使用郵件方式報警,編寫資源文件elastalert.yaml
使用郵件進行報警的時候,須要指定一個smtp_auth_file 的文件,文件中包含用戶名和密碼:(smtp_auth_file.yaml)
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】
kubectl create secret generic smtp-auth --from-file=smtp_auth_file.yaml -n logging
kubectl apply -f elastalert.yaml
咱們的示例應用會隔一段時間就產生 ERROR 級別的錯誤日誌,因此正常狀況下咱們就能夠收到以下所示的郵件信息了:
K8S部署EFK收集pod日誌,經過郵件報警ERROR【19】

好了今天就先到這裏歡迎留言評論

相關文章
相關標籤/搜索