2. 环境搭建:Elasticsearch、Logstash、Kibana 安装部署(单机版与 Docker 方式)

这一章咱们直接动手。环境搭不起来,后面的巡检都是空谈。
我个人习惯先搞清楚两种部署方式各自的适用场景,再选一种上手。你想想看——单机版适合学习、调试;Docker 方式更贴近生产,也方便快速重置。

2.1 单机版安装:一步一步来

先装 Elasticsearch。我建议你用一个干净的 Linux 虚拟机,CentOS 7 或 Ubuntu 20.04 都行。
下面是用 tar 包安装的步骤:

# 下载 Elasticsearch 7.17.x(注意版本统一)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.9-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.17.9-linux-x86_64.tar.gz
cd elasticsearch-7.17.9

# 不能用 root 启动,创建普通用户
useradd -m esuser
chown -R esuser:esuser /path/to/elasticsearch-7.17.9
su - esuser
./bin/elasticsearch

启动后如果报错 "max virtual memory areas vm.max_map_count [65530] is too low",执行:sudo sysctl -w vm.max_map_count=262144。我每次装新机器都会先配好这个内核参数,省的后面折腾。

接着安装 Kibana。解压后改配置文件:

# 修改 config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"          # 允许远程访问
elasticsearch.hosts: ["http://localhost:9200"]

最后是 Logstash。我之前只装过 Filebeat 但后来发现 Logstash 的 Filter 插件是真香,尤其是 dissect 和 grok 解析日志。

tar -xzf logstash-7.17.9-linux-x86_64.tar.gz
cd logstash-7.17.9

# 测试一个简单的 pipeline
./bin/logstash -e 'input { stdin {} } output { stdout { codec => rubydebug } }'
# 输入 hello,看看是否输出结构化 JSON

三个服务都起来后,访问 http://localhost:5601 就能看到 Kibana 界面了。嗯,到这单机版就跑通了。

2.2 Docker 方式:一条命令拉起全家桶

Docker 方式最大的好处是隔离和快速重建。我记得有个项目需要频繁切换 ELK 版本做测试,用 Docker Compose 简直救命。

创建一个 docker-compose.yml 文件:

version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.9
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - "9200:9200"
      - "9300:9300"

  logstash:
    image: docker.elastic.co/logstash/logstash:7.17.9
    volumes:
      - ./pipeline:/usr/share/logstash/pipeline
    ports:
      - "5044:5044"
      - "9600:9600"
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.9
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch

然后执行:

docker-compose up -d

等几十秒,三个容器就全起来了。Logstash 的 Pipeline 配置文件需要你自己放在当前目录的 pipeline 文件夹里,比如:

# pipeline/logstash.conf
input { beats { port => 5044 } }
filter { 
  grok { match => { "message" => "%{COMBINEDAPACHELOG}" } }
}
output { elasticsearch { hosts => ["elasticsearch:9200"] } }

注意:Docker 方式中 Logstash 连接 Elasticsearch 用的是容器名 elasticsearch,不是 localhost。这个坑我踩过一次,排查了半天才发现是 hosts 写错了。

2.3 两种方式对比,你选哪个?

对比维度单机版(tar包)Docker Compose
安装复杂度需依次下载、解压、改配置一个 yml 文件 + 一条命令
环境隔离共用宿主机端口、依赖完全隔离,互不干扰
版本切换手动删除、重新解压改 docker-compose 中的 tag 即可
磁盘占用每个版本解压约 1GB镜像层缓存,换版本只拉差分层
调试方便度直接看日志文件docker logs -f <容器名>
资源占用可以精细调 JVM 参数需通过环境变量控制,稍麻烦

我个人倾向:学习阶段用 Docker,避免污染主机环境;深入调优时切到单机版,方便改配置文件、看内核参数。

2.4 验证环境是否正常

不管用哪种方式,验证步骤一样:

  1. Elasticsearch:curl http://localhost:9200,看到 cluster_name 和 version 字段就对了。
  2. Logstash:检查 http://localhost:9600 是否有 node stats 返回。
  3. Kibana:浏览器访问 http://localhost:5601,能加载出登陆页就行。

我曾经接手过一套 ELK 集群,Logstash 明明启动成功但数据就是写不进去,后来发现 elasticsearch 的 output 中 user/password 忘记加了。所以验证的时候一定要造一条测试日志,看它能不能在 Kibana 中被检索到。

2.5 避坑指南:我踩过的三个坑

  • 内存不足:Elasticsearch 默认 JVM 堆 1GB,如果你机器只有 2GB 内存,建议调成 512MB(环境变量 ES_JAVA_OPTS="-Xms512m -Xmx512m")。
  • 权限问题:单机版千万别用 root 运行 ES,会报错拒绝启动。创建专用用户,把目录权限给对。
  • 版本一致性:ELK 三个组件的次要版本号必须一致(比如都是 7.17.9),否则可能出现兼容问题。我遇到过 Kibana 连不上 ES 就是因为版本差了一个小补丁。
ELK 单机版 vs Docker 方式部署流程 单机版(tar包) ① 下载 ES / Kibana / Logstash tar ② 解压、创建非 root 用户、赋权 ③ 依次启动 ES → Kibana → Logstash ④ 访问 5601、写入测试日志 Docker Compose ① 安装 Docker + docker-compose ② 编写 docker-compose.yml ③ docker-compose up -d ④ 检查容器日志,访问 Kibana 两种方式最终都能在 http://localhost:5601 看到 Kibana 界面