在 Docker 环境中使用 instances.yml 为 Elasticsearch 创建节点证书时,ip 字段的设置需要根据 Elasticsearch 的实际网络配置来选择适合的 IP 地址。以下是不同场景的配置指南。


1. 获取容器的实际 IP

在 Docker 网络中,每个容器都会有一个内部 IP。可以通过以下命令查看 Elasticsearch 容器的 IP 地址:

bash
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>

示例:

bash
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' es01

输出类似于:

172.20.0.2

2. 设置 instances.ymlip

根据集群架构选择合适的 IP 配置:

单节点

如果 Elasticsearch 是单节点运行:

yaml
instances: - name: es01 ip: - 172.20.0.2 dns: - es01 # Docker 服务名

多节点集群

在多节点集群中,每个节点需要在 instances.yml 文件中定义一个条目,包含容器的内部 IP 和 DNS 名称(服务名)。

示例:

yaml
instances: - name: es01 ip: - 172.20.0.2 dns: - es01 - name: es02 ip: - 172.20.0.3 dns: - es02 - name: es03 ip: - 172.20.0.4 dns: - es03

混合网络(Docker 和外部访问)

如果 Elasticsearch 需要同时支持 Docker 内部网络和宿主机或外部访问,可以为 ipdns 字段同时添加多个条目。

示例:

yaml
instances: - name: es01 ip: - 172.20.0.2 # Docker 内部 IP - 192.168.1.101 # 宿主机 IP dns: - es01 - es01.local

动态 IP 情况

如果容器的 IP 是动态分配的(非固定),可以使用 Docker 的服务名称(DNS 名称)代替具体的 IP。

示例:

yaml
instances: - name: es01 dns: - es01 # 使用 Docker Compose 中定义的服务名

3. 创建证书

使用配置好的 instances.yml 文件生成证书:

bash
bin/elasticsearch-certutil cert --ca /path/to/elastic-stack-ca.p12 --in /path/to/instances.yml --out /path/to/certs.zip

生成的证书通常包括每个节点的 .p12 文件,用于 SSL 配置。


4. 配置 Docker 容器中的 Elasticsearch

将生成的证书挂载到 Docker 容器中,并在 elasticsearch.yml 中配置。

Docker Compose 示例

yaml
version: '3.8' services: es01: image: docker.elastic.co/elasticsearch/elasticsearch:8.6.0 container_name: es01 volumes: - ./certs:/usr/share/elasticsearch/config/certs environment: - xpack.security.enabled=true - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/es01.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-stack-ca.p12 networks: elastic: ipv4_address: 172.20.0.2 es02: image: docker.elastic.co/elasticsearch/elasticsearch:8.6.0 container_name: es02 volumes: - ./certs:/usr/share/elasticsearch/config/certs environment: - xpack.security.enabled=true - xpack.security.transport.ssl.enabled=true - xpack.security.transport.ssl.verification_mode=certificate - xpack.security.transport.ssl.keystore.path=/usr/share/elasticsearch/config/certs/es02.p12 - xpack.security.transport.ssl.truststore.path=/usr/share/elasticsearch/config/certs/elastic-stack-ca.p12 networks: elastic: ipv4_address: 172.20.0.3 networks: elastic: driver: bridge ipam: config: - subnet: 172.20.0.0/24

5. 测试证书配置

  1. 验证节点间通信是否正常:

    bash
    curl --cacert /path/to/certs/elastic-stack-ca.p12 https://172.20.0.2:9200
  2. 检查集群健康状态:

    bash
    curl -X GET "https://172.20.0.2:9200/_cluster/health" -u elastic:your_password --cacert /path/to/certs/elastic-stack-ca.p12

总结

  • ip 设置:使用容器的内部 IP(如 172.20.0.x)或服务名(dns)。
  • 多场景支持:为 ipdns 配置多个值以支持内部和外部访问。
  • 证书生成:使用 elasticsearch-certutil 工具根据 instances.yml 生成证书。
  • 挂载证书:将证书挂载到容器,并在 elasticsearch.yml 配置中引用。

通过这些步骤,您可以正确配置 Docker 环境下的 Elasticsearch 节点和证书。

点赞(367) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部