Docker部署ELK遇Kibana未就绪及Logstash 401错误求助
ELK Stack Docker部署401认证错误排查与解决
问题根源
Elasticsearch 8.x版本默认强制开启安全认证功能,你的配置完全未处理账号密码验证,导致Logstash、Kibana无法通过ES的身份校验,出现401错误,同时Kibana因无法连接ES持续处于未就绪状态。
解决步骤
1. 获取Elasticsearch初始认证信息
首次启动ES容器时,日志会生成默认elastic超级用户密码和Kibana注册令牌,执行命令查看:
docker logs elasticsearch
在日志中找到:
- 初始elastic密码:
The generated password for the elastic built-in superuser is: [你的密码] - Kibana注册令牌:
bin/elasticsearch-create-enrollment-token -s kibana对应的输出内容
如果日志中找不到,可进入ES容器重新生成:
# 重置elastic用户密码 docker exec -it elasticsearch bin/elasticsearch-reset-password -u elastic # 生成Kibana注册令牌 docker exec -it elasticsearch bin/elasticsearch-create-enrollment-token -s kibana
2. 修改docker-compose.yml配置
添加认证环境变量,同时关闭本地测试用不到的严格TLS验证:
version: '3.6' services: Elasticsearch: image: elasticsearch:8.6.2 container_name: elasticsearch restart: always volumes: - elastic_data:/usr/share/elasticsearch/data/ environment: ES_JAVA_OPTS: "-Xmx256m -Xms256m" discovery.type: single-node # 开启安全认证,关闭HTTP SSL(本地测试专用,生产环境请勿关闭) xpack.security.enabled: "true" xpack.security.http.ssl.enabled: "false" ports: - '9200:9200' - '9300:9300' networks: - elk Logstash: image: logstash:8.6.2 container_name: logstash restart: always volumes: - ./logstash/:/logstash_dir # 挂载本地日志目录到容器,解决输入文件找不到的问题 - ./temp/:/root/temp/ command: logstash -f /logstash_dir/logstash.conf depends_on: - Elasticsearch ports: - '9600:9600' environment: LS_JAVA_OPTS: "-Xmx256m -Xms256m" # ES认证账号密码 ELASTICSEARCH_USER: "elastic" ELASTICSEARCH_PASSWORD: "[替换为你的elastic密码]" networks: - elk Kibana: image: kibana:8.6.2 container_name: kibana restart: always ports: - '5601:5601' environment: - ELASTICSEARCH_URL=http://elasticsearch:9200 - ELASTICSEARCH_USERNAME=elastic - ELASTICSEARCH_PASSWORD="[替换为你的elastic密码]" depends_on: - Elasticsearch networks: - elk volumes: elastic_data: {} networks: elk:
3. 更新Logstash配置文件
在logstash.conf中添加ES认证参数,同时确保输入文件路径可访问:
input { file { # 对应挂载到容器的日志路径,本地需将anteater.log放到./temp/目录下 path => "/root/temp/anteater.log" start_position => "beginning" } } output { elasticsearch { hosts => ["http://elasticsearch:9200"] # 引用环境变量中的认证信息 user => "${ELASTICSEARCH_USER}" password => "${ELASTICSEARCH_PASSWORD}" index => "anteater-log-%{+YYYY.MM.dd}" } }
4. 重启服务验证
# 清理旧容器和数据卷 docker compose down -v # 启动服务 docker compose up -d
查看容器日志确认状态:
docker logs elasticsearch docker logs logstash docker logs kibana
补充说明
- 本地无法访问
http://elasticsearch:9200是正常现象:elasticsearch是Docker内部网络的服务名,仅容器间可解析,宿主机需用http://localhost:9200访问。 - 生产环境需保留ES的HTTP SSL配置,同时生成并配置合法证书。
内容的提问来源于stack exchange,提问作者L O C O
相关产品推荐
相关产品推荐

