在 Linux Mint 24 上通过 Podman 部署 Elasticsearch 8.19.21 集群,核心在于系统内核参数调优、TLS 证书的生成与挂载,以及 Podman 网络和 SELinux 标签的正确配置。下面是一份可落地的操作指南。
📌 前置准备与系统调优
1. 确认 Podman 版本与内核参数
podman --version
确保 Podman 版本在 4.x 或以上。
Elasticsearch 依赖 vm.max_map_count 参数,默认值通常过低,必须先调整-:
# 临时生效
sudo sysctl -w vm.max_map_count=262144
# 永久生效
echo "vm.max_map_count=262144" | sudo tee /etc/sysctl.d/99-elasticsearch.conf
sudo sysctl --system
先验证:如果大于262144则不需要设置
sysctl vm.max_map_count
2. 配置国内镜像加速
编辑 /etc/containers/registries.conf,添加 Elastic 官方镜像仓库的加速配置(如果使用国内镜像源)。由于 Elasticsearch 官方镜像来自 docker.elastic.co,也可以为其单独配置 mirror。
3. 创建 Podman 网络
创建一个专用网络,供集群节点之间通信-:
podman network create es-cluster-net
验证网络:
podman network inspect es-cluster-net
4. 创建数据卷
为每个节点创建独立的数据卷,确保数据持久化:
podman volume create es-data-01
podman volume create es-data-02
podman volume create es-data-03
🔐 生成 TLS 证书(Elasticsearch 8 强制要求)
Elasticsearch 8.x 默认启用安全功能,需要为集群生成证书。使用官方 elasticsearch-certutil 工具生成-:
# 创建证书目录
mkdir -p ~/es-certs
cd ~/es-certs
# 创建 instances.yml,定义各节点信息
cat > instances.yml << 'EOF'
instances:
- name: es01
ip: ["10.89.0.10"]
dns: ["es01"]
- name: es02
ip: ["10.89.0.11"]
dns: ["es02"]
- name: es03
ip: ["10.89.0.12"]
dns: ["es03"]
EOF
# 使用官方镜像生成 CA 和节点证书
podman run --rm -v ~/es-certs:/certs -w /certs \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21 \
bash -c "elasticsearch-certutil ca --silent --pem --out ca.zip && \
unzip ca.zip && \
elasticsearch-certutil cert --silent --pem \
--in instances.yml --out certs.zip \
--ca-cert ca/ca.crt --ca-key ca/ca.key && \
unzip certs.zip"
使用绝对路径分步完成上条命令,便于排错:生成 CA 证书,如果解压时出现权限问题,执行下 sudo chown -R wt:wt ~/es-certs/ 这条命令
podman run --rm -v ~/es-certs:/certs -w /certs \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21 \
bash -c "/usr/share/elasticsearch/bin/elasticsearch-certutil ca --silent --pem -out /certs/ca.zip"
生成后验证:
ls -lh ~/es-certs/ca.zip
解压 CA 证书
unzip -o ~/es-certs/ca.zip -d ~/es-certs/
应得到 ~/es-certs/ca/ca.crt 和 ~/es-certs/ca/ca.key。
生成各节点证书
podman run --rm -v ~/es-certs:/certs -w /certs \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21 \
bash -c "/usr/share/elasticsearch/bin/elasticsearch-certutil cert --silent --pem \
--in /certs/instances.yml \
--out /certs/certs.zip \
--ca-cert /certs/ca/ca.crt \
--ca-key /certs/ca/ca.key"
解压节点证书
unzip -o ~/es-certs/certs.zip -d ~/es-certs/
生成后,~/es-certs 目录结构如下:
es-certs/
├── ca/
│ ├── ca.crt
│ └── ca.key
├── es01/
│ ├── es01.crt
│ └── es01.key
├── es02/
│ ├── es02.crt
│ └── es02.key
└── es03/
├── es03.crt
└── es03.key
📝 创建每个节点的配置文件
在宿主机上为每个节点创建 elasticsearch.yml:
mkdir -p ~/es-config/es01 ~/es-config/es02 ~/es-config/es03
es01 节点配置(~/es-config/es01/elasticsearch.yml):
cluster.name: es-podman-cluster
node.name: es01
node.roles: [master, data, ingest]
network.host: 0.0.0.0
network.publish_host: 10.89.0.10
discovery.seed_hosts: ["10.89.0.10", "10.89.0.11", "10.89.0.12"]
cluster.initial_master_nodes: ["es01", "es02", "es03"]
xpack.security.enabled: true
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.key: certs/es01/es01.key
xpack.security.http.ssl.certificate: certs/es01/es01.crt
xpack.security.http.ssl.certificate_authorities: certs/ca/ca.crt
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.key: certs/es01/es01.key
xpack.security.transport.ssl.certificate: certs/es01/es01.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca/ca.crt
xpack.security.transport.ssl.verification_mode: certificate
ingest.geoip.downloader.enabled: false
节点2和节点3和节点1不同的地方(改成对应的自己的)
node.name: es01
network.publish_host: 10.89.0.10
xpack.security.http.ssl.key: certs/es01/es01.key
xpack.security.http.ssl.certificate: certs/es01/es01.crt
xpack.security.transport.ssl.key: certs/es01/es01.key
xpack.security.transport.ssl.certificate: certs/es01/es01.crt
注意:
network.publish_host必须指定为容器的固定 IP,否则其他节点无法正确发现它-。
🚀 启动集群节点(三个节点密码要一致)
启动主节点 es01
podman run -d \
--name es01 \
--network es-cluster-net \
--ip 10.89.0.10 \
-p 9200:9200 \
-p 9300:9300 \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e "ELASTIC_PASSWORD=111111" \
-v es-data-01:/usr/share/elasticsearch/data:Z \
-v ~/es-config/es01/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:Z \
-v ~/es-certs:/usr/share/elasticsearch/config/certs:Z \
--ulimit memlock=-1:-1 \
--ulimit nofile=65535:65535 \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21
启动数据节点 es02 和 es03
# es02
podman run -d \
--name es02 \
--network es-cluster-net \
--ip 10.89.0.11 \
-p 9201:9200 \
-p 9301:9300 \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e "ELASTIC_PASSWORD=111111" \
-v es-data-02:/usr/share/elasticsearch/data:Z \
-v ~/es-config/es02/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:Z \
-v ~/es-certs:/usr/share/elasticsearch/config/certs:Z \
--ulimit memlock=-1:-1 \
--ulimit nofile=65535:65535 \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21
# es03
podman run -d \
--name es03 \
--network es-cluster-net \
--ip 10.89.0.12 \
-p 9202:9200 \
-p 9302:9300 \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e "ELASTIC_PASSWORD=111111" \
-v es-data-03:/usr/share/elasticsearch/data:Z \
-v ~/es-config/es03/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:Z \
-v ~/es-certs:/usr/share/elasticsearch/config/certs:Z \
--ulimit memlock=-1:-1 \
--ulimit nofile=65535:65535 \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21
关于
:Z标签:Linux Mint 默认可能未启用 SELinux,但加上:Z不会产生副作用;如果启用了 SELinux,它是必须的,否则容器无法读取挂载的配置文件-。
✅ 验证集群健康状态
等待约 30–60 秒,让节点完成发现和选举,然后检查集群状态:
# 查看集群健康(使用 CA 证书验证 HTTPS)
curl --cacert ~/es-certs/ca/ca.crt -u elastic:111111 https://localhost:9200/_cluster/health?pretty
上面不行可以用下面这行,也可以直接用浏览器访问
curl --cacert ~/es-certs/ca/ca.crt -u elastic:111111 --connect-to es01:9200:127.0.0.1:9200 https://es01:9200/_cluster/health?pretty
预期输出包含:
{
"cluster_name": "es-podman-cluster",
"status": "green",
"number_of_nodes": 3,
"number_of_data_nodes": 3,
...
}
查看所有节点:
curl --cacert ~/es-certs/ca/ca.crt \
-u elastic:111111\
https://localhost:9200/_cat/nodes?v
🔧 常见问题排查
1. 节点无法互相发现
症状:日志中出现 NoRouteToHostException 或 master_not_discovered_exception。
原因:network.publish_host 未正确设置,或 discovery.seed_hosts 中的 IP 与容器实际 IP 不一致。
解决:确认每个容器的 IP 与配置文件中 network.publish_host 一致,并确保 discovery.seed_hosts 包含所有节点的正确 IP-。
2. vm.max_map_count 过低
症状:容器启动失败,日志提示 max virtual memory areas vm.max_map_count [65530] is too low。
解决:执行上文中的 sysctl 命令,并确保永久生效-。
3. Rootless 模式下 memlock 限制
症状:Rootless 运行时提示 RLIMIT_MEMLOCK 设置失败。
原因:Rootless 用户无法设置超过当前会话限制的 ulimit。
解决:要么以 root 运行容器,要么调整 /etc/security/limits.conf 允许用户设置更高的 memlock 限制-。
4. 证书权限问题
症状:容器日志提示 AccessDeniedException 或无法读取证书文件。
解决:确保 ~/es-certs 目录对容器内用户(UID 1000)可读。可以执行:
chmod -R 755 ~/es-certs
chmod 644 ~/es-certs/ca/ca.crt
如果启用了 SELinux,使用 chcon -R -t container_file_t ~/es-certs 修正上下文-。
💎 总结
在 Linux Mint 24 上用 Podman 部署 Elasticsearch 8.19.21 集群,关键步骤是:调优内核参数 → 生成 TLS 证书 → 为每个节点编写独立配置 → 通过 Podman 自定义网络和固定 IP 启动容器。只要确保证书、配置文件和网络 IP 三者一致,集群就能正常形成。
===================
安装图形管理界面
安装 Kibana
========================
# 1. 重置密码(丢弃警告,只看密码)
podman exec -it es01 bin/elasticsearch-reset-password -u kibana_system -s 2>/dev/null
# 2. 复制输出的密码,用 curl 验证(替换 <PWD>)
podman exec es01 curl --cacert /usr/share/elasticsearch/config/certs/ca/ca.crt \
-u kibana_system:上条命令生成的密码 https://es01:9200/_cluster/health?pretty
curl --cacert ~/es-certs/ca/ca.crt -u kibana_system:<PWD> \
https://localhost:9200/_cluster/health?pretty
# 3. 验证通过后,启动 Kibana(替换 <PWD>)
podman rm -f kibana 2>/dev/null
第一步:生成加密密钥
方法一:使用 Kibana 官方工具(推荐)
在你的 Kibana 容器镜像中运行以下命令,它会直接生成多个可用的密钥:
podman run --rm docker.elastic.co/kibana/kibana:8.19.21 bin/kibana-encryption-keys generate
podman run -d --name kibana --network es-cluster-net -p 5601:5601 \
-e ELASTICSEARCH_HOSTS='["https://es01:9200","https://es02:9200","https://es03:9200"]' \
-e ELASTICSEARCH_USERNAME=kibana_system \
-e ELASTICSEARCH_PASSWORD='aK2YhE0KMvnBDKJbQ6F=' \
-e ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=/usr/share/kibana/config/certs/ca.crt \
-e ELASTICSEARCH_SSL_VERIFICATIONMODE=certificate \
-e XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY='上条命令生成得对应的密钥' \
-e XPACK_REPORTING_ENCRYPTIONKEY='上条命令生成得对应的密钥' \
-e XPACK_SECURITY_ENCRYPTIONKEY='上条命令生成得对应的密钥' \
-e I18N_LOCALE='zh-CN' \
-e I18N_LOCALES='["en","zh-CN","ja-JP"]' \
-v ~/kibana-config/ca.crt:/usr/share/kibana/config/certs/ca.crt:Z \
docker.elastic.co/kibana/kibana:8.19.21
验证环境变量是否注入成功
容器启动后执行:
podman exec kibana env | grep XPACK
# 4. 看日志
podman logs -f kibana
===================
安装 Zipkin
===================
# 1. 创建目录
mkdir -p ~/zipkin-config
# 2. 用已有的 ES 镜像生成 truststore.jks(不用下新镜像)
podman run --rm \
-v ~/zipkin-config:/work \
-v ~/es-certs/ca/ca.crt:/work/ca.crt:ro \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21 \
bash -c "/usr/share/elasticsearch/jdk/bin/keytool -importcert -trustcacerts -noprompt \
-alias es-ca \
-file /work/ca.crt \
-keystore /work/truststore.jks \
-storepass changeit"
# 3. 验证文件
ls -lh ~/zipkin-config/truststore.jks
# 4. 查看信任库内容
podman run --rm -v ~/zipkin-config:/work \
docker.elastic.co/elasticsearch/elasticsearch:8.19.21 \
/usr/share/elasticsearch/jdk/bin/keytool -list -keystore /work/truststore.jks -storepass changeit
# 5. 使用明确支持 ES 8.x 的版本启动
podman run -d \ --name zipkin \ --network es-cluster-net \ -p 9411:9411 \
-e STORAGE_TYPE=elasticsearch \ -e ES_HOSTS=https://es01:9200,https://es02:9200,https://es03:9200 \ -e ES_USERNAME=elastic \ -e ES_PASSWORD=111111 \ -e ES_INDEX=zipkin \ -e ES_INDEX_SHARDS=3 \ -e ES_INDEX_REPLICAS=1 \ -e JAVA_OPTS="-Djavax.net.ssl.trustStore=/zipkin-config/truststore.jks -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.ssl.trustStoreType=PKCS12" \ -v ~/zipkin-config/truststore.jks:/zipkin-config/truststore.jks:Z \ openzipkin/zipkin:3.6.0
# 6. 看日志
podman logs -f zipkin
# 7. 健康检查
curl http://localhost:9411/health
# 8. 浏览器
# http://192.168.0.101:9411
浙公网安备 33010602011771号