1. 程式人生 > 其它 >elk 7.9.3 版本容器化部署

elk 7.9.3 版本容器化部署

ELK-V7.9.3 部署

  • 為什麼用到ELK?
平時我們需要進行日誌分析的時候,可以直接在日誌檔案中 grep、awk 就可以過濾出自己想要的資訊及關鍵字,但規模較大的場景中,此方法極大的減低了效率,面臨的問題,包括日誌量過大,如何歸檔、文字搜尋太慢、如何多維度查詢,需要集中化的日誌管理,所有伺服器上的日誌並收集彙總。常見解決思路就是建立集中式日誌收集系統,將所有節點上的日誌統一收集,管理,訪問,一般大型系統是一個分散式部署的架構,不同的服務模組部署在不同的伺服器上,問題出現時,大部分情況需要根據問題暴露的關鍵資訊,定位到具體的伺服器和服務模組,構建一套集中式日誌系統,可以提高定位問題的效率;
  • 完整的集中式日誌系統,需要包含以下幾個主要特點:
1、收集-能夠採集多種來源的日誌資料
2、傳輸-能夠穩定的把日誌資料傳輸到中央系統
3、儲存-如何儲存日誌資料
4、分析-可以支援 UI 分析
5、警告-能夠提供錯誤報告,監控機制
  • ELK提供了一套優越的解決方案,並且開源,互相配合使用,完美銜接,高效的滿足了很多場合的應用。目前主流的一種日誌系統
ELK是三款開源軟體的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 新增了一個FileBeat,輕量級的日誌收集處理工具(Agent),Filebeat佔用資源少,適合於在各個伺服器上搜集日誌後傳輸給Logstash
1、Elasticsearch是個開源分散式搜尋引擎,提供蒐集、分析、儲存資料三大功能。它的特點有:分散式,零配置,自動發現,索引自動分片,索引副本機制,restful風格介面,多資料來源,自動搜尋負載等。
2、Logstash 主要是日誌的蒐集、分析、過濾日誌的工具,支援大量的資料獲取方式。一般工作方式為c/s架構,client端安裝在需要收集日誌的主機,server端負責將收到的各節點日誌進行過濾、修改等操作一併傳送至elasticsearch。
3、Kibana 是開源和免費的工具,Kibana可以為 Logstash 和 ElasticSearch 提供的日誌分析友好的 Web 介面,可以幫助彙總、分析和搜尋重要資料日誌。
4、Filebeat 涉及兩個元件:查詢器prospector和採集器harvester,來讀取檔案(tail file)並將事件資料傳送到指定的輸出elasticsearch中或者Kibana;
5、概述:
   filebeat隸屬於beats,目前Beats包含工具有:Packetbeat(蒐集網路流量資料),Topbeat(蒐集系統、程序和檔案系統級別的 CPU 和記憶體使用情況等資料)Filebeat(蒐集檔案,日誌資料彙總),Winlogbeat(蒐集 Windows 事件日誌資料)等;
  • 官方文件
Filebeat:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html

Logstash:
https://www.elastic.co/cn/products/logstash
https://www.elastic.co/guide/en/logstash/5.6/index.html

Kibana:
https://www.elastic.co/cn/products/kibana
https://www.elastic.co/guide/en/kibana/5.5/index.html

Elasticsearch:
https://www.elastic.co/cn/products/elasticsearch
https://www.elastic.co/guide/en/elasticsearch/reference/5.6/index.html

elasticsearch中文社群:
https://elasticsearch.cn/
此文件以容器化部署elk,es為叢集,除filebeat為原始碼包的方式
  • Centos 7.x 系統
  • 2.4Hz 8核32G記憶體
  • 注意記憶體需給大,否則會出現es掛的情況

容器化部署elk

  • elasticsearch+filebeat+kibana v7.9.3(最新)
  • docker 服務安裝
# 更新yum源
yum update
# 刪除舊版本的docker
yum remove docker  docker-common docker-selinux docker-engine -y
# 安裝依賴包
yum install -y yum-utils device-mapper-persistent-data lvm2
# 下載安裝docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安裝docker
yum -y install docker-ce
# 啟動docker服務
systemctl start docker && systemctl enable docker
# 檢視docker版本
docker version
  • 下載elasticsearch,kibana映象
docker pull elasticsearch:7.9.3
docker pull kibana:7.9.3
docker pull lmenezes/cerebro:latest (es索引管理工具)
  • 建立elk資料目錄,用於對映容器資料到宿主機
# 建立存放配置檔案,資料,日誌目錄
mkdir -p /data/elk/{conf,data,logs}
# 由於我們ES是以叢集的方式,所以資料跟日誌要建立master,slave1,slave2三個節點目錄
mkdir -p /data/elk/data/{master,slave1,slave2}
mkdir -p /data/elk/logs/{master,slave1,slave2}
  • 建立es-master,slave1,slave2節點配置檔案
# master:/data/elk/conf/master/master.yml
cluster.name: yunwei_cluster 
node.name: master
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
  - 172.17.0.2:9300   # master,此處是es容器的ip,,如不缺則容器啟動之後檢視並修改即可
  - 172.17.0.3:9301   # slave1,此處是es容器的ip,,如不缺則容器啟動之後檢視並修改即可
  - 172.17.0.4:9301   # slave2,此處是es容器的ip,,如不缺則容器啟動之後檢視並修改即可
cluster.initial_master_nodes:
  - 172.17.0.2        # 此IP為master容器ip地址,主節點
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave1:/data/elk/conf/slave1/slave1.yml
cluster.name: yunwei_cluster 
node.name: slave1
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9201
transport.port: 9301
discovery.seed_hosts:
  - 172.17.0.2:9300    # master
  - 172.17.0.3:9302    # slave1
  - 172.17.0.4:9301    # slave2
cluster.initial_master_nodes:
  - 172.17.0.2
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
# slave2:/data/elk/conf/slave2/slave2.yml
cluster.name: yunwei_cluster 
node.name: slave2
node.master: true
node.data: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.port: 9202
transport.port: 9302
discovery.seed_hosts:
  - 172.17.0.2:9300   # master
  - 172.17.0.3:9302   # slave2
  - 172.17.0.4:9301   # slave3
cluster.initial_master_nodes:
  - 172.17.0.2
xpack.security.enabled: false
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
  • 啟動elasticsearch容器: master,slave1,slave2節點
# master
docker run -d --name=master -p 9200:9200 -p 9300:9300 -v /data/elk/config/master.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/master:/usr/share/elasticsearch/data -v /data/elk/logs/master:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave1
docker run -d --name=slave1 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave1:/usr/share/elasticsearch/data -v /data/elk/logs/slave1:/usr/share/elasticsearch/logs elasticsearch:7.3.1
# slave2
docker run -d --name=slave2 -p 9201:9201 -p 9301:9301 -v /data/elk/config/slave2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/elk/data/slave2:/usr/share/elasticsearch/data -v /data/elk/logs/slave2:/usr/share/elasticsearch/logs elasticsearch:7.3.1
  • 修改es的執行記憶體,防止出現記憶體溢位,es掛的情況
# 進入es容器:master,slave1,slave2
docker exec -it master/slave1/slave2 /bin/bash
# 修改es啟動記憶體
/usr/share/elasticsearch/config/jvm.options
# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space
-Xms3g   # 根據實際記憶體分配
-Xmx3g
# 重啟master,slave1,slave2容器
  • 瀏覽器訪問測試:http://ip:{9200,9201,9202}
  • cerebro容器的建立及啟動
docker run -d -p 9001:9000 --name=cerebro lmenezes/cerebro
docker run -d -p 5601:5601 --name=kibana -e  "I18N_LOCALE=zh-CN" -e "ELASTICSEARCH_URL=http://物理機的IP地址或域名:9200" kibana:7.3.1
  • 修改kibana配置檔案,新增elasticsearch地址
# 登入kibana容器,修改配置檔案
docker exec -it kibana /bin/bash
/usr/share/kibana/config/kibana.yml
# 新增elasticsearch
elasticsearch.hosts: [ "http://宿主機IP:9200" ]
# 重啟kibana容器
docker restart kibana
  • 檢視已建立啟動的容器:docker ps

filebeat 收集彙總日誌

  • 日誌在單個檔案:根據不同的服務編寫不同的yml檔案並在主配置檔案中匯入子yml載入執行採集即可;

  • 日誌在多個檔案:直接可以在主配置yml檔案中編寫採集動作即可;

  • filebeat 原始碼包下載:

# 下載filebeat原始碼包 -- elk官網下載即可   filebeat-7.9.3-linux-x86_64.tar.gz
日誌收集端服務節點:/srv/filebeat-7.9.3-linux-x86_64.tar.gz
# 解壓
tar -zxf filebeat-7.9.3-linux-x86_64.tar.gz
cd filebeat-7.9.3
  • 示例一:日誌在單個檔案(採集詳細級別的日誌: debug,info,warn,error)
目錄結構:
filebeat-7.9.3
   - modules   # 子yml檔案、具體某個服務日誌
     - asset-service.yml
     - user-service.yml
   - filebeat-new.yml  # 主yml檔案
  • 主yml配置檔案:filebeat-new.yml
filebeat.config.inputs:
  path:
    modules/*.yml    # 匯入子服務配置檔案
  reload.enabled: true  # 啟動載入
  reload.period: 10s    # 每10秒檢查一次

# 自定義索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true

# 刪除索引中不需要的欄位
processors:
- drop_fields:
    fields: ["input","agent"]
    
# 收集日誌輸出到elasticsearch
output.elasticsearch:
  hosts: ["IP地址:9200"]
  index: "test-%{+yyy.MM.dd}"
  • 子服務yml配置檔案:asset-service.yml
# DEBUG 日誌過濾輸出
- type: log
  enabled: true
  paths:
    - /home/opsprod/deploy/debug-logs/asset-service/debug-log
  # 過濾debug日誌
  include_lines: ['DEBUG']
  # 專案環境
  tags: ["tangpiao","pro"]
  # 定義欄位
  fields:
    level: DEBUG
    module: asset
  # 如果設定為true,則在es中新增的欄位格式為:"level":"debug","module":"asset"
  fields_under_root: true
  # 處理一行日誌佔據多行的情況
  # 多行日誌開始的那一行的pattern
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after
  
# ERROR 日誌過濾輸出
- type: log
  enabled: true
  paths:
    - /home/opsprod/deploy/debug-logs/asset-service/debug-log
  include_lines: ['ERROR']
  tags: ["tangpiao","pro"]
  fields:
    level: ERROR
    module: asset
  fields_under_root: true
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after

# WARN 日誌過濾輸出
- type: log
  enabled: true
  paths:
    - /home/opsprod/deploy/debug-logs/asset-service/debug-log
  include_lines: ['WARN']
  tags: ["tangpiao","pro"]
  fields:
    level: WARN
    module: asset
  fields_under_root: true
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after

# INFO 日誌過濾輸出
- type: log
  enabled: true
  paths:
    - /home/opsprod/deploy/debug-logs/asset-service/debug-log
  include_lines: ['INFO']
  tags: ["tangpiao","pro"]
  fields:
    level: INFO
    module: asset
  fields_under_root: true
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after
  • 示例二:日誌在多個檔案(採集詳細級別的日誌: debug,info,warn,error)
  • 主配置檔案:filebeat-new.yml
# 建立新的filebeat收集模板配置檔案,不在原有的filebeat.yml修改:  vim filebeat-new.yml
filebeat.inputs:
- type: log
  enabled: true
  # # 指定要監控的日誌,可以指定具體得檔案或者目錄
  paths:
    - /home/opsabc/deploy/debug/user-service/debug-log
  # 定義tags,可設定多個,以逗號分隔
  tags: ["test"]
  # 定義日誌級別,新增新的欄位
  fields:        
    level: DEBUG
    servicename: user
  # 如果設定為true,則在es中新增的欄位格式為:"level":"debug"
  fields_under_root: true
  # 處理一行日誌佔據多行的情況
  # 多行日誌開始的那一行的pattern
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after

- type: log
  enabled: true
  # # 指定要監控的日誌,可以指定具體得檔案或者目錄
  paths:
    - /home/opsabc/deploy/error/user-service/error-log
  # 定義tags,可設定多個,以逗號分隔
  tags: ["test"]
  # 定義日誌級別,新增新的欄位
  fields:        
    level: ERROR
    servicename: user
  # 如果設定為true,則在es中新增的欄位格式為:"level":"error"
  fields_under_root: true
  # 處理一行日誌佔據多行的情況
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after

- type: log
  enabled: true
  # # 指定要監控的日誌,可以指定具體得檔案或者目錄
  paths:
    - /home/opsabc/deploy/info/user-service/info-log
  # 定義tags,可設定多個,以逗號分隔
  tags: ["test"]
  # 定義日誌級別,新增新的欄位
  fields:        
    level: INFO
    servicename: user
  # 如果設定為true,則在es中新增的欄位格式為:"level":"error"
  fields_under_root: true
  # 處理一行日誌佔據多行的情況
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after

- type: log
  enabled: true
  # # 指定要監控的日誌,可以指定具體得檔案或者目錄
  paths:
    - /home/opsabc/deploy/warn/user-service/warn-log
  # 定義tags,可設定多個,以逗號分隔
  tags: ["test"]
  # 定義日誌級別,新增新的欄位
  fields:        
    level: WARN
    servicename: user
  # 如果設定為true,則在es中新增的欄位格式為:"level":"error"
  fields_under_root: true
  # 處理一行日誌佔據多行的情況
  multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.* \['
  multiline.negate:  true
  multiline.match:   after
    
# 自定義索引名
setup.ilm.enabled: false
setup.template.name: "test"
setup.template.pattern: "test-*"
setup.template.overwrite: true

# 刪除索引中不需要的欄位
processors:
- drop_fields:
    fields: ["input","agent"]

# 收集日誌輸出到elasticsearch
output.elasticsearch:
  hosts: ["IP地址:9200"]
  index: "test-%{+yyy.MM.dd}"
  • 啟動filebeat進行日誌監控收集
nohup /srv/filebeat-7.9.3/filebeat -e -c /srv/filebeat-7.9.3/filebeat-new.yml &
  • Stack Management ——> 索引管理