關鍵詞: docker docker-compose elasticsearch logstash kibana elk
請大家移步最新版本:http://m.itdecent.cn/p/2787b4c98687
ELK Stack
ELK (Elasticsearch + Logstash + Kibana),是一個開源的日志收集平臺,用于收集各種客戶端日志文件在同一個平臺上面做數(shù)據(jù)分析。
Introduction
Elasticsearch, 基于json分析搜索引擎
Logstash, 動態(tài)數(shù)據(jù)收集管道
Kibana, 可視化視圖將elasticsearh所收集的data通過視圖展現(xiàn)

Background
起初我們搭建ELK platform都是通過rpm包或者repo的形式直接setup在服務器機器上面,這給運維后期帶來的一個問題就是,每起一個新的ELK platform都需要重新setup在新的機器上面,而從運維的角度去減少這樣的重復性effort變得異常突出,下面是根據(jù)我自身的經(jīng)驗來介紹如何通過docker solution去快速啟動一個新的ELK platform,而無需重新setup。
Prerequisite
OS : Centos 7.x
Docker engine > 1.12.x
Docker-compose > 1.11.x
- Clone GIT folder到本地,branch:
master
建議放在user HOME下面,eg:/home/user1/
$ cd ~
$ git clone https://github.com/easonlau02/elasticstack.git
- 根據(jù)你的需求選擇配置環(huán)境變量
a. Elasticsearch + Logstash + Kibana 運行在同一個機器下面,相關配置文件 :~/elasticstack/.env
# ~/elasticstack/.env
# environment propertiese, for distinguishing
environment=prod
# elascticsearch-image, change data path in host machine, default as /use/data/
E_LOCAL_DATA_PATH=/usr/data/
# logstash-image
## If docker-compose file set network_mode as host, can access elasticsearch via localhost. For 3 components are in one machine, need to set as localhost
L_ELASTICSEARCH_HOST_ENV=localhost
# kibana-image
## If docker-compose file set network_mode as host, can access elasticsearch via localhost ip. For 3 components are in one machine, need to set as localhost ip : 127.0.0.1 or 0.0.0.0
K_ELASTICSEARCH_HOST_IP=127.0.0.1
b. Elasticsearch + Logstash + Kibana 分別分開運行在不同的機器下面,各自相關的配置文件如下:
-
Elasticsearch:
~/elasticstack/elasticsearch/.env
# ~/elasticstack/elasticsearch/.env
# environment propertiese, for distinguishing
environment=prod
# elascticsearch-image, change data path in host machine, default as /use/data/
E_LOCAL_DATA_PATH=/usr/data/
-
Logstash:
~/elasticstack/logstash/.env
# ~/elasticstack/logstash/.env
# environment propertiese, for distinguishing
environment=prod
# logstash-image
## Specify elasticsearch host, if the same machine, set it as localhost,
## if not, set specific host name.
## To make sure no firewall to access elasticsearch:9200
L_ELASTICSEARCH_HOST_ENV=localhost
-
Kibana:
~/elasticstack/kibana/.env
# ~/elasticstack/kibana/.env
# environment propertise, for distinguishing
environment=prod
# for kibana-image
## Specify elasticsearch host, if the same machine, set it as 127.0.0.0 or 0.0.0.0, if not, set specific host IP. To make sure no firewall to access elasticsearchIP:9200
K_ELASTICSEARCH_HOST_IP=127.0.0.1
上述配置文件包含的配置屬性均屬于基本配置屬性,為了可以更方便的修改配置文件,結(jié)合docker-compose自動搜索并加載.env的特性,將ELK所需要的基本配置抽離出來作為單個.env文件來修改配置,而不需要通過逐個配置文件進行修改,下面對上述基本屬性簡單描述:
* environment: 用來區(qū)分ELK platform的當前環(huán)境,通常有qa/prod,你也可以根據(jù)自己的情況指定為自己想要的value
* E_LOCAL_DATA_PATH: 設置elasticsearch data存儲在宿主機的相對路勁或者絕對路徑,默認為/usr/data/
* L_ELASTICSEARCH_HOST_ENV: 由于docker-compose里邊設置了network_mode等于host,使得方便同一臺機器上面方便logstash和elasticsearch通信,所以如果logstash和elasticsearch跑在同一臺機器上面(a),可以直接使用localhost來指定連接elasticsearch host;如果logstash和elasticsearch在不同機器上(b),則需要指定對應elasticsearch所在機器的hostname
* K_ELASTICSEARCH_HOST_IP: 和L_ELASTICSEARCH_HOST_ENV一樣由于network_mode等于host,如果kibana和elasticsearch在同一臺機器上,只需要指定0.0.0.0 or 127.0.0.1(經(jīng)過多次試驗,由于kibana自身加載yaml配置文件的方式貌似無法通過$獲取環(huán)境變量,而是單純獲取對應properties的string,所以這里通過extra_link的方式在kibana的container里邊添加了一個DNS record,所以需要使用IP而不是hostname);相應的如果處于不同的機器(b),需指定elasticsearch所在機器的IP。
以上配置屬性都是啟動ELK所需要的基本配置,如果有需要更多的配置,可以手動修改相應的配置文件或者聯(lián)系微信lexmay 或 email : eason.lau02@hotmail.com
- 配置完成后,使用docker-compose啟動ELK service
關于docker-compose文件,通常不需要改動,你也可以根據(jù)自己的需求添加container的properties,你可以在docker-compose文件里看到上面配置的屬性都當成環(huán)境變量傳遞進去,eg:~/elasticstack/docker-compose.yml:version: '2' services: elasticsearch: image: eason02/elasticsearch:5.0.1 ... environment: - env=${environment} volumes: ... - ${E_LOCAL_DATA_PATH}:/usr/share/elasticsearch/data ... ... logstash: image: eason02/logstash:5.0.1 ... environment: - env=${environment} ... ... kibana: image: eason02/kibana:5.0.1 ... environment: - env=${environment} extra_hosts: - "elasticsearchHost:*${K_ELASTICSEARCH_HOST_IP}*" ...
以上所用到的image都是自己構(gòu)建然后放在hub.docker.com官網(wǎng)repository,相應Dockerfile構(gòu)建如下 :
- elasticsearh:
~/elasticstack/elasticsearch/Dockerfile - logstash:
~/elasticstack/logstash/Dockerfile - kibana:
~/elasticstack/kibana/Dockerfile
a. 運行在同一個機器,相關compose文件: ~/elasticstack/docker-compose.yml
$ cd ~/elasticstack/
$ docker-compose up -d
b. 分開運行不同機器,相關compose文件:
Elasticsearch: ~/elasticstack/elasticsearch/docker-compose.yml
Logstash: ~/elasticstack/logstash/docker-compose.yml
Kibana: ~/elasticstack/kibana/docker-compose.yml
- eg:
Elasticsearch in host1:
Logstash in host2:$ cd ~/elasticstack/elasticsearch $ docker-compose up -d
Kibana in host3:$ cd ~/elasticstack/logstash $ docker-compose up -d$ cd ~/elasticstack/kibana $ docker-compose up -d
- 通過kibana host+5601端口訪問查看啟動效果,
<kibana host>:5601
成功啟動
如果看到上述界面,說明配置啟動成功,你可以看到Unable to fetch mapping. Do you have indices match...,是因為還沒有使用beats plugin將log發(fā)送到logstash或者elasticsearch,所以不能建立index。下一篇文章將會介紹已同樣的方式一鍵setup beats plugin,用來發(fā)送log到ELK《一鍵啟動 filebeat 5.1.1 集成 logstash》
** 文章所有步驟都是經(jīng)過實踐檢驗并可行,若有問題,下方請評論。
——END——
作者 : Eason,專注各種技術、平臺、集成,不滿現(xiàn)狀,喜歡改改改
文章、技術合作
Email : eason.lau02@hotmail.com
