系统信息
系统或服务 | 版本 |
centos | 7.9 |
kubernetes | 1.19 |
rancher | 2.4.16 |
elasticsearch | 7.1.1 |
注:rancher是k8s的可视化界面,不用rancher也可以。另外还有一台nfs服务,搭建方法就略过了,相信大家都会
最终效果
浏览器访问集群节点列表,输入用户名密码
当elasticsearch主节点宕机后,会重新选择主节点,继续提供服务
实现方案
elasticserach
集群,主要是配置文件和数据处理好即可。由于sts
类型的pod可以通过无头svc
实现之间的域名解析,所以我们可以在配置文件中把共同需要的配置写成变量,比如HOSTNAME
,配置文件elasticsearch.yml
文件这么做之后,就可以共享了,只做一个挂载点即可。数据是肯定不能共享了,所以做三个挂载点。我这里使用的pv
是nfs类型。
一定要确保worker节点内存够用,大约需要预留5个G内存
,下面开始动手做吧~
创建nfs
为创建pv、pvc数据持久化做准备,这个很简单,略写了
创建pv、pvc
这里还是要根据上一步nfs映射的路径配置pv
创建一个配置文件pv:pv-es-config
创建三个数据pv:pv-es-data
注:
我的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服务创建在同一个命名空间下。
注: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
,启动服务
环境变量:空
数据卷:
其他参数空(启动命令等)
注:
使用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
打开浏览器输入负载均衡ip,使用密码登录 elastic/刚才创建的密码
查看日志
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