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

3. ELK 集群配置
集群化的 ELK 系統(tǒng)的關(guān)鍵就是配置集群化的 elasticsearch 系統(tǒng),通過(guò)配置 elasticsearch 的集群,實(shí)現(xiàn)海量日志的存儲(chǔ),和快速查詢。
配置 elasticsearch 集群,我們主要參考了 github 上的一個(gè)樣例 kubernetes-elasticsearch-cluster。
我們將 elasticsearch 節(jié)點(diǎn),分為 master, client, data 三種類型,分別負(fù)責(zé)不同的任務(wù),其中
- Master 節(jié)點(diǎn) - 只復(fù)雜集群的管理,不存儲(chǔ)日志數(shù)據(jù),也不接受 HTTP 請(qǐng)求
- Client 節(jié)點(diǎn) - 主要負(fù)責(zé)接受 HTTP 請(qǐng)求,不存儲(chǔ)日志數(shù)據(jù)
- Data 節(jié)點(diǎn) - 主要復(fù)雜數(shù)據(jù)的存儲(chǔ),不接受 HTTP 請(qǐng)求
在這,我們給出我們的配置文件供大家參考和借鑒
首先,給出 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 進(jìn)行直接交互(如果配置了 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ù)上加上標(biāo)簽,方便 logstash 對(duì)日志進(jìn)行分類,對(duì)不同的日志類型進(jìn)行不同的處理。
- 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ù)日志的標(biāo)簽,對(duì)不同類型的日志,執(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 上運(yùn)行所需的 yaml 文件
想要實(shí)現(xiàn) ELK 集群在 Kubernetes 上的運(yùn)行自然少不了相應(yīng)的 yaml 文件,我們使用的 yaml 文件主要參考了 kubernetes-elk-cluster、kubernetes-elasticsearch-cluster等倉(cāng)庫(kù)。
原文鏈接:https://cloud.tencent.com/community/article/562397,作者:丁呂
【本文是51CTO專欄作者“騰訊云技術(shù)社區(qū)”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)51CTO聯(lián)系原作者獲取授權(quán)】