历时2天,搞出了ELK的环境搭建,特此记录一下避免后来人踩坑。
1.前置操作yum install -y wgetyum install -y java-11-openjdk.x86_64
2.安装elasticsearch# 切换到opt目录cd /opt# 下载elasticsearch安装包wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.0.0-linux-x86_64.tar.gz# 解压缩安装包tar -zxvf elasticsearch-8.0.0-linux-x86_64.tar.gz# 启动elasticsearch./elasticsearch-8.0.0/bin/elasticsearch
这时我还使用的root账号在操作,启动会报错,说elasticsearch不能以root权限来运行。
行吧,我们来创建一个用于elk的用户
# 创建elk组group add elk# 为elk组创建一个elk用户useradd elk -g elk# 重置用户密码passwd elk#将opt目录的权限授权给elk用户chown -R elk:elk /opt
不能用root那咱就用elk用户启动吧
# 切换成elk用户su elk# 再次启动elasticsearch./elasticsearch-8.0.0/bin/elasticsearch
嗯嗯,这次启动成功了。
3.部署logstash# 下载logstash安装包wget https://artifacts.elastic.co/downloads/logstash/logstash-8.0.0-linux-x86_64.tar.gz# 解压缩安装包tar -zxvf logstash-8.0.0-linux-x86_64.tar.gz# 改改logstash-sample.confvim logstash-8.0.0/config/logstash-sample.conf# 测试启动logstash./logstash-8.0.0/bin/logstash -f logstash-8.0.0/config/logstash-sample.conf
改过的logstash-sample.conf
input { beats { port => 5044 } tcp { mode => "server" port => 4567 codec => json_lines }}output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" #user => "elastic" #password => "changeme" }}
出现了报错:Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://localhost:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError, :message
=>"Elasticsearch Unreachable: [http://localhost:9200/][Manticore::ClientProtocolException] localhost:9200 failed to respond"}。我心想我es服务还正常呢,咋就dead ES instance了。
咱也不能听信logstah的一面之词,看看es的日志
received plaintext http traffic on an https channel, closing connection Netty4HttpChannel
再查查这是什么原因导致的,已经有朋友给出了解决方案
改完再重启。嗯,虽然依然报错,但是变成了另外一种错误。
Attempted to resurrect connection to dead ES instance, but got an error {:url=>"http://localhost:9200/", :exception=>LogStash::Outputs::ElasticSearch::HttpClient::Pool::BadResponseCodeError, :message
=>"Got response code '401' contacting Elasticsearch at URL 'http://localhost:9200/'"}
显示我401,原来8.0.0版本的elasticsearch默认是需要认证了,好吧。加上认证信息,修改完
input { beats { port => 5044 } tcp { mode => "server" port => 4567 codec => json_lines }}output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" user => "elastic" password => "mjQgmfQlMuxmGlYI5F1H" }}
ok,这次启动成功了。
或者跳过认证
4.部署kibana# 下载kibana安装包wget https://artifacts.elastic.co/downloads/kibana/kibana-8.0.0-linux-x86_64.tar.gz# 解压缩安装包tar -zxvf kibana-8.0.0-linux-x86_64.tar.gz# 修改kibana配置文件vim kibana-8.0.0/config/kibana.yml# 启动kibana./kibana-8.0.0/bin/kibana
出现了问题Kibana should not be run as root、Use --allow-root to continue。kibana默认也不以root身份启动,还好我们早先创建了elk用户。
# 切换成elk用户su elk# 再次启动kibana./kibana-8.0.0/bin/kibana
出现了错误。Error: Unable to write to UUID file at /opt/kibana-8.0.0/data/uuid、Ensure Kibana has sufficient permissions to read / write to this file、Error was: EACCES
小问题,使用root身份重新给elk用户授权一下,搞定!
又来了一个小问题
Unable to retrieve version information from Elasticsearch nodes、security_exception: [security_exception] Reason: missing authentication credentials for REST request [/_nodes?filter_path=nodes.*.version%2Cnod
es.*.http.publish_address%2Cnodes.*.ip]
因为elasticsearch开启的安全认证,导致kibana必须配置账号密码才能连接elasticsearch。
这个过程可太痛苦了,网上一群人在胡说,提议关闭安全认证,堪称天才。
那我就想使用elastic用户的账号和密码,发现行不通。系统不让用,那就翻翻官网吧。能咋办呢
终于功夫不负有心人,在官网找到了关于elasticsearch的内置角色的解释,为我们通向成功提供了一把钥匙。
提到了一个内置用户kibana_system用于kibana连接elasticsearch使用。此时,我知道我们离真相不远了。
但是我们还不知道kibana_system的密码,不过没关系,没有密码咱就重置密码
# 重置kibana_system密码bin/elasticsearch-reset-password --username kibana_system
再度配置kibana.yml,成了!
最终的kibana.yml
server.port: 5601server.host: "0.0.0.0"elasticsearch.hosts: ["http://localhost:9200"]elasticsearch.username: "kibana_system"elasticsearch.password: "ebblH2rFclzqlNdwC5Ou"