使用Docker搭建Elasticsearch6.8.6集羣及設置集羣用戶密碼

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章