iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 11
3
自我挑戰組

DevOps學習之旅系列 第 11

Day 11 ELK 收集系統Log

簡介

上一篇完成基礎的CI/CD過程,但是缺少了一個重要的東西,就是Log分析,要知道系統發生了什麼事情,最好的方式就是查看Log!

螢幕快照 2018-08-28 下午6.42.52.png

  • Elasticsearch:分散的索引搜尋系統,可用於全文檢索,並提供 REST API 串接,ES 也是 NoSQL 資料庫的一種,所有的資料都是以 JSON 的方式進行存取。與 MongoDB 一樣都是 Document DB,但最大的不同是所有欄位都可以建立索引進行全文搜尋。
  • Kibana:可透過網頁介面來呈現資料、製作圖表,或是透過開發工具更簡易的對 elasticsearch 執行資料操作。
  • Logstash:提供了各式各樣的日誌收集及輸出的 Plugin,可用於串接資料庫或是日誌檔案,並將資料收集處理後,輸出至 Elasticsearch。
  • Filebeatst:是一種輕量級的日誌蒐集器,其不佔用系統資源,自出現之後,迅速更新了原有的架構.Filebeats將收集到的數據發送給Logstash解析過濾,在Filebeats與Logstash傳輸數據的過程中,為了安全性,可以通過SSL認證來加強安全性。之後將其發送到Elasticsearch存儲,並由kibana可視化分析。

20171110215321791.png

安裝 ElasticSearch

Elastic 官方網站

安裝 java

yum install java

下載 elasticsearch 網頁

手動安裝

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.rpm
rpm -ivh elasticsearch-6.4.0.rpm
systemctl start elasticsearch
systemctl enable elasticsearch

YUM安裝

安裝 yum key

rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch

創建 yum repo 檔案
vim /etc/yum.repos.d/elasticsearch.repo

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=http://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

YUM 安裝

yum -y install elasticsearch

修正 僅本地端可以連
vi /etc/elasticsearch/elasticsearch.yml

network.host: localhost

啟動服務

systemctl start elasticsearch
systemctl enable elasticsearch

設定 Elasticsearch 記憶體使用上限及下限

修改 elasticsearch 使用的記憶體,設定為主機的 50% 記憶體
如果 主機 600M記憶體 elasticsearch 設定為 300m

vi /etc/elasticsearch/jvm.options
-Xms300m  # Xms 記憶體使用下限
-Xmx300m  # Xmx 記憶體使用上限

設定 Elasticsearch 綁定的 IP 及 Port。

vi /etc/elasticsearch/elasticsearch.yml
network.bind_host: 0.0.0.0  # 綁定 IP
http.port: 9200 # 綁定 Port,預設 9200

測試

curl "http://127.0.0.1:9200/_cat/nodes"
127.0.0.1 6 96 13 0.35 0.31 0.14 mdi * iyDpTNc  <=有回應代表正常

安裝 Kibana

YUM安裝

創建 yum repo 檔案
vi /etc/yum.repos.d/kibana.repo

[kibana-4.4]
name=Kibana repository for 4.4.x packages
baseurl=http://packages.elastic.co/kibana/4.4/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

YUM 安裝

yum -y install kibana

修正 僅本地端可以連
vi /opt/kibana/config/kibana.yml

server.host: "localhost" 

啟動服務

systemctl start kibana
systemctl enable kibana

安裝nginx

yum -y install nginx httpd-tools

設定訪問 Kibana 密碼

htpasswd -c /etc/nginx/htpasswd.users kibanaadmin

設定nginx
vi /etc/nginx/nginx.conf

server {
    listen 80;
    server_name _;
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/htpasswd.users;
    location / {
        proxy_pass http://localhost:5601; 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;        
    }
}

啟動nginx

systemctl start nginx
systemctl enable nginx

關閉 selinux OR 執行下面

setsebool -P httpd_can_network_connect 1

測試

URL http://localhost
螢幕快照 2018-08-28 上午11.07.23.png

安裝 LogStach

下載 logstash 網頁

yum install java
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.0.rpm
rpm -ivh logstash-6.4.0.rpm
/usr/share/logstash/bin/system-install
systemctl start logstash
systemctl status logstash

Yum 安裝

vi /etc/yum.repos.d/logstash.repo

[logstash-2.2]
name=logstash repository for 2.2 packages
baseurl=http://packages.elasticsearch.org/logstash/2.2/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

Yum 安裝

yum -y install logstash

使用 IP 生成證書
vi /etc/pki/tls/openssl.cnf

subjectAltName = IP: ELK_server_private_ip   ##在[ v3_ca ]部分找到

創建 證書

cd /etc/pki/tls
openssl req -subj '/CN=ELK_server_dns/' -x509 -days 3650 -batch -nodes -newkey rsa:2048 -keyout private/logstash-forwarder.key -out certs/logstash-forwarder.crt

配置 Logstash
vi /etc/logstash/conf.d/02-beats-input.conf

input {
  beats {
    port => 5044
    ssl => true
    ssl_certificate => "/etc/pki/tls/certs/logstash-forwarder.crt"
    ssl_key => "/etc/pki/tls/private/logstash-forwarder.key"
  }
}

配置日誌過濾文件以及格式化處理
grok 过滤与定义日志格式,能从github上下载很多样本用来参考。
vi /etc/logstash/conf.d/10-syslog-filter.conf

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    syslog_pri { }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

配置輸出日誌到elasticsearch
vi /etc/logstash/conf.d/30-elasticsearch-output.conf

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    sniffing => true
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

確認logstash 配置文建是否正確

service logstash configtest

啟動服務

systemctl restart logstash
systemctl enable logstash

加載 Kibana 儀表板

下載

cd ~
curl -L -O https://download.elastic.co/beats/dashboards/beats-dashboards-1.1.0.zip
yum install -y unzip
unzip beats-dashboards-1.1.0.zip
cd beats-dashboards-*
./load.sh
  • [packetbeat] 搜集网络数据
  • [topbeat] 搜集系统cpu,ram负载相关信息
  • filebeats 搜集系统日志信息
  • winlogbeat 搜集windows系统日志信息

在 Elasticsearch 上加載 Filebeat 默認模板

下載

cd ~
curl -O    https://gist.githubusercontent.com/thisismitch/3429023e8438cc25b86c/raw/d8c479e2a1adcea8b1fe86570e42abab0f10f364/filebeat-index-template.json  

Elasticsearch 載入 JSON

curl -XPUT 'http://localhost:9200/_template/filebeat?pretty' -d@filebeat-index-template.json 
{
  "acknowledged" : true  #檢查是否載入成功
}

客戶段 安裝 filebeat

複製 ELK server 的 logstash-forwarder.crt 到 ELK Client主機

  • elk.server.tw ELK Server
  • elk.client.tw ELK Client
scp elk.server.tw:~/logstash-forwarder.crt .
scp logstash-forwarder.crt elk.client.tw:~/

ELK Client 設定

sudo mkdir -p /etc/pki/tls/certs
sudo cp ~/logstash-forwarder.crt /etc/pki/tls/certs/

安裝 Filebeat,

切換到 root 帳號
導入 gpg-key

rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch 

創建 beats repo
vi /etc/yum.repos.d/elastic-beats.repo

[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

安裝

yum -y install filebeat

修改配置文件
vi /etc/filebeat/filebeat.yml

...
      paths:
        - /var/log/secure
        - /var/log/messages
#        - /var/log/*.log
      document_type: syslog   #删除原有的注释
...
...
      document_type: syslog   #删除原有的注释
...

将elasticsearch这一段全部删除或者是注释掉

### Logstash as output
  logstash:
    # The Logstash hosts
    hosts: ["ELK_server_private_IP:5044"] #定义Filebeat与ELK_server连接方式
Filebeat与Logstash安全通信配置
tls:
      # List of root certificates for HTTPS server verifications
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

啟動服務

systemctl start filebeat
systemctl enable filebeat

启动过后查看Filebeat的状态。如果没有启动可以参照如下检测配置文件。

filebeat:
  prospectors:
    -
      paths:
        - /var/log/secure
        - /var/log/messages
      #  - /var/log/*.log

      input_type: log

      document_type: syslog

  registry_file: /var/lib/filebeat/registry

output:
  logstash:
    hosts: ["elk_server_private_ip:5044"]
    bulk_max_size: 1024

    tls:
      certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]

shipper:

logging:
  files:
    rotateeverybytes: 10485760 # = 10MB

檢查 filebeat.yml 格式

filebeat -configtest filebeat.yml

檢查

如果看到total与successful不为0。代表成功从client端取到日志。

curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
{
  "took" : 4,
  "timed_out" : false,
  "_shards" : {
    "total" : 15,
    "successful" : 15,
    "failed" : 0
  },

注:如果看到total与hits为0,代表通信受阻,无法从客户端取到日志。可以参照以下两个方式解决:
(1)查看Filebeat客户端配置是否正确,Filebeat是否成功启动。
(2)查看ELK_SERVER的安全组,确认5044端口是打开的。

範例一

架設 ELK Server 安裝 Elasticsearch、Kibana、Logstash 要求記憶體最少:2G
在 Client 主機 安裝 Filebeat
使用 Grok Online Debug 解析服務 Log 資料
在 Client 主機 設定 filebeat.yml

 filebeat:
  prospectors:
    -
      paths:
        - /home/ithome_pellok_2018/ithome_pellok_2018/log/*.log
      input_type: log
      fields:
        service: ithome_pellok_2018
      document_type: syslog

  registry_file: /var/lib/filebeat/registry

output:
  logstash:
    hosts: ["logstash.domain.com:5044"]
    bulk_max_size: 1024

shipper:

logging:
  files:
    path: /var/log/filebeat
    rotateeverybytes: 10485760 # = 10MB

在 logstach 設定 pipeline.yml

 input {
  beats {
    port => 5044
  }
}
filter {
  if [field.service] == "ithome_pellok_2018" {
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:logTimestamp} %{DATA:logType} \[%{DATA:path}\]\[%{DATA:aa}\] %{GREEDYDATA:message}" }
    }
    mutate {
      add_tag => ["joyi_service"]
    }
  }
}
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    index => "%{[@metadata][beat]}-%{+xxxx.ww}"
    document_type => "%{[@metadata][type]}"
  }
} 

結論

在部署了時候採用 supervisor 會有多個服務同時啟動做負載平衡 ,所以會有多個 log 檔案,要查看 log 的時候需要開啟多個畫面同時查看 log 檔案,感覺非常的不方便,有的 elk 之後查看 log 就變得很簡單,以容易使用,但是這邊也會讓我思考 Log 要怎麼寫,會比較好,而且容易分析,因為 ELK 是使用 JSON 格式,所以要好好的規劃Log 要記錄哪一些東西,另外一點是 kibana 報表,這一點到目前也還在研究要怎麼呈現.

參考


上一篇
Day 10 Jenkins CI/CD 伺服器(二)
下一篇
Day 12 專案 Docker 化
系列文
DevOps學習之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言