elasticsearch在k8s中持久化部署

背景

Javashop电商系统的商品索引是使用的elasticsearch,对于高可用的要求有两个重要的考量:java

一、集群化node

二、可扩容git

三、冗灾shell

冗灾就要实现es的持久化,要考虑到es宕机的状况,当es因不可抗因素挂掉了,当咱们再恢复了es的运行后,商品索引也要随之 一块儿恢复。vim

本文着重讨论elasticsearch的持久化部署方案,固然提供在方案也支持了集群及扩容。 api

思路

一、数据的存储服务器

在k8s中的持久化部署不可避免的要用到持久卷,咱们采用nfs方式的持久卷来存储es数据。elasticsearch

持久卷的详细介绍请见这里:测试

二、节点规划

默认启动5个节点,3主2数据。

根据es官方推荐每一个节点的智能要分离,所以maseter节点不存储数据,只用来协调。

三、多节点的权限问题

es的数据目录默认只容许一个节点访问,但在k8s上采用了持久卷,全部节点的数据都存储在这个卷上,这会致使es的访问权限问题。

报错以下:

java.io.IOException: failed to obtain lock on /usr/share/elasticsearch/data/nodes/0",

固然能够经过更改es的配置max_local_storage_nodes来容许多个节点访问同一个数据目录,但es官方不推荐这样作。

因此咱们的方案是更改每一个节点的数据存储目录来解决

ps:指定es配置项path.data来实现

举例说明:

节点名 存储目录
es-data-1 /usr/share/elasticsearch/data/es-data-1
es-data-2 /usr/share/elasticsearch/data/es-data-2

部署过程

1、pv(持久卷的创建)

 先要创建nfs服务器

对于持久卷的结构规划以下:

目录 内容
/nfs/data/esmaster es master节点的数据
/nfs/data/esdata es 数据节点的数据

关于索引的磁盘占用:

请根据业务的数据量状况来规划持久卷硬件的状况

根据咱们实际测算1000个商品大约须要1MB/每节点

默认状况

在默认的规划中,咱们使用使用k8s的master节点做为nfs服务器,为上述卷准备了10G的空间,请确保k8s master node 很多于10G的空闲磁盘。

请根据您的具体业务状况选择nfs服务器,若是条件容许最好是独立的nfs服务器。

根据如上规划创建nfs服务:

#master节点安装nfs
yum -y install nfs-utils #建立nfs目录 mkdir -p /nfs/data/{mqdata,esmaster,esdata} #修改权限 chmod -R 777 /nfs/data/ #编辑export文件 vim /etc/exports 粘贴以下内容: /nfs/data/esmaster *(rw,no_root_squash,sync) /nfs/data/esdata *(rw,no_root_squash,sync) #配置生效 exportfs -r #查看生效 exportfs #启动rpcbind、nfs服务 systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs && systemctl enable nfs #查看 RPC 服务的注册情况 rpcinfo -p localhost #showmount测试,这里的ip输入master节点的局域网ip showmount -e <your ip>

若是成功能够看到可被挂载的目录:

# showmount -e 172.17.14.73                                                                                                                  
Export list for 172.17.14.73: /nfs/data/esmaster * /nfs/data/mqdata *

接下来,要在每个节点上安装nfs服务以便使k8s能够挂载nfs目录

#全部node节点安装客户端
yum -y install nfs-utils systemctl start nfs && systemctl enable nfs

 

这样就为k8s的持久卷作好了准备。

创建持久卷

有了nfs的准备,我就能够创建持久卷了:

咱们分享了javashop内部使用的yaml仓库供你们参考:

https://gitee.com/enation/elasticsearch-on-k8s

在您的k8s maseter节点服务器上 clone咱们准备好的yaml文件

git clone https://gitee.com/enation/elasticsearch-on-k8s.git

 

修改yaml目录中的pv.yaml

修改其中的server配置为nfs服务器的IP:

  nfs:
    server: 192.168.1.100 #这里请写nfs服务器的ip

在k8s  master节点上执行下面的命令建立namespace:

kubectl create namespace ns-elasticsearch

经过下面的命令创建持久卷:

kubectl create -f pv.yaml

经过如下命令查看持久卷是否创建成功:

kubectl get pv

部署elasticsearch

执行下面的命令建立es集群

kubectl create -f elasticsearch.yaml

经过以上部署咱们创建了一个ns-elasticsearch的namespace,并在其中建立了相应的pvc、角色帐号,有状态副本集以及服务。

有状态副本集:

 

服务:

 

 

 镜像

使用的是javashop本身基于es:6作的,加入了ik分词插件,其余没有变化。

 服务

咱们默认开启了对外nodeport端口,对应关系:

32000->9200

32100->9300

k8s内部能够经过下面的服务名称访问:

elasticsearch-api-service.ns-elasticsearch:9300

elasticsearch-service.ns-elasticsearch:9200

等待容器都启动成功后验证。

验证

一、生成索引

二、删除副本集:

kubectl delete -f elasticsearch.yaml

 三、创建副本集

kubectl create -f elasticsearch.yaml

 四、查看以前的索引是否恢复

关键技术点

一、集群发现:

  - name: "discovery.zen.ping.unicast.hosts"
              value: "elasticsearch-discovery"

创建了elasticsearch-discovery服务

二、映射持久卷

映射到:/usr/share/elasticsearch/data/ 

三、自定义数据目录

            - name: "path.data"
              value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"

 其中MY_POD_NAME是读取的容器名称,经过有状态副本集保证惟一性的绑定:

- name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name

 

 欢迎关注Javashop技术分享公众号,观看更多的视频讲解:

 

相关文章
相关标签/搜索