Kubesphere搭建ElasticSearch集群
我们要在kubesphere部署三个节点的ElasticSearch集群(以下简称es集群),一个master节点,两个data节点。在部署前需要编辑ElasticSearch的配置文件,由于node.name唯一,而在编写配置文件时我们可以不指定node.name,使其使用当前主机的hostname,而在k8s中hostname即为当前的podname,并且采用创建有状态副本集的工作负载来同步创
Author:think
参考文章:KubeSphere - 搭建 elasticsearch集群 及 kibana_kubersphere 集群安装elasticsearch_小毕超的博客-CSDN博客
环境信息
版本信息
-
Kubernetes v1.22.12
-
KubeSphere v3.3.2
-
ElasticSearch docker镜像:elasticsearch:8.9.1
前言
我们要部署三个节点的ElasticSearch集群(以下简称es集群),一个master节点,两个data节点。
在部署前需要编辑ElasticSearch的配置文件——elasticsearch.yml,由于elasticsearch.yml文件中要求节点名称:node.name唯一,而在编写配置文件时我们可以不指定node.name,使其使用当前主机的hostname,而在k8s中hostname即为当前的podname,并且采用创建有状态副本集的工作负载来同步创建Headless Service,以此来通过Headless的DNS服务来完成节点间的通信。
部署
一、创建项目
可以创建一个新的项目,也可以使用原有的项目。
项目创建完成。
二、配置elasticsearch.yml配置字典



键填写elasticsearch.yml;
值填写如下配置信息:
#集群名称
cluster.name: cluster-es
#节点名称,每个节点的名称不能重复,这里不指定,使用当前主机的名称
#node.name:
#ip 地址,每个节点的地址不能重复
network.host: 0.0.0.0
#节点角色,7.9版本之后的配置方法
node.roles: [ master , data ]
http.port: 9200
#节点通信端口
transport.port: 9300
# head 插件需要这打开这两个配置,解决跨域问题
http.cors.allow-origin: "*"
http.cors.enabled: true
http.max_content_length: 200mb
#es7.x 之后新增的配置,初始化一个新的集群时需要此配置来选举 master
cluster.initial_master_nodes: ["elasticsearch-0"]
#es7.x 之后新增的配置,节点发现
discovery.seed_hosts: ["elasticsearch-0.elasticsearch.elasticsearch-project.svc.cluster.local:9300","elasticsearch-1.elasticsearch.elasticsearch-project.svc.cluster.local:9300","elasticsearch-2.elasticsearch.elasticsearch-project.svc.cluster.local:9300"]
gateway.recover_after_data_nodes: 2
network.tcp.keep_alive: true
network.tcp.no_delay: true
transport.compress: true
#关闭安全校验
xpack.security.enabled: false
#集群内同时启动的数据任务个数,默认是 2 个
cluster.routing.allocation.cluster_concurrent_rebalance: 16
#添加或删除节点及负载均衡时并发恢复的线程个数,默认 4 个
cluster.routing.allocation.node_concurrent_recoveries: 16
#初始化数据恢复时,并发恢复线程的个数,默认 4 个
cluster.routing.allocation.node_initial_primaries_recoveries: 16
注意:配置中的
discovery.seed_hosts由于是有状态副本集,因此会有容器组内的通信域名,格式如下:(podname).(headless server name).(namespace).svc.cluster.local其中
podname的格式为:创建服务时指定的容器名称-序号
- headless server name : 服务名称;
- namespace : 命名空间,这里是项目名称

三、应用负载-工作负载配置
3.1基本信息设置

3.2容器组设置

es使用的镜像为:elasticsearch:8.9.1
下滑进行环境变量以及时区的设置:
-
环境变量:
ES_JAVA_OPTS-Xms556m -Xmx556m这里是配置
JVM虚拟机的参数,这个值是我测试过能够正常启动的,如果是256m则是启动不了,如果读者遇到初始化内存不足还可以调整此参数。


3.3 存储设置
注意这里使用持久卷声明模板来创建持久卷,因此需要先配置持久卷声明模板,并将该模板应用于工作负载中,为每一个容器都挂载一个独立的持久卷。

- PVC名称前缀:
elasticsearch-pvc- 挂载路径:
/usr/share/elasticsearch/data

作用是将上面定义的
elasticsearch.yml配置文件挂载至容器中对容器进行初始化。

- 挂载路径:
/usr/share/elasticsearch/config/elasticsearch.yml- 指定子路径:
elasticsearch.yml

指定特定键,如果设置字典的键就为
elasticsearch.yml,可不指定。




容器组创建成功,但此时还不能组建成为集群,因为自动创建的服务名称会带有一个随机的后缀,从而造成各个节点间不能够正常通信,因此需要改动配置字典elasticsearch.yml中的discovery.seed_hosts配置。
四、修改配置字典来实现各节点之间的通信
4.1查看服务名称


4.2修改配置字典



注意: 这里
discovery.seed_hosts里面节点host地址中的server name字段一定要和生成的服务名称保持一致!读者根据实际情况做出修改。
4.3重新构建工作负载

弹出的提示框点击确定即可,等待重新构建容器组完成。
五、验证集群部署结果



在打开的终端窗口输入如下命令查看集群状态:
curl http://elasticsearch-0.elasticsearch-mm3m.elasticsearch-project.svc.cluster.local:9200/_cat/nodes?pretty
注意其中的
server name字段值:elasticsearch-mm3m可能和读者的不一样,因此需要根据实际做出修改。

六、写在最后
6.1存在的问题
在部署es集群的过程中发现存在有如下几类问题。
6.1.1关于版本
在参考文章中使用的kubesphere版本与elasticsearch都是2022年最新版本,但是到了2023年时,kubesphere的操作方式以及elasticsearch配置文件elasticsearch.yml的配置项也存在有很大不同,尤其是elasticsearch.yml的配置项改动比较大,因此如果出现容器无法启动运行或者集群无法组建,那么可以查看容器日志中的报错信息,里面的提示信息还是比较全的,如果是配置项错误,那么es会有相关提示让修改成正确的配置项(正确的配置项名称会在日志中打印)。容器日志的入口在容器终端旁边。
6.1.2关于服务名的随机后缀
在填写节点发现配置项discovery.seed_hosts时需要填写服务名称,而在上面部署方式中会出现服务名称随机后缀的问题,针对这个问题有两种解决方案:
- 如同上面的部署过程中提到的一样,完成工作负载的创建并且同步自动创建服务之后查看服务的名称,拿到新的服务名称之后去修改配置字典
elasticsearch.yml中的服务名称字段。 - 创建
工作负载时,到了最后一步不直接点创建,而是先点击右上角的编辑YAML修改server name之后再创建工作负载,这样自动创建的服务名称就是我们自定义的服务名称。注意:这里编辑后的YAML配置信息可以下载下来保存,之后再创建工作负载的时候只需要选择创建有状态副本集,随后在基本信息编辑面板点击编辑YAML(如下图所示),并且将保存的YAML配置信息填写进来直接点创建即可快速创建工作负载和服务。
6.2向外暴露服务
如果我们需要从外部访问es的服务,则需要配置应用路由来进行映射,具体详情后面安排。
6.3可视化服务kibana
es可视化工具kibana的安装部署后面安排,读者如果有需要可以查阅相关资料先行部署。
更多推荐



所有评论(0)