0%

Docker与K8s中的ElasticSearch持久化

容器中启动的ElasticSearch实例,如果不配置持久化,就会在重启时丢失数据。借助最近将一个实例迁移到k8s中的机会简单记录一下如何在容器中持久化ElasticSearch实例。同时记录一下ik分词器如何安装到容器中

1. 容器中的es

1.1. Docker拉取ES

  1. 搜索镜像:打开 DockerHub 官网 https://hub.docker.com/然后搜索 Elasticsearch 镜像
  2. 命令docker pull elasticsearch: x.x.x其中x.x.x为需要的版本

1.2. 容器中的es

尝试启动一个es的docker容器,并使用docker --it命令
可以看到容器的默认执行目录为/usr/share/elasticsearch。其中有如下文件夹与文件夹

1
LICENSE.txt  NOTICE.txt  README.textile  bin  config  data  lib  logs  modules  plugins

其中:

  • config文件夹为默认配置存放路径
  • data为数据持久化路径
  • plugins为插件安装路径

因为我们的目标是配置持久化的es,并且安装ik分词。因此这三个目录都需要进行挂载来防止容器重启后数据丢失

2. k8s中的ES持久化

2.1. 存储卷与配置

  1. 先临时启动一个容器,用于配置
  2. 创建一个存储卷,挂载并映射到/usr/share/elasticsearch/data,作为数据文件夹持久化用
  3. 创建一个存储卷,挂载并映射到/usr/share/elasticsearch/plugins,作为插件文件夹持久化用
  4. 创建一个存储卷,挂载并映射到/usr/share/elasticsearch/myconfig,作为配置文件夹持久化用
  5. 进入容器中,执行命令cp -r ./config、。 /myconfig将默认的配置项复制到/myconfig
  6. 修改/myconfig文件夹中的各种配置文件,用于es的配置。参考默认的ES文档

2.2. 启动容器

给容器配置环境变量ES_PATH_CONF="/usr/share/elasticsearch/myconfig",容器就会在启动时自动去加载挂载的/myconfig文件夹中的配置文件

2.3. 安装Ik-分词插件

  1. 进入容器,来到目录/usr/share/elasticsearch/pulgins
  2. 创建目录mkdir /usr/share/elasticsearch/plugins/ik
  3. cd mkdir /usr/share/elasticsearch/plugins/analysis-ik
  4. wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/vx.x.x/elasticsearch-analysis-ik-x.x.x.zip,将其中的x.x.x替换为需要的版本
  5. unzip elasticsearch-analysis-ik-x.x.x.zip
  6. 删除容器并重启

注:这里最好不要用/bin/elasticsearch-plugin install命令进行安装。否则可能会将ik分词器的配置文件安装到默认的/config文件夹中,导致容器重启后配置失效丢失

2.4. 验证

按照上面的挂载方式修改完成后,打开http://ipaddress/_cluster/health?pretty查看节点是否都启动成功。打开http://ipaddress/_analyze查看分词器是否配置正确

3. docker中的es持久化

3.1. 方式1

可以参考上面的方式,将config文件夹中的文件复制到/myconfig中。然后使用如下命令启动。之后参考上面的方式按照ik分词器

1
2
3
4
5
6
docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \
-e ES_PATH_CONF="/usr/share/elasticsearch/myconfig" \
-v /home/temp/elasticsearch/myconfig:/usr/share/elasticsearch/myconfig \
-v /home/temp/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/temp/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:x.x.x

3.2. 方式2

可以直接将本地的配置文件挂载到docker的es中,如下。这样可以减少一个挂载目录。之后参考上面的方式按照ik分词器

1
2
3
4
5
docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \
-v /home/temp/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /home/temp/elasticsearch/data:/usr/share/elasticsearch/data \
-v /home/temp/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:x.x.x

3.3. 验证

方式同上,略