本文基于Docker镜像搭建Elasticsearch集群,集群搭建完成后设置集群用户密码,主要包含以下内容:

  • 修改系统参数
  • 安装docker和docker-compose
  • 编写yml配置文件
  • 获取集群证书
  • 修改yml配置文件
  • 启动ES集群并修改密码
  • 配置kibana

(一)修改系统参数

    (1)    virtual memory

默认情况下,Elasticsearch使用mmapfs目录存储其索引,mmap计数的默认操作系统限制可能太低,这可能会导致内存不足,需要将其调至262144。在 /etc/sysctl.conf 添加一行 :

vm.max_map_count=262144

运行 sysctl -p 使其生效。

(2)disable swap file

通常,Elasticsearch的内存使用由JVM选项控制。不需要启用交换。Linux系统可执行 swapoff -a 不启用。为了避免每次开机都需要手动执行,可将其写入开机执行文件 /etc/rc.local,开机自动执行。

(3)ulimit -n

 /etc/security/limits.conf 末尾追加以下内容:

root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
* soft memlock  unlimited
* hard memlock  unlimited

如果是Ubuntu系统,追加上述内容后,ulimit -n可能并没有从1024变为65536,还需要在 /etc/systemd/user.conf和 /etc/systemd/system.conf 中追加 

DefaultLimitNOFILE=65535

注意:修改后重启机器

(二)安装docker和docker-compose

(1)安装docker

Ubuntu和Debian可新建docker.sh,添加以下内容:

#!/bin/bash
OS_NAME=`cat /etc/os-release | grep NAME`

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg2 software-properties-common iptables
sudo apt-get remove docker docker-engine docker.io containerd runc

if [[ $OS_NAME =~ "Ubuntu" ]];then
	sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
	sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
else
	curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
	sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
fi

sudo apt-get update
sudo apt-get install -y docker-ce
sudo systemctl start docker

CentOS系统添加以下内容到docker.sh中,赋予可执行权限,运行即可。

#!/bin/bash
sudo yum remove docker \
		    docker-client \
		    docker-client-latest \
		    docker-common \
		    docker-latest \
		    docker-latest-logrotate \
		    docker-logrotate \
		    docker-selinux \
		    docker-engine-selinux \
		    docker-engine
    
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 iptables

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
sudo systemctl start docker

(2)安装docker-compose

新建docker-compose.sh,添加以下内容并赋予执行权限后执行。

#!/bin/bash

if [ -f "/usr/local/bin/docker-compose" ]; then
	sudo rm /usr/local/bin/docker-compose #清除旧版本docker-compose
fi
	
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

安装完成后获取elasticsearch:6.8.6镜像,为创建集群做准备。

docker pull elasticsearch:6.8.6

(三)编写yml文件

新建/opt/es目录,在es目录下新建config目录和docker-compose.yml文件。

docker-compose.yml

version: '2.2'
services:
  es01:
    image: elasticsearch:6.8.6
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=bastion-es-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /opt/es-cluster/config/es01.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/logs:/usr/share/elasticsearch/logs
    ports:
      - 9200:9200
    network_mode: host

  es02:
    image: elasticsearch:6.8.6
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=bastion-es-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /opt/es-cluster/config/es02.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/logs:/usr/share/elasticsearch/logs
    network_mode: host

  es03:
    image: elasticsearch:6.8.6
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=bastion-es-cluster
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms128m -Xmx128m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - /opt/es-cluster/config/es03.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - /opt/es-cluster/data:/usr/share/elasticsearch/data
      - /opt/es-cluster/logs:/usr/share/elasticsearch/logs
    network_mode: host

在config目录下新建es01.yml,es02.yml,es03.yml,内容如下:

es01.yml

cluster.name: es-cluster
node.name: es01

bootstrap.memory_lock: true
bootstrap.system_call_filter: false

network.host: 0.0.0.0

transport.tcp.port: 9300

discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts:
        - 127.0.0.1:9300
        - 127.0.0.1:9301
        - 127.0.0.1:9302

node.data: true
node.master: true

node.max_local_storage_nodes: 7

es02.yml

cluster.name: es-cluster
node.name: es02

bootstrap.memory_lock: true
bootstrap.system_call_filter: false

network.host: 0.0.0.0

transport.tcp.port: 9301

discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts:
        - 127.0.0.1:9300
        - 127.0.0.1:9301
        - 127.0.0.1:9302

node.data: true
node.master: true

node.max_local_storage_nodes: 7

es03.yml

cluster.name: es-cluster
node.name: es03

bootstrap.memory_lock: true
bootstrap.system_call_filter: false

network.host: 0.0.0.0

transport.tcp.port: 9302

discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts:
        - 127.0.0.1:9300
        - 127.0.0.1:9301
        - 127.0.0.1:9302

node.data: true
node.master: true

node.max_local_storage_nodes: 7

在docker-compose.yml所在目录,执行docker-compose up即可创建一个Elasticsearch集群。此集群包含3个节点,每个节点既是master节点,又是data节点。在浏览器输入 Your_IP:9200,看到类似下面的内容说明创建成功。

es配置远程集群认证_elasticsearch

至此,一个包含3个节点的Elasticsearch集群已经搭建完成。但是存在一个问题:只要知道ip,任何人都可以访问这个进群,进行添加、删除索引等操作,这显然不是我们想要的结果。所以需要设置用户和密码,只有用户名和密码正确才有权限访问。

(四)获取集群证书

依次执行以下步骤

#查看启动的容器
docker ps 

#进入其中一个容器
docker exec -it 容器ID或名称 /bin/bash 

#创建证书颁发机构
bin/elasticsearch-certutil ca

#生成证书和私钥
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

#退出容器
exit

#从容器中拷贝证书
docker cp 容器ID:/usr/share/elasticsearch/elastic-certificates.p12 .

生成的 elastic-certificates.p12 就是我们需要的证书,容器之间通过证书认证通信。

(五)修改yml配置文件

新建目录certificates,将 elastic-certificates.p12 放在certificate中,在es01.yml、es02.yml、es03.yml中添加下列内容

xpack.security.enabled: true
xpack.security.authc.accept_default_password: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: /usr/share/elasticsearch/config/certificates/elastic-certificates.p12

修改docker-compose.yml,在每个volume下添加

- /opt/es/certificates:/usr/share/elasticsearch/config/certificates

(六)启动ES集群并修改密码

再次执行docker-compose up启动集群,再打开一个terminal,进入任意一个容器,执行

./bin/elasticsearch-setup-passwords interactive

如果出现下面的内容,说明不能在这个容器中设置密码。

es配置远程集群认证_elasticsearch_02

回到执行docker-compose up的terminal,可看到类似下面的日志,进入到这个容器中,执行上面的命令即可设置密码。

es配置远程集群认证_elasticsearch_03

执行设置密码的命令,如果出现下面的内容,输入y即可设置elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user这几个内置用户的密码。

es配置远程集群认证_es配置远程集群认证_04

设置完成后,再访问Elasticsearch集群时,就需要提供用户名和密码才能访问。

(七)配置kibana

#获取kibana镜像
docker pull kibana:6.8.6 

#启动一个kibana容器
docker run -dit -p 5601:5601 --name es_kibana kibana:6.8.6

#进入kibana容器
docker exec -dit es_kibana /bin/bash

#修改kibana配置文件
vi config/kibana.yml

1、将 elasticsearch.hosts 修改为你的ip
2、添加下面两行
elasticsearch.username: kibana
elasticsearch.password: 你设置的kibana密码

保存退出容器后,执行下面的命令重启es_kibana容器

docker restart es_kibana

在浏览器中输入Your_IP:5601,输入用户名和密码即可登录kibana。