本文基于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
系统默认设置1024。Elasticsearch使用了很多文件描述符,文件描述符用完可能是灾难性的,并且很可能导致数据丢失。因此运行Elasticsearch之前需要将文件描述符的数量限制增加到65536或更高。在 /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,看到类似下面的内容说明创建成功。
至此,一个包含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
如果出现下面的内容,说明不能在这个容器中设置密码。
回到执行docker-compose up的terminal,可看到类似下面的日志,进入到这个容器中,执行上面的命令即可设置密码。
执行设置密码的命令,如果出现下面的内容,输入y即可设置elastic,apm_system,kibana,logstash_system,beats_system,remote_monitoring_user这几个内置用户的密码。
设置完成后,再访问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。