`
javashop
  • 浏览: 45228 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

elasticsearch在kubernetes中持久化集群部署

阅读更多

背景

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

1、集群化

2、可扩容

3、冗灾

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

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

思路

1、数据的存储

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

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

2、节点规划

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

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

3、多节点的权限问题

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

报错如下:

1
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/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

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

验证

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)原创文章

分享到:
评论

相关推荐

    Kubernetes持久化部署elasticsearch7.15.0分布式集群

    原文链接:https://blog.csdn.net/m0_37814112/article/details/122965720 说明:包含elasticsearch7.15.0集群3节点、5节点、7节点等三种方式的K8S部署yaml文件、镜像文件,里面有详细的README.txt部署参考

    kubernetes(k8s)内部署ambry,es,mongodb,mysql,orientdb,rocketmq集群模式的方法

    这里我们将详细介绍如何在k8s环境中部署Ambry、Elasticsearch(ES)、MongoDB、MySQL、OrientDB以及RocketMQ这六种数据库和消息队列服务的集群模式。 首先,我们要理解Kubernetes的基本概念,如Pod(应用实例)、...

    kubernetes部署mysql高可用

    在现代云原生环境中,Kubernetes(简称K8s)被广泛用于自动化容器化应用的部署、扩展和管理。MySQL作为流行的开源关系型数据库管理系统,其在Kubernetes上的高可用部署是许多企业级应用的关键需求。本文将深入探讨...

    kubernetes-elasticsearch-cluster:在Kubernetes之上的Elasticsearch集群变得容易

    **正文** 在现代云原生环境中,数据存储与检索的需求日益增长,...通过理解Kubernetes和Elasticsearch的核心概念,以及它们在实际部署中的交互,开发者和运维人员能够构建出更加高效和可靠的Elasticsearch集群。

    Kubernetes指南

    存储是持久化应用数据的必需部分,在Kubernetes中可以通过PersistentVolume(PV)和PersistentVolumeClaim(PVC)来实现数据持久化。 五、Kubernetes监控和日志 Kubernetes集群的健康监控和日志收集是维护集群稳定...

    使用kubernetes部署ELK日志系统

    在Kubernetes中,我们可以通过定义Deployment或StatefulSet来创建Elasticsearch集群。配置文件可能包括节点数量、资源请求与限制、持久卷声明(Persistent Volume Claims,PVCs)以确保数据持久化,以及必要的环境...

    Kubernetes基础及集群搭建.rar

    在IT行业中,Kubernetes(简称K8s)已经成为容器编排领域的主流标准,它使得部署、管理和扩展微服务应用变得更加高效。"Kubernetes基础及集群搭建"这一主题涵盖了理解Kubernetes核心概念、安装与配置Kubernetes集群...

    Mastering Kubernetes

    通过以上章节的学习,可以全面掌握Kubernetes的基础架构、集群部署与管理、系统监控、故障处理以及确保高可用性和可靠性的策略和技巧。这对于希望在容器化技术领域深入发展和应用的IT专业人员来说是必不可少的。掌握...

    kubernetes-rabbitmq-cluster:适用于kubernetes的可部署的Rabbitmq集群

    总结来说,"kubernetes-rabbitmq-cluster"项目提供了一个在Kubernetes中部署和管理RabbitMQ集群的有效方法,利用了Kubernetes的强大力量,实现了RabbitMQ服务的高可用性和可扩展性。通过学习和实践这个项目,开发者...

    kubernetes 部署单机版Kafka、zookeeper

    在本文中,我们将深入探讨如何在Kubernetes集群中部署单机版的Apache Kafka和ZooKeeper,这两个组件是大数据处理和消息传递领域的关键组件。Kubernetes(简称K8s)作为一个自动化容器管理系统,使得在云环境中部署、...

    kubernetes权威指南例子代码

    《Kubernetes权威指南》是一本深入探讨 Kubernetes 集群管理、应用部署和服务发现的经典教程。这本书通过详尽的实例代码,帮助读者理解和掌握 Kubernetes 的核心概念与实践操作。在这个压缩包“kubeguide-example-...

    kubernetes安装部署手册

    - **存储编排**:支持多种持久化存储方案,保证数据在容器重启后依然可用。 ### Kubernetes架构 Kubernetes采用中心节点架构,包括管理节点(Master Node)和工作节点(Worker Node)。Master Node是集群的控制平面...

    Kubernetes高可用部署资源

    7. **存储和持久化**:高可用部署还需要考虑数据持久化,如使用Persistent Volumes (PV) 和 Persistent Volume Claims (PVC) 来保证数据不受节点故障影响。 8. **监控和日志**:通过Prometheus、Grafana等工具进行...

    nussknacker-kubernetes:在Kubernetes集群上使用Flink运行Nussknacker的示例部署设置示例

    在Nussknacker部署中,可能需要配置Flink的配置文件、数据库连接信息等,这些都可以通过ConfigMap或Secret来管理。 5. **网络策略和服务发现**:Kubernetes的网络策略可以控制Pod间的通信,确保安全。Service对象则...

    kubernetes-handbook, Kubernetes Handbook (Kubernetes指南) https.zip

    6. **监控与日志**:如何集成Prometheus、Grafana等工具进行集群和应用的性能监控,以及使用Elasticsearch、Fluentd和Kibana(EFK堆栈)进行日志收集和分析。 7. **故障排查与最佳实践**:常见问题的排查方法,如...

    阿里云 专有云企业版 V3.12.0 阿里云Elasticsearch 技术白皮书(on K8S) 20200619.pdf

    - 数据持久化:在K8S中,使用持久卷(Persistent Volumes)解决Elasticsearch的数据持久化问题。 - 集群通信:通过服务发现机制,K8S帮助Elasticsearch节点间建立有效的通信。 - 资源调度:K8S的资源调度策略确保...

    Kubernetes指南,中文版

    高可用性是集群部署中的一个重要考虑,这部分内容讲解了如何设计和实施Kubernetes的高可用解决方案。 以上内容是对《Kubernetes指南》中文版电子书的概览,详细介绍了Kubernetes的架构、部署、配置以及最佳实践等...

    自动化安装kubernetes1.27.2

    在IT行业中,Kubernetes(简称K8s)已经成为容器编排和管理的首选平台,而自动化安装Kubernetes能够显著提高部署效率,降低出错风险。本文将深入探讨如何自动化安装Kubernetes 1.27.2版本,以及在这个过程中可能涉及...

    kubernetes 容器 云平台 实践

    这些高级特性包括使用ConfigMap进行配置管理、使用EFK(Elasticsearch, Fluentd, Kibana)进行日志集中处理、独立容器处理定时任务等。 #### 分布式存储与监控 Kubernetes支持分布式存储解决方案,如GlusterFS,并...

Global site tag (gtag.js) - Google Analytics