一:环境介绍

本人相关环境如下:

  • 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.versionsspringboot 、spring-data-elasticsearch、elasticserach的版本对应关系

二:准备工作

  1. 准备一套k8s集群
  2. 准备一套文件服务器如ceph、nfs、nas等
    本文使用ceph做了一个共享存储,用于节点数据映射到宿主机中,用于数据恢复或迁移等工作
  3. 准备Elasticsearch 7.6.2的docker镜像包
  4. 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状态
在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐