本文基於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。