Elasticsearch群集部署

TOC

es群集部署

本次部署使用docker进行部署。

★准备工作★

使用镜像版本: elasticsearch:7.17.24
1.安装好docker环境
2.拉取所需镜像

docker pull elasticsearch:7.17.24

开始部署es群集

1.编写docker compose文件

services:
  es-1:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-1
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-1
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-2,es-3
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    volumes:
      - ./data/es-1:/usr/share/elasticsearch/data

  es-2:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-2
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-2
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-1,es-3
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9201:9200"
    volumes:
      - ./data/es-2:/usr/share/elasticsearch/data

  es-3:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-3
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-3
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-1,es-2
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=false
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9202:9200"
    volumes:
      - ./data/es-3:/usr/share/elasticsearch/data

  kibana:
    image: kibana:7.17.24
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://es-1:9200
      - I18N_LOCALE=zh-CN

networks:
  default:
    name: es
    external: true

2.创建es网络

docker network create -d bridge es

3.启动服务并给data目录添加权限

docker compose up -d
chown -R 1000:1000 data/*

测试阶段

我们可以访问ip地址+5601端口通过kibana工具查看我们部署的集群信息(如下所示)
集群状态信息:
es
节点状态信息:
es
这样我们的es集群就搭建成功了!!!

es群集开启用户认证

如果需要es群集配置开启用户认证方式,那么必须要配置证书模块才能开启,内部es集群之间通信不配置ssl则会报错。

客户端使用http通信

生成证书

首先我们要创建一个instances.yml文件来配置证书需要对应的DNS和IP信息,创建证书命令工具直接读取该文件。

instances:
  - name: es-1
    dns: [ "es-1", "es.mydomain.com" ]
    ip: [ "172.16.10.15" ]
  - name: es-2
    dns: [ "es-2", "es.mydomain.com" ]
    ip: [ "172.16.10.15" ]
  - name: es-3
    dns: [ "es-3", "es.mydomain.com" ]
    ip: [ "172.16.10.15" ]

这里使用es自带的工具elasticsearch-certutil来生成。

# 生成ca证书
docker run --rm -v $(pwd):/certs -w /certs elasticsearch:7.17.24 \
  elasticsearch-certutil ca --pem --out /certs/ca.zip
unzip ca.zip
# 使用新配置生成节点证书
docker run --rm -v $(pwd):/certs -w /certs elasticsearch:7.17.24 \
  elasticsearch-certutil cert --ca-cert /certs/ca/ca.crt --ca-key /certs/ca/ca.key --pem --in /certs/instances.yml --out /certs/certs.zip
unzip certs.zip
mv ca certs/
rm -rf ca.zip certs.zip

最后生成的证书文件如下:

elasticsearch@root# tree certs
certs
├── ca
│   ├── ca.crt
│   └── ca.key
├── es-1
│   ├── es-1.crt
│   └── es-1.key
├── es-2
│   ├── es-2.crt
│   └── es-2.key
└── es-3
    ├── es-3.crt
    └── es-3.key

配置证书部署集群

我们需要开启安全设置以及证书和账号密码的相关配置项,但是不开启客户端必须https访问集群。
以es-1为例:

environment:
  ......
  - xpack.security.enabled=true
  - xpack.security.http.ssl.enabled=false
  - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/es-1/es-1.key
  - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/es-1/es-1.crt
  - xpack.security.http.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
  - xpack.security.transport.ssl.enabled=true
  - xpack.security.transport.ssl.key=/usr/share/elasticsearch/config/certs/es-1/es-1.key
  - xpack.security.transport.ssl.certificate=/usr/share/elasticsearch/config/certs/es-1/es-1.crt
  - xpack.security.transport.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
  - xpack.security.transport.ssl.verification_mode=certificate
  - ELASTIC_USERNAME=elastic
  - ELASTIC_PASSWORD=elastic123456
  ......

完整的docker-compose文件如下:

services:
  es-1:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-1
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-1
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-2,es-3
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/es-1/es-1.key
      - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/es-1/es-1.crt
      - xpack.security.http.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=/usr/share/elasticsearch/config/certs/es-1/es-1.key
      - xpack.security.transport.ssl.certificate=/usr/share/elasticsearch/config/certs/es-1/es-1.crt
      - xpack.security.transport.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - ELASTIC_USERNAME=elastic
      - ELASTIC_PASSWORD=elastic123456
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 19200:9200
    volumes:
      - ./certs:/usr/share/elasticsearch/config/certs
      - ./data/es-1:/usr/share/elasticsearch/data

  es-2:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-2
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-2
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-1,es-3
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - ELASTIC_USERNAME=elastic
      - ELASTIC_PASSWORD=elastic123456
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/es-2/es-2.key
      - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/es-2/es-2.crt
      - xpack.security.http.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=/usr/share/elasticsearch/config/certs/es-2/es-2.key
      - xpack.security.transport.ssl.certificate=/usr/share/elasticsearch/config/certs/es-2/es-2.crt
      - xpack.security.transport.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 19201:9200
    volumes:
      - ./certs:/usr/share/elasticsearch/config/certs
      - ./data/es-2:/usr/share/elasticsearch/data

  es-3:
    image: elasticsearch:7.17.24
    container_name: elasticsearch-3
    restart: unless-stopped
    privileged: true
    environment:
      - node.name=es-3
      - cluster.name=es-cluster
      - discovery.seed_hosts=es-1,es-2
      - cluster.initial_master_nodes=es-1,es-2,es-3
      - ELASTIC_USERNAME=elastic
      - ELASTIC_PASSWORD=elastic123456
      - network.host=0.0.0.0
      - bootstrap.memory_lock=true
      - xpack.security.enabled=true
      - xpack.security.http.ssl.enabled=false
      - xpack.security.http.ssl.key=/usr/share/elasticsearch/config/certs/es-3/es-3.key
      - xpack.security.http.ssl.certificate=/usr/share/elasticsearch/config/certs/es-3/es-3.crt
      - xpack.security.http.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.enabled=true
      - xpack.security.transport.ssl.key=/usr/share/elasticsearch/config/certs/es-3/es-3.key
      - xpack.security.transport.ssl.certificate=/usr/share/elasticsearch/config/certs/es-3/es-3.crt
      - xpack.security.transport.ssl.certificate_authorities=/usr/share/elasticsearch/config/certs/ca/ca.crt
      - xpack.security.transport.ssl.verification_mode=certificate
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - TZ=Asia/Shanghai
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 19202:9200
    volumes:
      - ./certs:/usr/share/elasticsearch/config/certs
      - ./data/es-3:/usr/share/elasticsearch/data

  kibana:
    image: kibana:7.17.24
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      - ELASTICSEARCH_HOSTS=http://es-1:9200
      - ELASTICSEARCH_USERNAME=elastic
      - ELASTICSEARCH_PASSWORD=elastic123456
      - I18N_LOCALE=zh-CN

networks:
  default:
    name: es
    external: true

测试阶段

我们去访问es查看节点信息

# 不使用用户密码进行访问
curl -l http://172.16.10.15:19200/_cat/nodes
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication credentials for REST request [/_cat/nodes]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication credentials for REST request [/_cat/nodes]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}
# 使用用户密码进行访问
curl -u "elastic:elastic123456" -l http://172.16.10.15:19200/_cat/nodes
172.18.0.23 64 98 0 0.54 0.53 0.69 cdfhilmrstw - es-3
172.18.0.22 70 98 0 0.54 0.53 0.69 cdfhilmrstw * es-1
172.18.0.44 39 98 0 0.54 0.53 0.69 cdfhilmrstw - es-2

说明我们用户认证配置成功,可以使用http方式进行访问。

客户端通信必须使用https

只需要配置xpack.security.http.ssl.enabledtrue就可以使客户端必须使用https方式访问es通信了。
docker-compose文件修改:

environment:
  ......
  - xpack.security.http.ssl.enabled=true
  ......

配置文件:

xpack.security.http.ssl.enabled: true

测试阶段

我们配置好了之后先使用http的方式进行访问,发现报错,无法访问。

curl -u "elastic:elastic123456" -l http://172.16.10.15:19200/_cat/nodes
curl: (52) Empty reply from server

我们再使用https的方式进行访问,记住这里必须指向ca证书,因为我们是自己使用工具生成的ca证书,否则会不被信任。

curl -u "elastic:elastic123456" --cacert certs/ca/ca.crt -l https://172.16.10.15:19200/_cat/nodes
172.18.0.44 65 98 0 0.53 0.88 0.81 cdfhilmrstw - es-3
172.18.0.23 41 98 0 0.53 0.88 0.81 cdfhilmrstw * es-2
172.18.0.22 76 98 0 0.53 0.88 0.81 cdfhilmrstw - es-1

说明配置了之后确实只能用https方式进行访问了。