日誌聚合分析系統——Lokinode
什麼是Loki?git
Loki 是 Grafana Labs 團隊最新的開源項目,是一個水平可擴展,高可用性,多租戶的日誌聚合系統。它的設計很是經濟高效且易於操做,由於它不會爲日誌內容編制索引,而是爲每一個日誌流編制一組標籤,專門爲 Prometheus 和 Kubernetes 用戶作了相關優化。github
與傳統日誌收集系統(例ELK)相比,Loki的優點有哪些?算法
解決痛點?docker
無需再去其餘界面,或者終端上查看單個Pod的日誌數據庫
總體架構vim
Loki的架構並不難,主要是如下三部分組成:服務器
Loki 使用與 Prometheus 相同的服務發現和標籤從新標記庫,編寫了 Promtail。在 Kubernetes 中 Promtail 以 DaemonSet 方式運行在每一個節點中,經過 Kubernetes API 獲得日誌的正確元數據,並將它們發送到Loki,以下圖:架構
能夠看到,Loki中主要的組件有Distributor、Ingester和Querier三個。app
負責寫入的組件有Distributor和Ingester兩個:
Distributor
Promtaif 一旦將日誌發送給Loki,Distributor 就是第一個接收日誌的組件。因爲日誌的寫入量可能很大,因此不能在它們傳入時並行寫入數據庫,要先進行批處理和壓縮數據。
Ingester
Ingester 接收到日誌並開始構建 Chunk:
Ingester 是一個有狀態組件,負責構建和刷新Chunk,當Chunk達到必定數量或者時間後,刷新到存儲中去,每個流日誌對應一個Ingester。index和Chunk各自使用單獨的數據庫,由於他們存儲額數據類型不一樣。
負責讀的組件則是Querier:
讀取就比較簡單,由 Querier 負責給定一個時間範圍和標籤選擇器,也就是收到讀請求:
搭建使用
上邊主要介紹的Loki的工做流程及組件,下面咱們實際搭建操做下:
Loki項目地址:https://github.com/grafana/loki/
1、經過Helm部署:
## 添加chart helm repo add loki https://grafana.github.io/loki/charts ## 更新chart helm repo update ## 將loki template下載到本地 helm fetch loki/loki-stack ## 解壓並自定義修改參數 tar zxvf loki-stack-2.0.2.tgz cd loki-stack/ $$ ls charts Chart.yaml README.md requirements.lock requirements.yaml templates values.yaml cd charts/ $$ ls filebeat fluent-bit grafana logstash loki prometheus promtail
開始helm安裝前要注意幾個點:
一、能夠修改values.yaml文件,指定是否開啓Grafana、Prometheus等服務,默認不開啓的:
loki: enabled: true promtail: enabled: true fluent-bit: enabled: false grafana: enabled: true sidecar: datasources: enabled: true image: tag: 6.7.0 prometheus: enabled: false
在此只開啓Grafana
修改Grafana的values.yaml,使其Service暴露方式爲NodePort(默認爲ClusterIp):
vim charts/grafana/values.yaml
service: type: NodePort port: 80 nodePort: 30002 # 端口範圍:30000-32767 targetPort: 3000 # targetPort: 4181 To be used with a proxy extraContainer annotations: {} labels: {} portName: service
還有一處帳號密碼能夠自定義修改下:
# Administrator credentials when not using an existing secret (see below)
adminUser: admin
adminPassword: admin
2、promtail服務在構建時會自動掛載:
這就須要特別注意一下,若是是修改過docker默認的存儲路徑的,須要將mount的路徑進行修改,promtail找不到對應的容器日誌
具體docker 存儲路徑,可使用docker info 命令查詢
vim charts/promtail/values.yaml
volumes: - name: docker hostPath: path: /data/lib/docker/containers ## 個人是放在了data下 - name: pods hostPath: path: /var/log/pods volumeMounts: - name: docker mountPath: /data/lib/docker/containers ## 掛載點也要進行修改 readOnly: true
- name: pods mountPath: /var/log/pods readOnly: true
開始安裝:
helm install -n loki --namespace loki -f values.yaml ../loki-stack 2020/11/11 17:18:54 Warning: Merging destination map for chart 'logstash'. The destination item 'filters' is a table and ignoring the source 'filters' as it has a non-table value of: <nil> NAME: loki LAST DEPLOYED: Wed Nov 11 17:18:53 2020 NAMESPACE: loki STATUS: DEPLOYED RESOURCES: ==> v1/ClusterRole NAME AGE loki-promtail-clusterrole 1s loki-grafana-clusterrole 1s ==> v1/ClusterRoleBinding NAME AGE loki-promtail-clusterrolebinding 1s loki-grafana-clusterrolebinding 1s ==> v1/ConfigMap NAME DATA AGE loki-grafana 1 1s loki-grafana-test 1 1s loki-loki-stack 1 1s loki-loki-stack-test 1 1s loki-promtail 1 1s ==> v1/DaemonSet NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE loki-promtail 2 2 0 2 0 <none> 1s ==> v1/Deployment NAME READY UP-TO-DATE AVAILABLE AGE loki-grafana 0/1 1 0 1s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE loki-0 0/1 ContainerCreating 0 2s loki-grafana-56bf5d8d-8zcgp 0/1 Init:0/1 0 2s loki-promtail-6r24r 0/1 ContainerCreating 0 2s loki-promtail-fvnfc 0/1 ContainerCreating 0 2s ==> v1/Role NAME AGE loki-promtail 1s loki-grafana-test 1s loki 1s ==> v1/RoleBinding NAME AGE loki-promtail 1s loki-grafana-test 1s loki 1s ==> v1/Secret NAME TYPE DATA AGE loki Opaque 1 1s loki-grafana Opaque 3 1s ==> v1/Service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.109.216.219 <none> 3100/TCP 1s loki-grafana NodePort 10.100.203.138 <none> 80:30002/TCP 1s loki-headless ClusterIP None <none> 3100/TCP 1s ==> v1/ServiceAccount NAME SECRETS AGE loki 1 1s loki-grafana 1 1s loki-grafana-test 1 1s loki-promtail 1 1s ==> v1/StatefulSet NAME READY AGE loki 0/1 1s ==> v1beta1/PodSecurityPolicy NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS VOLUMES loki false RunAsAny MustRunAsNonRoot MustRunAs MustRunAs true configMap,emptyDir,persistentVolumeClaim,secret,projected,downwardAPI loki-grafana false RunAsAny RunAsAny RunAsAny RunAsAny false configMap,emptyDir,projected,secret,downwardAPI,persistentVolumeClaim loki-grafana-test false RunAsAny RunAsAny RunAsAny RunAsAny false configMap,downwardAPI,emptyDir,projected,secret loki-promtail false RunAsAny RunAsAny RunAsAny RunAsAny true secret,configMap,hostPath,projected,downwardAPI,emptyDir ==> v1beta1/Role NAME AGE loki-grafana 1s ==> v1beta1/RoleBinding NAME AGE loki-grafana 1s
建立完成後,經過暴露的svc訪問Grafana:
[root@Centos8 loki-stack]# kubectl get svc -n loki NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.109.216.219 <none> 3100/TCP 113s loki-grafana NodePort 10.100.203.138 <none> 80:30002/TCP 113s loki-headless ClusterIP None <none> 3100/TCP 113s
2、開始使用Loki
經過服務器ip+30002訪問,登陸成功後,有一點須要注意的地方,也是很是容易踩坑的地方!!!
若是是安裝Loki時採用的以上方法,開啓了Grafana,那系統會自動配置好Data sources,應該不會有什麼問題。
可是,若是是手動搭建的Grafana,須要手動添加Data Sources時,必定注意:
數據源名稱中的Loki,L必定要是大寫!!!
若是不是大寫,會致使鏈接不到Loki源,通常回報錯:Error connecting to datasource: Loki: Bad Gateway. 502
若是是Loki,L大寫,結局徹底不同
數據源添加完畢後,開始查看日誌
點擊Explore,能夠看到選擇labels的地方
如下是labels的展示形式
選擇一個app:grafana的標籤查看一下
默認Loki會將stdout(正常輸出)類型和stderr(錯誤輸出)類型所有展現出來
若是隻想查看stderr錯誤輸出類型的日誌,能夠點擊stderr旁邊的放大鏡來展現:
此時顯示的所有爲錯誤日誌
除了這種辦法,還能夠直接經過上邊的搜索欄,進行自定義的篩選,具體的語法問題,能夠再自行查詢學習。
還能夠查看 Prometheus 的 metrics 信息:
Loki的搭建及簡單的使用就到此結束了