Elasticsearch along with Logstash and Kibana is a great combination for aggregating and enriching log files, splitting them into different fields and visualizing them. For this setup, I will set up a 3 Node Cluster with every node operating every role.
The recommended Setup would be separating master-eligible nodes and data nodes, as well as ingest nodes (depending on your workload).
Quick Note on the software components:
Elasticsearch:
Elasticsearch is a distributed search backend using the lucene engine for searching its shards and saved data. The Data indexed into this will be in the json-format.
Logstash:
Logstash takes your data, passes it through the grok filters you wrote, enriches them if you've configured to do so and indexes them into elasticsearch.
Kibana:
With Kibana you can control and manage your cluster as well as configure pipelines. Kibana will also give you a fancy frontend to search your data and build graphs.
Since I'm only going to go 3 Nodes, and my workload is rather small, I'll go with a "every node does everything" setup.
Each Node has the following specs:
4vCPUs
4GB RAM
80GB HDD
CentOS 7.6 with latest updates.
Elasticsearch 6.6.2
Logstash 6.6.2
Kibana 6.6.2
Elasticsearch 6.6.2
Logstash 6.6.2
Kibana 6.6.2
I'll skip the repository setup since I'm using foreman in my lab and imported the GPG Keys there, synced the repos and promoted the content view. Most of this can be automated, but I will still walk through the manual steps to get the cluster up and running.
Now for the Setup:
This has to be done on every node:
[archy@elk01 ~]$ sudo yum -y install openjdk-1.8.0 elasticsearch logstash kibana
[archy@elk02 ~]$ sudo yum -y install openjdk-1.8.0 elasticsearch logstash kibana
[archy@elk03 ~]$ sudo yum -y install openjdk-1.8.0 elasticsearch logstash kibana
First up, configure elasticsearch:
[archy@elk01 ~]$ sudo vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-homelab # your cluster name
node.name: elk01.archyslife.lan # your node name
node.master: true # node is master-eligible
node.data: true # node is a data node
node.attr.rack: r1 # attributes, come in handy when distributing it over mutlitple data centers / racks
path.data: /var/lib/elasticsearch # where your shards will be stored
path.logs: /var/log/elasticsearch # where your logs will be stored
network.host: _eth0:ipv4_ # this is a yaml-variable used to setting it to the ipv4 address of the interface eth0
http.port: 9200 # elasticsearch http-api listening port
transport.tcp.port: 9300 # inter-cluster communication port
discovery.zen.ping.unicast.hosts: ["elk01.archyslife.lan", "elk02.archyslife.lan", "elk03.archyslife.lan" ] # your nodes that will form the cluster
discovery.zen.minimum_master_nodes: 2 # sum of cluster nodes / 2 + 1
gateway.recover_after_nodes: 2 # sum of cluster nodes / 2 + 1
[archy@elk02 ~]$ sudo vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-homelab # your cluster name
node.name: elk02.archyslife.lan # your node name
node.master: true # node is master-eligible
node.data: true # node is a data node
node.attr.rack: r1 # attributes, come in handy when distributing it over mutlitple data centers / racks
path.data: /var/lib/elasticsearch # where your shards will be stored
path.logs: /var/log/elasticsearch # where your logs will be stored
network.host: _eth0:ipv4_ # this is a yaml-variable used to setting it to the ipv4 address of the interface eth0
http.port: 9200 # elasticsearch http-api listening port
transport.tcp.port: 9300 # inter-cluster communication port
discovery.zen.ping.unicast.hosts: ["elk01.archyslife.lan", "elk02.archyslife.lan", "elk03.archyslife.lan" ] # your nodes that will form the cluster
discovery.zen.minimum_master_nodes: 2 # sum of cluster nodes / 2 + 1
gateway.recover_after_nodes: 2 # sum of cluster nodes / 2 + 1
[archy@elk03 ~]$ sudo vim /etc/elasticsearch/elasticsearch.yml
cluster.name: elk-homelab # your cluster name
node.name: elk03.archyslife.lan # your node name
node.master: true # node is master-eligible
node.data: true # node is a data node
node.attr.rack: r1 # attributes, come in handy when distributing it over mutlitple data centers / racks
path.data: /var/lib/elasticsearch # where your shards will be stored
path.logs: /var/log/elasticsearch # where your logs will be stored
network.host: _eth0:ipv4_ # this is a yaml-variable used to setting it to the ipv4 address of the interface eth0
http.port: 9200 # elasticsearch http-api listening port
transport.tcp.port: 9300 # inter-cluster communication port
discovery.zen.ping.unicast.hosts: ["elk01.archyslife.lan", "elk02.archyslife.lan", "elk03.archyslife.lan" ] # your nodes that will form the cluster
discovery.zen.minimum_master_nodes: 2 # sum of cluster nodes / 2 + 1
gateway.recover_after_nodes: 2 # sum of cluster nodes / 2 + 1
Start up and enable elasticsearch:
[archy@elk01 ~]$ sudo systemctl enable elasticsearch.service
[archy@elk01 ~]$ sudo systemctl start elasticsearch.service
[archy@elk02 ~]$ sudo systemctl enable elasticsearch.service
[archy@elk02 ~]$ sudo systemctl start elasticsearch.service
[archy@elk03 ~]$ sudo systemctl enable elasticsearch.service
[archy@elk03 ~]$ sudo systemctl start elasticsearch.service
If everything is started as expected, you should now be having the elasticsearch cluster itself. Check by using curl against the elasticsearch-api:
[archy@elk01 ~]$ curl -XGET 'https://elk03.archyslife.lan:9200/_cat/nodes?v'
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
172.31.0.12 31 95 1 0.01 0.12 0.14 mdi - elk01.archyslife.lan
172.31.0.13 47 95 2 0.05 0.12 0.16 mdi * elk02.archyslife.lan
172.31.0.14 30 95 3 0.10 0.11 0.16 mdi - elk03.archyslife.lan
Next step, logstash.
[archy@elk01 ~]$ sudo vim /etc/logstash/logstash.yml
path.data: /var/lib/logstash
config.reload.automatic: true
path.logs: /var/log/logstash
[archy@elk02 ~]$ sudo vim /etc/logstash/logstash.yml
path.data: /var/lib/logstash
config.reload.automatic: true
path.logs: /var/log/logstash
[archy@elk03 ~]$ sudo vim /etc/logstash/logstash.yml
path.data: /var/lib/logstash
config.reload.automatic: true
path.logs: /var/log/logstash
Start up and enable logstash:
[archy@elk01 ~]$ sudo systemctl enable logstash.service
[archy@elk01 ~]$ sudo systemctl start logstash.service
[archy@elk02 ~]$ sudo systemctl enable logstash.service
[archy@elk02 ~]$ sudo systemctl start logstash.service
[archy@elk03 ~]$ sudo systemctl enable logstash.service
[archy@elk03 ~]$ sudo systemctl start logstash.service
Last step, kibana:
[archy@elk01 ~]$ sudo vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elk01.archyslife.lan:9200"]
[archy@elk02 ~]$ sudo vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elk02.archyslife.lan:9200"]
[archy@elk03 ~]$ sudo vim /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://elk03.archyslife.lan:9200"]
Start up and enable kibana:
[archy@elk01 ~]$ sudo systemctl enable kibana.service
[archy@elk01 ~]$ sudo systemctl start kibana.service
[archy@elk02 ~]$ sudo systemctl enable kibana.service
[archy@elk02 ~]$ sudo systemctl start kibana.service
[archy@elk03 ~]$ sudo systemctl enable kibana.service
[archy@elk03 ~]$ sudo systemctl start kibana.service
You can now log in to your cluster on any node with port 5601 using your browser.
If you have a license, you can also enable xpack with central monitoring and orchestration of the pipelines in logstash, as well as https and users. This makes the setup much more secure since in the current state, everyone that can access the interface, can access the complete cluster.
The simplest fix would be using nginx as a reverse proxy and make nginx do the authentication. However, this is not part of this tutorial.
Feel free to comment and / or suggest a topic.
Comments
Post a Comment