ES基本概念名词

Cluster
 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
Shards
代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
replicas
代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
Recovery
 代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

ES是一个分布式全文检索框架,隐藏了复杂的处理机制,内部使用 分片机制、集群发现、分片负载均衡请求路由。
  Shards 分片:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。  
  Replicas分片:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。
离线搭建es集群
参考博客链接

https://blog.csdn.net/fiy_fish/article/details/108501550

k8s搭建es集群
在k8s中不能直接修改系统参数(ulimit)。官网上的事例是在docker上部署的,docker可以通过ulimits来修改用户资源限制。所以需要修改镜像
镜像下载地址

下载地址参考:https://www.docker.elastic.co

编写dockerfile重新构建镜像
以官网镜像为基础镜像

vi Dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:7.14.0
COPY run.sh /
RUN chmod 775 /run.sh
CMD ["/run.sh"]

启动脚本

vi run.sh
#!/bin/bash
# 设置memlock无限制
ulimit -l unlimited
exec su elasticsearch /usr/local/bin/docker-entrypoint.sh

标注为master的节点表示master候选节点,具备成为master的资格,实际的master节点在运行时由其他节点投票产生,集群健康的情况下,同一时刻只有一个master节点,否则称之为脑裂,会导致数据不一致。

问题描述:(es环境为7.2.0)
新版废弃了原先discovery.zen.ping.unicast.hosts及discovery.zen.minimum_master_nodes的探测方式,而是改为了discovery.seed_hosts及cluster.initial_master_nodes,其中第一项换汤不换药,值还是一样的,我们还是填内部服务域名,而后一项就有点恶心了,这项在实体服务器上配置没任何问题,把符合master节点的ip或主机名配进去就可以了,但在k8s环境下,master节点的ip是pod ip,随即分配的,主机名由于是deployment下部署的,主机名的尾巴也是随机字符,同样无法指定,不配的话各节点服务器无法选举master,无法组成集群。

办法:将es-master部署方式由depolyment调整至statefulset,这样就解决了主机名无法指定的问题,配置如下:

- name: cluster.initial_master_nodes
value: "es-master-0,es-master-1,es-master-2"

es部署yaml文件
存储pvc使用nfs,创建storageclass,这里直接使用,不再贴出yaml。

---
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    elastic-app: elasticsearch
  name: elasticsearch-admin
  namespace: elk
 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: elasticsearch-admin
  labels:
    elastic-app: elasticsearch
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: elasticsearch-admin
    namespace: elk
 
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  labels:
    elastic-app: elasticsearch
    role: master
  name: es-master
  namespace: elk
spec:
  serviceName: es-master
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      elastic-app: elasticsearch
      role: master
  template:
    metadata:
      labels:
        elastic-app: elasticsearch
        role: master
    spec:
      #将持久卷声明  
      volumes:
       - name: es-master-data
         persistentVolumeClaim:
           claimName: pvc-es-master     
      containers:
        - name: es-master
          image: elasticsearch:7.14.0-ulimit
          lifecycle:
            postStart:
              exec:
                command: ["/bin/bash", "-c", "sysctl -w vm.max_map_count=262144; chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data;"]
          ports:
            - containerPort: 9200
              protocol: TCP
            - containerPort: 9300
              protocol: TCP
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            #修改es默认的数据存储目录,否则多个节点同时写一个目录es权限不允许                                           
            - name: "path.data"
              value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"            
            - name: "cluster.name"
              value: "elasticsearch-cluster"
            - name: "bootstrap.memory_lock"
              value: "true"
            - name: "discovery.seed_hosts" #7.x的配置方式
              value: "elasticsearch-discovery"
            - name: "node.master"
              value: "true"
            - name: "node.data"
              value: "false"
            - name: "node.ingest"
              value: "false"
            - name: "ES_JAVA_OPTS"
              value: "-Xms1024m -Xmx1024m"
            - name: "cluster.initial_master_nodes"
              value: "es-master-0,es-master-1,es-master-2"
          securityContext:
            privileged: true
          #将持久卷映射为数据目录的父目录  
          volumeMounts:
            - name: es-master-data
              mountPath: /usr/share/elasticsearch/data/                  
      serviceAccountName: elasticsearch-admin
---
kind: Service
apiVersion: v1
metadata:
  labels:
    elastic-app: elasticsearch
  name: elasticsearch-discovery
  namespace: ns-elasticsearch
spec:
  ports:
    - port: 9300
      targetPort: 9300
  selector:
    elastic-app: elasticsearch
    role: master
 
---
kind: StatefulSet
apiVersion: apps/v1
metadata:
  labels:
    elastic-app: elasticsearch
    role: data
  name: es-data
  namespace: elk
spec:
  serviceName: es-data  
  replicas: 2
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      elastic-app: elasticsearch
  template:
    metadata:
      labels:
        elastic-app: elasticsearch
        role: data
    spec:
      #将es-data持久卷声明
      volumes:
       - name: es-data-data
         persistentVolumeClaim:
           claimName: pvc-es-data 
      nodeSelector:
        es: enable
      containers:
        - name: es-data
          image: elasticsearch:7.14.0-ulimit
          lifecycle:
            postStart:
              exec:
                command: ["/bin/bash", "-c", "sysctl -w vm.max_map_count=262144; chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data;"]
          ports:
            - containerPort: 9200
              protocol: TCP
            - containerPort: 9300
              protocol: TCP
          env:
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            #修改es默认的数据存储目录,否则多个节点同时写一个目录es权限不允许                  
            - name: "path.data"
              value: "/usr/share/elasticsearch/data/$(MY_POD_NAME)"
            - name: "cluster.name"
              value: "elasticsearch-cluster"
            - name: "bootstrap.memory_lock"
              value: "true"
            - name: "discovery.seed_hosts"
              value: "elasticsearch-discovery"
            - name: "node.master"
              value: "false"
            - name: "node.data"
              value: "true"
            - name: "ES_JAVA_OPTS"
              value: "-Xms1024m -Xmx1024m"
          securityContext:
            privileged: true
          #将持久卷映射到数据目录的父目录  
          volumeMounts:
            - name: es-data-data
              mountPath: /usr/share/elasticsearch/data/      
      serviceAccountName: elasticsearch-admin
---
kind: Service
apiVersion: v1
metadata:
  labels:
    elastic-app: elasticsearch-service
  name: elasticsearch-service
  namespace: elk
spec:
  ports:
    - port: 9200
      targetPort: 9200
      nodePort: 32000
  selector:
    elastic-app: elasticsearch
  type: NodePort
 
---
kind: Service
apiVersion: v1
metadata:
  labels:
    elastic-app: elasticsearch-service
  name: elasticsearch-api-service
  namespace: ns-elasticsearch
spec:
  ports:
    - port: 9300
      targetPort: 9300
      nodePort: 32100
  selector:
    elastic-app: elasticsearch
  type: NodePort

参考博客

https://www.cnblogs.com/soft2018/p/10213266.html
https://blog.csdn.net/duanqing_song/article/details/106219197
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐