podman搭建elasticsearch集群、kibana、zipkin

在 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
 
posted on 2026-09-17 05:49  wtsgtc  阅读(13)  评论(0)    收藏  举报