ELK 集群,騰訊云上的日志監控不用愁
公司項目,越來越多的系統在計劃上云。如何監控云上的系統運行,是每個系統上云的過程中都會碰到的一個問題。在這里,我們以公司的某個項目為例,向大家詳細闡述該項目上云后的日志監控方案,詳細講解如何通過ELK集群,實現每天百G日志的監控。
此項目原本是一個包含眾多業務流的一個 APP 監控系統,在遷移到騰訊云之后,希望接入更多的業務,日志監控壓力也隨之劇增,每天的日志數量將達到百 G 以上,為滿足這個項目的日志監控需求,特意在騰訊云的 kubernetes(K8s) 上配置了一套 ELK 集群。
1.ELK 系統介紹
我們在 SNGAPM 項目這個配置的 ELK 系統主要包含四個部分 filebeat,logstash,elasticsearch 以及 kibana。其中
- filebeat 主要負責日志的收集,能自動感知日志文件中增加的 log 條目。
- logstash 主要復雜日志文件的轉發,并且在轉發過程中對日志進行過濾和整理。
- elasticsearch 可以看作一個高效的集群化的數據庫,可以直接通過 url 對其進行訪問,在 ELK 中,主要復雜 ELK 的存儲,也是真個 ELK 系統的核心。
- kibana 可以看作 elasticsearch 的一個前端頁面,其將用戶的操作轉化為 elasticsearch 的查詢指令,并將從 elasticsearch 查詢到的數據進行圖形化展示。
2. ELK 集群預覽
在物理機上,可以通過多臺服務器構建一個 ELK 的集群,在騰訊云上,配置 ELK 集群的另一種方式就是通過 kubernetes 管理一個包含多個 pods 的 ELK。

3. ELK 集群配置
集群化的 ELK 系統的關鍵就是配置集群化的 elasticsearch 系統,通過配置 elasticsearch 的集群,實現海量日志的存儲,和快速查詢。
配置 elasticsearch 集群,我們主要參考了 github 上的一個樣例 kubernetes-elasticsearch-cluster。
我們將 elasticsearch 節點,分為 master, client, data 三種類型,分別負責不同的任務,其中
- Master 節點 - 只復雜集群的管理,不存儲日志數據,也不接受 HTTP 請求
- Client 節點 - 主要負責接受 HTTP 請求,不存儲日志數據
- Data 節點 - 主要復雜數據的存儲,不接受 HTTP 請求
在這,我們給出我們的配置文件供大家參考和借鑒
首先,給出 elasticsearch 的集群配置方法
- cluster:
- name: ${CLUSTER_NAME}
- node:
- master: ${NODE_MASTER}
- data: ${NODE_DATA}
- name: ${NODE_NAME}
- ingest: ${NODE_INGEST}
- max_local_storage_nodes: ${MAX_LOCAL_STORAGE_NODES}
- network.host: ${NETWORK_HOST}
- path:
- data: /***/***
- logs: /***/***
- bootstrap:
- memory_lock: true
- http:
- enabled: ${HTTP_ENABLE}
- compression: true
- cors:
- enabled: ${HTTP_CORS_ENABLE}
- allow-origin: ${HTTP_CORS_ALLOW_ORIGIN}
- discovery:
- zen:
- ping.unicast.hosts: ${DISCOVERY_SERVICE}
- minimum_master_nodes: ${NUMBER_OF_MASTERS}
其次是配置 kibana,只需要提供 elasticsearch 的訪問 url,就能直接與 elasticsearch 進行直接交互(如果配置了 x-pack 插件,還須提供相應的用戶名以及密碼才能訪問)。
- server.host: "0.0.0.0"
- elasticsearch.url: "http://elasticsearch.default.svc.cluster.local:9200"
- elasticsearch.username: "******"
- elasticsearch.password: "******"
***是配置 logstash 以及 filebeat
在 filebeat 中設置日志文件的路徑,并在輸入的日志數據上加上標簽,方便 logstash 對日志進行分類,對不同的日志類型進行不同的處理。
- filebeat.prospectors:
- - input_type: log
- paths:
- - /*****.log
- - /*****.log
- document_type: json_log
- tags: ["json-log", "itrans"]
- output.logstash:
- hosts: ${LOGSTASH_HOSTS:?No logstash host configured. Use env var LOGSTASH_HOSTS to set hosts.}
- logging.level: info
- logging.files:
- path: /home
- name: filebeat.log
在這里,logstash 根據日志的標簽,對不同類型的日志,執行不同的處理(如果配置了 x-pack 插件,還須提供相應的用戶名以及密碼才能訪問)。
- input {
- beats {
- port => 5043
- congestion_threshold => 60
- }
- }
- filter {
- if "json-log" in [tags] {
- json {
- source => "message"
- remove_field => [ "message"]
- }
- mutate {
- replace => { "type" => "json-log" }
- }
- }
- }
- output {
- if "json-log" in [tags] {
- elasticsearch {
- hosts => ["elasticsearch:9200"]
- manage_template => false
- index => "%{label}-%{ YYYY.MM.dd.HH}"
- user => ******
- password => ******
- }
- } else {
- elasticsearch {
- hosts => ["elasticsearch:9200"]
- manage_template => false
- index => "unlabeled-%{ YYYY.MM.dd.HH}"
- user => ******
- password => ******
- }
- }
- }
4.在 Kubernetes 上運行所需的 yaml 文件
想要實現 ELK 集群在 Kubernetes 上的運行自然少不了相應的 yaml 文件,我們使用的 yaml 文件主要參考了 kubernetes-elk-cluster、kubernetes-elasticsearch-cluster等倉庫。
原文鏈接:https://cloud.tencent.com/community/article/562397,作者:丁呂
【本文是51CTO專欄作者“騰訊云技術社區”的原創稿件,轉載請通過51CTO聯系原作者獲取授權】