使用k8s编排ElasticSearch集群

最近研究了如何使用k8s创建一个ES集群,在此与大家分享。

概述

我采用的方案参考了k8s官网中的示例,具体参考这里。该方案是基于quay.io/pires/docker-elasticsearch-kubernetes镜像搭建的集群,该镜像的Dockerfile可在这里找到。其使用了一个第三方的ES插件,专门用来支持在k8s集群中做ES node的服务发现,插件的源码参考这里,其中使用的k8s client源码参考这里

按照readme中的步骤执行即可创建一个简单的ES集群,并可通过k8s的scale功能来弹性伸缩node数量。

这里会遇到第一个坑,scale之后节点未添加成功并在pod日志中会看到以下错误:

启动错误

问题是由于ES服务发现的请求本应发到9300端口,但却发送到了9200端口。尚不清楚是否是因为ES的插件问题,解决方法很简单,只需要将service拆分成两个(一个对应9200端口,一个对应9300端口),并将rc中定义的环境变量DISCOVERY_SERVICE改为9300对应的service名称即可。

示例中的production_cluster目录中是推荐的用于生产环境的集群编排,将Node分成了Master、Data和Client三种角色。关于ES Node的详细介绍可以查看官方文档中的Node模块文档。简单来讲,Master用来管理index、shard和其他node,多个Master存在时会通过选举机制来确认一个主Master。Data节点用来存储shard并负责数据访问相关的操作。Client节点提供对外访问的接口,类似于一个负载均衡节点。

优化

minimum_master_nodes可配置

discovery.zen.minimum_master_nodes是影响ES集群可用性和一致性的一个很重要的配置。为避免出现脑裂现象,通常Master节点数量应为奇数,该配置需要设置为Master数量/2 + 1。一般集群中只需配置为2,并启动3个Master节点即可。

在此方案中,为方便minimum_master_nodes的配置,我们可以修改ES配置文件,使得discovery.zen.minimum_master_nodes可以从环境变量中读取。

cluster:
  name: ${CLUSTER_NAME}
node:
  master: ${NODE_MASTER}
  data: ${NODE_DATA}
network.host: ${NETWORK_HOST}
path:
  data: /data/data
  logs: /data/log
  plugins: /elasticsearch/plugins
 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值