Elasticsearch7.6.2通过k8s搭建集群,设置中文分词器以及数据备份
一:环境介绍
本人相关环境如下:
- spring-boot版本2.3.7.RELEASE
- spring-boot-starter-data-elasticsearch版本2.3.7.RELEASE
- Elasticsearch 7.6.2
- elasticsearch-analysis-ik-7.6.2 中文分词器
- harbor k8s镜像管理中心
- ceph 共享存储
下图为各软件间的版本对应关系,一定要按照对应关系使用,否则无法成功或出现各种错误。
推荐spring-boot-starter-data-elasticsearch,可以映射索引实体,并有内置方法,方便快速应用。
版本关系见:https://docs.spring.io/spring-data/elasticsearch/docs/4.0.2.RELEASE/reference/html/#preface.versions
二:准备工作
- 准备一套k8s集群
- 准备一套文件服务器如ceph、nfs、nas等
本文使用ceph做了一个共享存储,用于节点数据映射到宿主机中,用于数据恢复或迁移等工作 - 准备Elasticsearch 7.6.2的docker镜像包
- es-plugins-fs.yaml 插件目录映射yaml,es.yaml主文件
因为插件plugins多个node可以共享一个,所以单独做一个plugins的映射。每个node的data数据不一样,所以在es.yaml单独设置了每个node的映射。
es-plugins-fs.yaml插件挂载目录如下:
需要针对自己环境进行修改
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-plugins-fs-pv
labels:
app: es-plugins-fs
spec:
capacity:
storage: 50Gi
accessModes:
- ReadWriteMany
# nfs或其他的自行替换
cephfs:
monitors:
- 100.20.30.111:6789
path: /es/es-data/plugins
user: cephfs
secretRef:
name: ceph-secret-admin
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: es-plugins-claim
namespace: tax
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 50Gi
selector:
matchLabels:
app: es-plugins-fs
es.yaml主文件如下:
需要针对自己环境进行修改
apiVersion: v1
kind: Service
metadata:
name: es-headless-service
labels:
app: elasticsearch
namespace: #自己服务的空间名
spec:
type: NodePort
ports:
- port: 9200
name: api-port
targetPort: 9200
nodePort: 30229
- port: 9300
name: inner-port
targetPort: 9300
nodePort: 30230
selector:
app: elasticsearch
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-PodDisruptionBudget
namespace: #自己服务的空间名
spec:
selector:
matchLabels:
app: elasticsearch
maxUnavailable: 1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-fs-pv-1
namespace: #自己服务的空间名
labels:
app: elasticsearch-fs-pv-1
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteOnce
# nfs或其他的自行替换
cephfs:
monitors:
- 100.20.30.111:6789
path: /es/es-data
user: cephfs
secretRef:
name: ceph-secret-admin
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-fs-pv-2
namespace: #自己服务的空间名
labels:
app: elasticsearch-fs-pv-2
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteOnce
# nfs或其他的自行替换
cephfs:
monitors:
- 100.20.30.111:6789
path: /es/es-data
user: cephfs
secretRef:
name: ceph-secret-admin
persistentVolumeReclaimPolicy: Retain
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: elasticsearch-fs-pv-3
namespace: #自己服务的空间名
labels:
app: elasticsearch-fs-pv-3
spec:
capacity:
storage: 4Gi
accessModes:
- ReadWriteOnce
# nfs或其他的自行替换
cephfs:
monitors:
- 100.20.30.111:6789
path: /es/es-data
user: cephfs
secretRef:
name: ceph-secret-admin
persistentVolumeReclaimPolicy: Retain
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
namespace: #自己服务的空间名
spec:
serviceName: es-headless-service
#3个节点数量,对应上边
replicas: 3
updateStrategy:
type: RollingUpdate
podManagementPolicy: Parallel
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: k8s-elasticsearch
#改成自己镜像地址
image: harbor.com/library/elasticsearch:7.6.2
imagePullPolicy: Always
lifecycle:
postStart:
exec:
command: ["/bin/bash", "-c", "sysctl -w vm.max_map_count=262144; ulimit -l unlimited;chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data;"]
resources:
requests:
memory: "1Gi"
cpu: "100m"
limits:
cpu: "1000m"
memory: "2Gi"
ports:
- containerPort: 9200
name: api-port
- containerPort: 9300
name: inner-port
env:
- name: MY_POD_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: metadata.name
#/usr/share/elasticsearch/data 为镜像中data地址,不可修改
#修改es默认的数据存储目录,否则多个节点同时写一个目录es权限不允许
- name: "path.data"
value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"
#快照镜像地址
- name: "path.repo"
value: "/usr/share/elasticsearch/data/repositories"
- name: "cluster.name"
value: "elasticsearch-cluster"
- name: "bootstrap.memory_lock"
value: "false"
#7.x的配置方式
- name: "discovery.seed_hosts"
value: "es-headless-service"
#设置都为主master节点
- name: "node.master"
value: "true"
#设置都为数据data节点
- name: "node.data"
value: "true"
- name: "node.ingest"
value: "false"
#jvm设置
- name: "ES_JAVA_OPTS"
value: "-Xms1024m -Xmx1024m"
#三个节点名字
- name: "cluster.initial_master_nodes"
value: "elasticsearch-0,elasticsearch-1,elasticsearch-2"
securityContext:
privileged: true
volumeMounts:
- name: datadir
mountPath: /usr/share/elasticsearch/data/
- name: plugins
mountPath: /usr/share/elasticsearch/plugins
imagePullSecrets:
- name: registry-secret
volumes:
- name: plugins
persistentVolumeClaim:
claimName: es-plugins-claim #和es-plugins-fs.yaml的对应
volumeClaimTemplates:
- metadata:
name: datadir
namespace: #自己服务的空间名
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 4Gi
三:部署
1. 把修改后的es.yaml和es-plugins-fs.yaml上传到k8s的master节点
2. 添加中文分词器
3. 先应用es-plugins-fs.yaml的文件!
把对应版本的elasticsearch-analysis-ik-7.6.2解压后上传到要映射的plugins目录下
kubectl apply -f es-plugins-fs.yaml
查看是否生效,如果得到对应的输出则表示插件目录映射成功
执行:
kubectl get pvc -n 空间名
输出:
es-plugins-fs-pv 50Gi RWX Retain Bound tax/es-plugins-claim
执行:
kubectl get pv
输出:
es-plugins-claim Bound es-plugins-fs-pv 50Gi RWX
4. 再应用es.yaml文件
kubectl apply -f es.yaml
查看目录映射是否生效,如果得到对应的输出则表示插件目录映射成功
执行:
kubectl get pvc -n 空间名
输出:
datadir-elasticsearch-0 Bound elasticsearch-fs-pv-1 4Gi RWO
datadir-elasticsearch-1 Bound elasticsearch-fs-pv-2 4Gi RWO
datadir-elasticsearch-2 Bound elasticsearch-fs-pv-3 4Gi RWO
执行:
kubectl get pv
输出:
elasticsearch-fs-pv-1 4Gi RWO Retain Bound tax/datadir-elasticsearch-0
elasticsearch-fs-pv-2 4Gi RWO Retain Bound tax/datadir-elasticsearch-1
elasticsearch-fs-pv-3 4Gi RWO Retain Bound tax/datadir-elasticsearch-2
执行:
kubectl get pod -n 空间名
输出:
elasticsearch-0 1/1 Running 0
elasticsearch-1 1/1 Running 0
elasticsearch-2 1/1 Running 0
4. 查看系统验证
通过kibana(需要部署对应版本的服务)、elastic-view(安装包,支持windows、mac、linux)、es-client(浏览器插件)进行连接访问。
推荐elastic-view及es-client两种
elastic-view 下载地址 https://gitee.com/cynthia520/elastic-view
集群状态为green,节点数量为3表示成功。
5.卸载服务
如果要卸载服务或部署失败需要重新部署时执行
5.1 卸载es.yaml文件
执行:
kubectl delete -f es.yaml
然后执行:
kubectl get pod -n 空间名
如果无elasticsearch三个pod则pod卸载成功
然后执行:
kubectl get pvc -n 空间名
如果无datadir-elasticsearch三个pvc则pvc卸载成功,如果datadir-elasticsearch一直在Terminating状态
则执行delete手动删除
kubectl delete pvc datadir-elasticsearch-0 -n 空间名
kubectl delete pvc datadir-elasticsearch-1 -n 空间名
kubectl delete pvc datadir-elasticsearch-2 -n 空间名
5.2 es.yaml的都卸载成功之后卸载es-plugins-fs-pv.yaml
执行:
kubectl delete -f es-plugins-fs-pv.yaml
然后执行:
kubectl get pvc -n 空间名
如果不输出es-plugins-fs-pv则表示卸载成功
6.数据备份及恢复
以elastic-view客户端为例,页面中操作,新增存储库以及快照。并可对快照进行恢复

7.特殊情况数据恢复
个人理解
!!!!新增索引时,副本数量加1一定要和所有node总数一样,防止某几个node节点出现问题后可对数据进行恢复,否则会存在异常的分片!!!!
恢复步骤如下:
7.1. 先卸载es.yaml
参考第5步
kubectl delete -f es.yaml
7.2. 进入共享磁盘删除报错节点的数据
删除indices,其他的不要动,_state里边存着集群相关信息更不能动
7.3应用es.yaml
kubectl apply -f es.yaml
pod启动成功后,进入es客户端,索引会自动同步
全部同步成功后,再次查看ES状态
更多推荐




所有评论(0)