ElasticSearch、Kibana 8.x 安装教程
想测试一下 Elastic 的 APM 能力,需要安装一个 ElasticSearch 和 Kibana 的测试环境,顺手记录到博客里,供新手查阅。
安装目标和注意事项
- 本文记录的是 Elasticsearch 8.10.4 和 Kibana 8.10.4 在 Linux 测试机上的手工安装过程。
- Elasticsearch 使用非 root 用户启动,数据目录、日志目录和 JVM 堆大小都在本机目录下配置。
- Elasticsearch 8.x 默认启用安全能力,访问 HTTP API 时需要使用 CA 证书和用户名密码。
- 文中的密码、IP、code 都是测试环境示例,生产环境不要复用。
环境准备
- OS: Linux lab-dev 6.1.0-27-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.115-1 (2024-11-01) x86_64 GNU/Linux
- ElasticSearch: 8.10.4
安装流程总览
| 阶段 | 要做什么 | 关键文件或命令 |
|---|---|---|
| 创建用户 | 新建 elasticsearch 用户并切换过去 |
groupadd、useradd、su - elasticsearch |
| 安装 Elasticsearch | 下载并解压 8.10.4 安装包 | elasticsearch-8.10.4-linux-x86_64.tar.gz |
| 配置 Elasticsearch | 设置集群名、节点名、数据目录、日志目录、监听地址 | config/elasticsearch.yml |
| 配置 JVM | 设置堆大小 | config/jvm.options.d/es.options |
| 启动并验证 | 后台启动,重置密码,访问 _cluster/health |
bin/elasticsearch -d、elasticsearch-reset-password |
| 安装 Kibana | 下载解压,设置监听地址和语言 | config/kibana.yml |
| 首次登录 | 使用 enrollment token 完成 Kibana 初始化 | elasticsearch-create-enrollment-token --scope kibana |
ElasticSearch 安装
ElasticSearch 要运行在非 root 账号下,我这里只是想快速测试,直接创建一个 elasticsearch 账号,回头我直接使用这个账号来安装启动 ElasticSearch。
groupadd elasticsearch
useradd elasticsearch -g elasticsearch -m -s /bin/bash
通过上面命令创建 elasticsearch 用户,直接给一个 bash shell,简单粗暴。完事切换到 elasticsearch 账号,下载 ElasticSearch 安装包:
su - elasticsearch
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.4-linux-x86_64.tar.gz
tar -zxvf elasticsearch-8.10.4-linux-x86_64.tar.gz
解压之后,进入 elasticsearch-8.10.4 目录,看到下面的内容:
elasticsearch@lab-dev:~/elasticsearch-8.10.4$ ll
total 2232
drwxr-xr-x 10 elasticsearch elasticsearch 4096 Mar 17 16:22 .
drwxr-xr-x 5 elasticsearch elasticsearch 4096 Mar 18 11:06 ..
drwxr-xr-x 2 elasticsearch elasticsearch 4096 Oct 12 2023 bin
drwxr-xr-x 4 elasticsearch elasticsearch 4096 Mar 18 11:16 config
drwxr-xr-x 8 elasticsearch elasticsearch 4096 Oct 12 2023 jdk
drwxr-xr-x 5 elasticsearch elasticsearch 4096 Oct 12 2023 lib
-rw-r--r-- 1 elasticsearch elasticsearch 3860 Oct 12 2023 LICENSE.txt
drwxr-xr-x 2 elasticsearch elasticsearch 4096 Mar 19 00:00 logs
drwxr-xr-x 76 elasticsearch elasticsearch 4096 Oct 12 2023 modules
-rw-r--r-- 1 elasticsearch elasticsearch 2231504 Oct 12 2023 NOTICE.txt
drwxr-xr-x 2 elasticsearch elasticsearch 4096 Oct 12 2023 plugins
-rw-r--r-- 1 elasticsearch elasticsearch 8157 Oct 12 2023 README.asciidoc
在这个目录下创建 data 目录,用来存放 ElasticSearch 的数据:
mkdir data
然后修改 config/elasticsearch.yml 文件,设置如下配置项:
## 集群名字,随意取一个
cluster.name: ulric-es-cluster
## 节点名字,随意取一个,同时在 /etc/hosts 里配置一下 node-1 和本机 IP 对应,后面多机器操作的时候方便
node.name: node-1
## 数据目录
path.data: /home/elasticsearch/elasticsearch-8.10.4/data
## 日志目录
path.logs: /home/elasticsearch/elasticsearch-8.10.4/logs
## 我会在其他机器访问 ElasticSearch,直接把 ElasticSearch 绑定到 0.0.0.0 了
network.host: 0.0.0.0
## 指定初始 master 节点
cluster.initial_master_nodes: ["node-1"]
ElasticSearch 是 Java 写的,设置一下 JVM 堆大小。我这个虚拟机内存不大,设置为 2G。一般来讲,至少设置为 2G,如果只给 1G,稍微一运行内存就不够用。如果是生产环境,建议的内存大小设置为 50% 的物理内存,但是不要超过 32G。这是官方的建议。
在 config/jvm.options.d 下面创建一个 es.options 文件,设置 JVM 堆大小:
cat > config/jvm.options.d/es.options << EOF
-Xms2g
-Xmx2g
EOF
然后就可以启动了,直接运行 bin/elasticsearch:
bin/elasticsearch -d
其中 -d 是扔到后台运行。ElasticSearch 8.x 版本默认使用 HTTPS,并且会在 config/certs 目录下生成证书。然后我们就可以使用 curl 做测试了:
curl -s --cacert config/certs/http_ca.crt https://127.0.0.1:9200/_cluster/health | python3 -mjson.tool
{
"error": {
"root_cause": [
{
"type": "security_exception",
"reason": "missing authentication credentials for REST request [/_cluster/health]",
"header": {
"WWW-Authenticate": [
"Basic realm=\"security\" charset=\"UTF-8\"",
"Bearer realm=\"security\"",
"ApiKey"
]
}
}
],
"type": "security_exception",
"reason": "missing authentication credentials for REST request [/_cluster/health]",
"header": {
"WWW-Authenticate": [
"Basic realm=\"security\" charset=\"UTF-8\"",
"Bearer realm=\"security\"",
"ApiKey"
]
}
},
"status": 401
}
这是要求我们提供用户名和密码。我们可以使用下面的命令重置一个:
bin/elasticsearch-reset-password -u elastic
我最终生成的 elastic 的密码是:9wApgqichkT2D75oV*l7,然后就可以使用 curl 带上用户名和密码了:
curl -s --cacert config/certs/http_ca.crt -u 'elastic:9wApgqichkT2D75oV*l7' https://127.0.0.1:9200/_cluster/health | python3 -mjson.tool
{
"cluster_name": "ulric-es-cluster",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 64,
"active_shards": 64,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 30,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 68.08510638297872
}
这里的 yellow 状态出现在单节点测试环境里并不奇怪,因为示例输出里存在未分配副本分片。本文重点是验证 Elasticsearch 已启动、认证生效、API 可访问。
Kibana 安装
Kibana 我也继续放在 elasticsearch 账号下:
wget https://artifacts.elastic.co/downloads/kibana/kibana-8.10.4-linux-x86_64.tar.gz
tar -zxf kibana-8.10.4-linux-x86_64.tar.gz
然后进入 kibana-8.10.4 下面的 config 目录,修改 kibana.yml 文件:
## 回头我要在其他机器访问 Kibana,所以监听范围大一些
server.host: "0.0.0.0"
## 指定 i18n 的语言,我这里设置为中文
i18n.locale: "zh-CN"
然后进入 bin 目录启动就可以了,我是测试环境,直接使用 nohup 启动:
nohup ./kibana &> stdout.log &
如果进程正常启动,在 elasticsearch 账号下应该有两个进程,一个是 ElasticSearch,一个是 Kibana,使用 ps 检查一下:
ps -u elasticsearch x
应该同时看到 ElasticSearch 和 node 进程,node 就是 Kibana,因为 Kibana 是 NodeJS 写的。
在 Kibana 的日志中可以看到提示的 code:
i Kibana has not been configured.
Go to http://0.0.0.0:5601/?code=335215 to get started.
然后浏览器访问 Kibana 的地址,在 URL 后面加上 code 参数。比如我这个虚拟机的 IP 是 10.129.0.69,那么访问的地址就是:http://10.129.0.69:5601/?code=335215。

首次访问 Kibana 需要注册令牌,获取令牌的方式有提示,命令为:
bin/elasticsearch-create-enrollment-token --scope kibana
然后就完活了,如果页面一直在等待,可以刷新一下也会进来的。
FAQ
Q1:为什么要使用非 root 用户启动 Elasticsearch?
A:这是运行 Elasticsearch 的基本安全要求。本文为了快速测试,直接创建了 elasticsearch 用户来下载、配置和启动。
Q2:为什么 curl 访问 _cluster/health 会返回 401?
A:Elasticsearch 8.x 默认启用 HTTPS 和认证。需要带上 CA 证书、用户名和密码才能访问受保护接口。
Q3:Kibana 首次访问为什么需要 enrollment token?
A:Kibana 需要通过 enrollment token 和 Elasticsearch 建立安全连接。本文使用 bin/elasticsearch-create-enrollment-token --scope kibana 生成令牌完成初始化。