使用Kubernetes Stateful Set有状态类型搭建Elasticsearch7.x版本高可用三节点集群

简介: 使用Kubernetes Stateful Set有状态类型搭建Elasticsearch7.x版本高可用三节点集群

系统信息


系统或服务 版本
centos 7.9
kubernetes 1.19
rancher 2.4.16
elasticsearch 7.1.1

注:rancher是k8s的可视化界面,不用rancher也可以。另外还有一台nfs服务,搭建方法就略过了,相信大家都会

1675238143313.jpg


最终效果


1675238151496.jpg

浏览器访问集群节点列表,输入用户名密码

1675238166619.jpg

elasticsearch主节点宕机后,会重新选择主节点,继续提供服务


实现方案


elasticserach集群,主要是配置文件和数据处理好即可。由于sts类型的pod可以通过无头svc实现之间的域名解析,所以我们可以在配置文件中把共同需要的配置写成变量,比如HOSTNAME,配置文件elasticsearch.yml文件这么做之后,就可以共享了,只做一个挂载点即可。数据是肯定不能共享了,所以做三个挂载点。我这里使用的pv是nfs类型。

一定要确保worker节点内存够用,大约需要预留5个G内存,下面开始动手做吧~


创建nfs


为创建pv、pvc数据持久化做准备,这个很简单,略写了


创建pv、pvc


这里还是要根据上一步nfs映射的路径配置pv

创建一个配置文件pv:pv-es-config

1675238211201.jpg

创建三个数据pv:pv-es-data

1675238229147.jpg

1675238234215.jpg

1675238239175.jpg

注:

我的nfs映射路径

[root@rancher01 elasticsearch-data]# cat /etc/exports
/data/nfs/elasticsearch-config 192.168.1.0/24(rw,async,no_root_squash,no_all_squash)
/data/nfs/elasticsearch-data/elasticsearch-0 192.168.1.0/24(rw,async,no_root_squash,no_all_squash)
/data/nfs/elasticsearch-data/elasticsearch-1 192.168.1.0/24(rw,async,no_root_squash,no_all_squash)
/data/nfs/elasticsearch-data/elasticsearch-2 192.168.1.0/24(rw,async,no_root_squash,no_all_squash)

创建四个pvc。pv是没有命名空间隔离的,但是pvc有,所以一定要把pvc和es服务创建在同一个命名空间下。

1675238279997.jpg

注:pv和pvc是一一对应的,根据名字相互关联


创建es服务


先创建一个容器,为了把elasticsearch镜像中的配置文件全部拷贝到nfs服务器的/data/nfs/elasticsearch-config目录下(这是我的nfs路径,以自己的为准)

docker run -d --name es   -e "discovery.type=single-node"  elasticsearch:7.1.1

进入到es容器 运行下面命令创建p12文件

docker exec -it es bash
/usr/share/elasticsearch/bin/elasticsearch-certutil cert -out  /usr/share/elasticsearch/config/elastic-certificates.p12 -pass ""

退出es容器

exit

把所有默认配置文件拷贝到当前位置,此时当前位置有一个config文件夹

docker cp es:/usr/share/elasticsearch/config ./

拿到配置文件之后,把配置文件发送到nfs服务主机的/data/nfs/elasticsearch-config目录下

scp config/* root@nfs服务器ip:/data/nfs/elasticsearch-config

正常情况下,nfs服务主机的/data/nfs/elasticsearch-config目录下会有以下文件

[root@rancher01 elasticsearch-config]# ls
elastic-certificates.p12  elasticsearch.keystore  elasticsearch.yml  jvm.options  log4j2.properties  role_mapping.yml  roles.yml  users  users_roles

修改配置文件 elasticsearch.yml

cluster.name: dwzes
node.name: ${HOSTNAME}
node.master: true
node.data: true
path.data: /usr/share/elasticsearch/data-${HOSTNAME}
bootstrap.memory_lock: false
network.host: ${HOSTNAME}
http.port: 9200
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["elasticsearch-0.elasticsearch:9300","elasticsearch-1.elasticsearch:9300","elasticsearch-2.elasticsearch:9300"]
cluster.initial_master_nodes: ["elasticsearch-0", "elasticsearch-1", "elasticsearch-2"]
xpack.license.self_generated.type: basic
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
indices.fielddata.cache.size: 20% 

注:discovery.zen.ping.unicast.hosts: ["elasticsearch-0.elasticsearch:9300","elasticsearch-1.elasticsearch:9300","elasticsearch-2.elasticsearch:9300"]

"elasticsearch-0.elasticsearch:9300":前面的elasticsearch-0是我要创建一个statefulset的服务名字,-0、-1、-2是statefulset 累加pod将自动在后面加一,.elasticsearch是无头服务的名字,这样写三个pod之间可以相互通信


⚠ 注意nfs文件权限问题

chmod 777 /data/nfs/elasticsearch-config -R

接下来选择stateful set部署3个pod,名字:elasticsearch:7.1.1,填写镜像elasticsearch:7.1.1,启动服务

1675239327758.jpg

环境变量:空

数据卷:

1675239350081.jpg

1675239359155.jpg

其他参数空(启动命令等)

注:

使用rancher创建statefulset服务会自动创建一个与服务重名的无头svc

[root@rancher01 elasticsearch-config]# kubectl get svc -n sts
NAME                                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
elasticsearch                              ClusterIP   None           <none>        42/TCP     5h52m

按理说是应该自动手动创建一个无头svc

接下来给elasticsearch创建一个密码

登录到任意一台pod上,运行下面命令开始设置密码

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive


配置ingress


1675239431602.jpg

打开浏览器输入负载均衡ip,使用密码登录 elastic/刚才创建的密码

1675239440092.jpg


查看日志

1、报volume挂载错误,先排查下nfs文件权限,给个777试试,再确认下配置写法是否正确

2、报bkytian org.elasticsearch.bootstrap.StartupException: ElasticsearchException[failed to bind service];nested: AccessDeniedExcepti...,检查下nfs挂载出来的映射文件权限,给个777试试,先找到问题

3、节点之间一直报连接9300端口号失败,登录任意一台主机,ping下其他节点

[root@elasticsearch-0 elasticsearch]# ping elasticsearch-1.elasticsearch
PING elasticsearch-1.elasticsearch.sts.svc.cluster.local (10.42.1.127) 56(84) bytes of data.
64 bytes from elasticsearch-1.elasticsearch.sts.svc.cluster.local (10.42.1.127): icmp_seq=1 ttl=62 time=0.630 ms
64 bytes from elasticsearch-1.elasticsearch.sts.svc.cluster.local (10.42.1.127): icmp_seq=2 ttl=62 time=0.291 ms
64 bytes from elasticsearch-1.elasticsearch.sts.svc.cluster.local (10.42.1.127): icmp_seq=3 ttl=62 time=0.349 ms

正常情况下,是可以ping通的,ping的格式。

statefulset服务名称.无头svc名称.命名空间(同一个命名空间下命名空间可以略写)


问题汇总


1、服务启动日志报错: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决方法:

原因分析

系统虚拟内存默认最大映射数为65530,无法满足ES系统要求,需要调整为262144以上。

处理办法

设置vm.max_map_count参数

#修改文件

sudo vim /etc/sysctl.conf

#添加参数

vm.max_map_count = 262144

重新加载/etc/sysctl.conf配置

sysctl -p
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
6月前
|
人工智能 算法 调度
阿里云ACK托管集群Pro版共享GPU调度操作指南
本文介绍在阿里云ACK托管集群Pro版中,如何通过共享GPU调度实现显存与算力的精细化分配,涵盖前提条件、使用限制、节点池配置及任务部署全流程,提升GPU资源利用率,适用于AI训练与推理场景。
541 1
|
6月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
391 1
|
6月前
|
弹性计算 监控 调度
ACK One 注册集群云端节点池升级:IDC 集群一键接入云端 GPU 算力,接入效率提升 80%
ACK One注册集群节点池实现“一键接入”,免去手动编写脚本与GPU驱动安装,支持自动扩缩容与多场景调度,大幅提升K8s集群管理效率。
362 89
|
11月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
704 9
|
11月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
12月前
|
安全 Java Linux
Linux安装Elasticsearch详细教程
Linux安装Elasticsearch详细教程
1998 64
|
11月前
|
JSON 安全 数据可视化
Elasticsearch(es)在Windows系统上的安装与部署(含Kibana)
Kibana 是 Elastic Stack(原 ELK Stack)中的核心数据可视化工具,主要与 Elasticsearch 配合使用,提供强大的数据探索、分析和展示功能。elasticsearch安装在windows上一般是zip文件,解压到对应目录。文件,elasticsearch8.x以上版本是自动开启安全认证的。kibana安装在windows上一般是zip文件,解压到对应目录。elasticsearch的默认端口是9200,访问。默认用户是elastic,密码需要重置。
5391 0
|
存储 安全 数据管理
如何在 Rocky Linux 8 上安装和配置 Elasticsearch
本文详细介绍了在 Rocky Linux 8 上安装和配置 Elasticsearch 的步骤,包括添加仓库、安装 Elasticsearch、配置文件修改、设置内存和文件描述符、启动和验证 Elasticsearch,以及常见问题的解决方法。通过这些步骤,你可以快速搭建起这个强大的分布式搜索和分析引擎。
597 5
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
存储 JSON Java
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。
这篇文章是关于Elasticsearch的学习指南,包括了解Elasticsearch、版本对应、安装运行Elasticsearch和Kibana、安装head插件和elasticsearch-ik分词器的步骤。
1396 0
elasticsearch学习一:了解 ES,版本之间的对应。安装elasticsearch,kibana,head插件、elasticsearch-ik分词器。

推荐镜像

更多