ELK 集群,騰訊云上的日志監(jiān)控不用愁
公司項目,越來越多的系統(tǒng)在計劃上云。如何監(jiān)控云上的系統(tǒng)運行,是每個系統(tǒng)上云的過程中都會碰到的一個問題。在這里,我們以公司的某個項目為例,向大家詳細闡述該項目上云后的日志監(jiān)控方案,詳細講解如何通過ELK集群,實現(xiàn)每天百G日志的監(jiān)控。
此項目原本是一個包含眾多業(yè)務(wù)流的一個 APP 監(jiān)控系統(tǒng),在遷移到騰訊云之后,希望接入更多的業(yè)務(wù),日志監(jiān)控壓力也隨之劇增,每天的日志數(shù)量將達到百 G 以上,為滿足這個項目的日志監(jiān)控需求,特意在騰訊云的 kubernetes(K8s) 上配置了一套 ELK 集群。
1.ELK 系統(tǒng)介紹
我們在 SNGAPM 項目這個配置的 ELK 系統(tǒng)主要包含四個部分 filebeat,logstash,elasticsearch 以及 kibana。其中
- filebeat 主要負責日志的收集,能自動感知日志文件中增加的 log 條目。
- logstash 主要復(fù)雜日志文件的轉(zhuǎn)發(fā),并且在轉(zhuǎn)發(fā)過程中對日志進行過濾和整理。
- elasticsearch 可以看作一個高效的集群化的數(shù)據(jù)庫,可以直接通過 url 對其進行訪問,在 ELK 中,主要復(fù)雜 ELK 的存儲,也是真?zhèn)€ ELK 系統(tǒng)的核心。
- kibana 可以看作 elasticsearch 的一個前端頁面,其將用戶的操作轉(zhuǎn)化為 elasticsearch 的查詢指令,并將從 elasticsearch 查詢到的數(shù)據(jù)進行圖形化展示。
2. ELK 集群預(yù)覽
在物理機上,可以通過多臺服務(wù)器構(gòu)建一個 ELK 的集群,在騰訊云上,配置 ELK 集群的另一種方式就是通過 kubernetes 管理一個包含多個 pods 的 ELK。
3. ELK 集群配置
集群化的 ELK 系統(tǒng)的關(guān)鍵就是配置集群化的 elasticsearch 系統(tǒng),通過配置 elasticsearch 的集群,實現(xiàn)海量日志的存儲,和快速查詢。
配置 elasticsearch 集群,我們主要參考了 github 上的一個樣例 kubernetes-elasticsearch-cluster。
我們將 elasticsearch 節(jié)點,分為 master, client, data 三種類型,分別負責不同的任務(wù),其中
- Master 節(jié)點 - 只復(fù)雜集群的管理,不存儲日志數(shù)據(jù),也不接受 HTTP 請求
- Client 節(jié)點 - 主要負責接受 HTTP 請求,不存儲日志數(shù)據(jù)
- Data 節(jié)點 - 主要復(fù)雜數(shù)據(jù)的存儲,不接受 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 插件,還須提供相應(yīng)的用戶名以及密碼才能訪問)。
- server.host: "0.0.0.0"
- elasticsearch.url: "http://elasticsearch.default.svc.cluster.local:9200"
- elasticsearch.username: "******"
- elasticsearch.password: "******"
***是配置 logstash 以及 filebeat
在 filebeat 中設(shè)置日志文件的路徑,并在輸入的日志數(shù)據(jù)上加上標簽,方便 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 根據(jù)日志的標簽,對不同類型的日志,執(zhí)行不同的處理(如果配置了 x-pack 插件,還須提供相應(yīng)的用戶名以及密碼才能訪問)。
- 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 文件
想要實現(xiàn) ELK 集群在 Kubernetes 上的運行自然少不了相應(yīng)的 yaml 文件,我們使用的 yaml 文件主要參考了 kubernetes-elk-cluster、kubernetes-elasticsearch-cluster等倉庫。
原文鏈接:https://cloud.tencent.com/community/article/562397,作者:丁呂
【本文是51CTO專欄作者“騰訊云技術(shù)社區(qū)”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系原作者獲取授權(quán)】




















