elasticsearch在kubernetes中持久化集群部署

背景

Javashop电商系统的商品索引是使用的elasticsearch,对于高可用的要求有两个重要的考量:
1、集群化
2、可扩容
3、冗灾

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

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

思路

1、数据的存储

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

持久卷的详细介绍请见这里:
https://kubernetes.io/docs/concepts/storage/persistent-volumes/

2、节点规划

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

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

3、多节点的权限问题

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

部署过程

一、pv(持久卷的建立)
先要建立nfs服务器

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

目录内容
/nfs/data/esmasteres master节点的数据
/nfs/data/esdataes 数据节点的数据

关于索引的磁盘占用:

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

根据我们实际测算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

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

验证
1、生成索引
2、删除副本集:

kubectl delete -f elasticsearch.yaml

3、建立副本集

kubectl create -f elasticsearch.yaml

4、查看之前的索引是否恢复

关键技术点
1、集群发现:

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

建立了elasticsearch-discovery服务

2、映射持久卷

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

3、自定义数据目录
- 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技术分享公众号,观看更多的视频讲解:

在这里插入图片描述
易族智汇(javashop)原创文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Kubernetes是一个开源的容器编排平台,可以帮助我们轻松部署、扩展和管理容器化应用程序。Elasticsearch是一个分布式的实时搜索和分析引擎,可以帮助我们处理大量的数据。 要在Kubernetes持久化部署Elasticsearch8.x集群,我们可以按照以下步骤进行操作: 1. 创建Kubernetes集群:首先,我们需要在Kubernetes上创建一个集群。可以选择在本地搭建Minikube环境,或者使用云服务提供商如AWS、Azure等提供的Kubernetes集群。 2. 创建Persisten Volume(PV)和Persisten Volume Claim(PVC):PV是Kubernetes的一种资源,用于表示集群的持久存储。PVC则是对PV的申请,用于声明需要的存储资源。我们需要创建足够的PV和PVC来提供给Elasticsearch使用。 3. 创建Elasticsearch Pod和Service:创建一个包含Elasticsearch容器的Pod,并且将其暴露为一个Service。可以使用Kubernetes的Deployment资源来定义Elasticsearch的Pod模板,以便实现自动扩展和故障恢复。 4. 配置Elasticsearch集群:在Elasticsearch的配置文件,我们需要为每个节点配置唯一的节点名称、集群名称和网络绑定地址。此外,还需要指定master节点和data节点的角色和数量,并配置持久化存储路径。 5. 使用StatefulSet进行扩容:Elasticsearch是一个分布式系统,可以通过添加更多的节点来扩展其容量。为了实现有状态应用的扩容,可以使用Kubernetes的StatefulSet资源,它可以为每个节点提供唯一的网络标识和稳定的存储卷。 6. 监控和日志管理:为了保证Elasticsearch集群的稳定性和可用性,可以使用Kubernetes提供的监控和日志管理工具。比如,Prometheus可以帮助我们监控集群的健康状态,Elasticsearch官方提供的Elasticsearch Logstash Kibana(ELK)可以用于集存储和分析日志。 通过以上步骤,我们就可以在Kubernetes上成功持久化部署Elasticsearch8.x集群。这样可以有效地管理和扩展我们的分布式搜索和分析引擎,并且确保数据的持久性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kingapex1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值