单节点部署

编写docker-compose.yml文件

使用docker-compose部署单节点es,docker-compose.yml文件如下:

version: "3.3"
services:
  elasticsearch:
    image: elasticsearch:7.10.1
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    volumes:
      - ./data/esdata:/usr/share/elasticsearch/data
      - ./conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    hostname: elasticsearch
    restart: always
    network_mode: host

编写elasticsearch.yml

其中elasticsearch.yml文件内容如下:

cluster.name: docker-cluster                                    # 记得修改node名称
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
# 是否支持跨域
http.cors.enabled: true
# 默认为*表示支持所有域名跨域访问,也可以指定域名跨域,或者使用正则表达式匹配。
http.cors.allow-origin: "*"
# 跨域允许设置的头信息
http.cors.allow-headers: Authorization
# 是否返回设置的跨域Access-Control-Allow-Credentials头
http.cors.allow-credentials: true
# 开启x-pack
xpack.security.enabled: true
# 开启ssl认证
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required

由于我开启了ssl认证以及配置了需要账号密码认证所以需要开启x-pack相关功能。

配置密码验证

生产环境应用连接es显然要设置基础的密码验证,以下为设置过程:

docker exec -it elasticsearch bash
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive

设置过后要设置一些组件的密码期间会要求你确认直接按提示确认就可以,配置完密码,在elasticsearch.yml要增加x-pack相关配置,上面已配置。

升级为集群模式

修改docker-compose.yml文件

这里我模拟实际环境,最开始节点发现模式为单节点模式single-node,需要修改node1的配置,docker-compose.yml修改成如下:

version: "3.7"
services:
  elasticsearch:
    image: elasticsearch:7.10.1
    container_name: elasticsearch
    environment:
#      - discovery.type=single-node
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - TZ=Asia/Shanghai
    volumes:
      - ./conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./config/certs:/usr/share/elasticsearch/config/certs
      - ./data/esdata:/usr/share/elasticsearch/data
      - ./backup:/usr/share/elasticsearch/backup
    hostname: elasticsearch
    restart: always
    network_mode: host
    extra_hosts:
      - "node1:10.10.10.103"
      - "node2:10.10.10.233"
      - "node3:10.10.10.234"

其中需要增加extra_hosts配置表示在容器里面的hosts文件对应的节点关系,另外需要注释掉- discovery.type=single-node,将节点发现模式改成默认的集群模式,三个节点都改成这样。

修改elasticsearch.yml文件

cluster.name: docker-cluster
node.name: node1                                        # 记得修改node名称
network.host: 0.0.0.0
http.port: 9200
transport.port: 9300
discovery.seed_hosts: 
        - 10.10.10.103
        - 10.10.10.233
        - 10.10.10.234
## Bootstrap the cluster using an initial set of master-eligible nodes:
cluster.initial_master_nodes: 
        - node1
        - node2
        - node3
# 是否支持跨域
http.cors.enabled: true
# 默认为*表示支持所有域名跨域访问,也可以指定域名跨域,或者使用正则表达式匹配。
http.cors.allow-origin: "*"
# 跨域允许设置的头信息
http.cors.allow-headers: Authorization
# 是否返回设置的跨域Access-Control-Allow-Credentials头
http.cors.allow-credentials: true
# 开启x-pack
xpack.security.enabled: true
# 开启ssl认证
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.client_authentication: required
# 配置生成的ca证书,这里的路径可以根据
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

PS 另外如果需要开启https访问则需要添加以下:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.verification_mode: certificate
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12

生成证书密钥

由于开启了ssl通信所以各个节点需要证书密钥 第1步:在node1的根目录生成CA证书

bin/elasticsearch-certutil ca

第2步:使用第一步生成的证书,产生p12密钥

bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

给出的提示操作一律按确定,不设置密码,默认生成在当前目录 第3步:两步操作: 1、将这两个文件分别拷贝到node2、node3的config/certs目录,没有则新创建 2、配置elasticsearch.yml 在配置文件增加以下两行,上面已经增加了

xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12

然后分别重启node1 node2 node3

验证

[root@test-riverxyz ~]#  curl -H "Content-Type:application/json" "10.10.10.233:9200/_cat/nodes" -u elastic:elastic
10.10.10.233 59 96 0 0.16 0.10 0.06 cdhilmrstw - node2
10.10.10.234 40 61 0 0.00 0.04 0.09 cdhilmrstw - node3
10.10.10.103 37 99 0 0.06 0.05 0.08 cdhilmrstw * node1

当然这里面有一些细节没办法很好的展示,比如你启用了ssl验证后你如果没有生成密钥就会提示报错 image.png 你如果没有修改Node1的discovery.type为zen模式(注释掉,默认就是),也会提示无法发现主节点,同时你会发现node1的cluster.uuid和其他节点的不一样。 参考链接:https://blog.csdn.net/fen_fen/article/details/126705843