K8S部署ELK(三):部署Elasticsearch搜索引擎

发布于:2025-08-07 ⋅ 阅读:(12) ⋅ 点赞:(0)

目录

1. Elasticsearch 详细介绍

1.1 Elasticsearch 核心概念

(1)基本架构

(2)数据模型(与关系型数据库对比)

1.2 核心特性

(1)全文检索

(2)近实时(NRT)

(3)分布式 & 高可用

(4)强大的聚合分析

(5)RESTful API

1.3 典型应用场景

1.4 数据写入与查询流程

(1)写入流程

(2)搜索流程

1.5 Elasticsearch 生态

1.6 性能优化要点

1.7 对比其他搜索引擎

2. 部署Elasticsearch

2.1 创建名字空间

2.3 创建service

2.4 创建statefulset

2.5 部署所有资源

2.6 检查Pod 状态


1. Elasticsearch 详细介绍

Elasticsearch 是一个开源的 分布式搜索和分析引擎,基于 Apache Lucene 构建,专为处理大规模数据而设计,提供近实时的搜索和分析能力。它广泛应用于 全文检索、日志分析、业务指标监控、安全分析 等领域。


1.1 Elasticsearch 核心概念

(1)基本架构

概念 说明
Node(节点) 一个运行中的 Elasticsearch 实例(服务器)。
Cluster(集群) 多个 Node 组成的分布式系统(默认集群名 elasticsearch)。
Index(索引) 类似数据库的“表”,存储相关文档(如 products, logs)。
Document(文档) 索引中的基本数据单元(JSON 格式,类似数据库的“行”)。
Shard(分片) 索引可拆分为多个分片,支持水平扩展(默认 1 主分片 + 1 副本)。
Replica(副本) 分片的副本,提供高可用和负载均衡。

(2)数据模型(与关系型数据库对比)

RDBMS Elasticsearch
Database Index
Table Index (Type 已废弃)
Row Document
Column Field
Schema Mapping
SQL Query DSL

1.2 核心特性

(1)全文检索

  • 支持 分词(Analyzer)模糊搜索(如“Elastc”能匹配“Elasticsearch”)。

  • 内置多种语言分析器(中文需插件如 IK Analyzer)。

(2)近实时(NRT)

  • 数据写入后 1 秒内 可被搜索(相比传统数据库的 B-tree 索引更快)。

(3)分布式 & 高可用

  • 数据自动分片(Sharding)和复制(Replication)。

  • 节点故障时自动切换副本。

(4)强大的聚合分析

  • 支持 统计(Metrics)、分组(Buckets)、嵌套聚合(类似 SQL 的 GROUP BY + COUNT/SUM)。

(5)RESTful API

  • 所有操作通过 HTTP API 完成,如:

    GET /products/_search
    {
      "query": { "match": { "name": "手机" } }
    }

1.3 典型应用场景

场景 说明
搜索引擎 电商商品搜索、新闻全文检索。
日志分析(ELK) 存储和分析 Logstash/Filebeat 收集的日志。
指标监控 结合 Metricbeat 监控服务器性能。
安全分析(SIEM) 检测异常行为(如频繁登录失败)。
业务分析 用户行为分析、实时仪表盘(通过 Kibana)。

1.4 数据写入与查询流程

(1)写入流程

  1. 客户端发送文档到任意 Node。

  2. Node 根据文档 ID 计算目标分片(默认 _id 哈希)。

  3. 数据写入主分片后,同步到副本分片。

  4. 返回写入成功响应。

(2)搜索流程

  1. 客户端发送查询请求到 Node。

  2. Node 作为协调节点,将查询广播到所有相关分片。

  3. 各分片返回结果,协调节点合并后返回客户端。

1.5 Elasticsearch 生态

  • Kibana:数据可视化和管理界面。

  • Logstash:数据采集和预处理。

  • Beats:轻量级数据采集器(如 Filebeat、Metricbeat)。

  • Elastic Stack(ELK):Elasticsearch + Logstash + Kibana 的完整日志解决方案。


1.6 性能优化要点

方向 优化手段
硬件 使用 SSD、增加内存(Lucene 依赖文件缓存)。
索引设计 合理设置分片数(建议每个分片 10-50GB)。
查询优化 使用 filter 替代 query(利用缓存)、避免通配符查询。
集群调优 调整 JVM 堆大小(不超过物理内存的 50%)。

1.7 对比其他搜索引擎

特性 Elasticsearch Solr OpenSearch
实时性 ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
分布式 原生支持 需手动配置 兼容 ES 生态
易用性 简单 较复杂 类似 ES
适用场景 日志、分析 文本搜索 AWS 替代 ES

适用场景

  • 需要快速搜索和分析结构化/非结构化数据。

  • 实时日志或指标监控(如 ELK 架构)。

不适用场景

  • 频繁更新的 OLTP 系统(传统数据库更合适)。

  • 强一致性要求的场景(ES 是最终一致性)。

Elasticsearch 凭借其分布式架构和强大的搜索能力,已成为大数据和实时分析领域的核心工具之一。

2. 部署Elasticsearch

2.1 创建名字空间

kubectl create namespace elk

2.3 创建service

vim elasticsearch-service.yaml
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-cluster  #无头服务的名称,需要通过这个获取ip,与主机的对应关系
  namespace: elk
  labels:
    app: elasticsearch
spec:
  ports:
    - port: 9200
      name: elasticsearch
  clusterIP: None
  selector:
    app: elasticsearch  
---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch   #service服务的名称,向外暴露端口
  namespace: elk
  labels:
    app: elasticsearch
spec:
  ports:
    - port: 9200
      name: elasticsearch
  type: NodePort
  selector:
    app: elasticsearch
​

2.4 创建statefulset

vim elasticsearch-statefulset.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: elk
spec:
  serviceName: "elasticsearch-cluster"   #填写无头服务的名称
  replicas: 1  #实例数,最好为3
  selector: 
    matchLabels: 
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            memory: "500Mi"
            cpu: "500m"
          limits:
            memory: "1000Mi"
            cpu: "1000m"
        ports:
        - containerPort: 9200
          name: elasticsearch
        env:
        - name: node.name
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: discovery.type
          value: zen
        - name: cluster.name
          value: elasticsearch
        - name: cluster.initial_master_nodes
          value: "elasticsearch-0"
        - name: discovery.zen.minimum_master_nodes
          value: "1"
        - name: discovery.seed_hosts
          value: "elasticsearch-0.elasticsearch-cluster"
        - name: network.host
          value: "0.0.0.0"
        - name: "http.cors.allow-origin"
          value: "*"
        - name: "http.cors.enabled"
          value: "true"
        - name: "number_of_shards"  #分片数
          value: "5"
        - name: "number_of_replicas"  #每个分片的副本数
          value: "1"
        - name: path.data
          value:  /usr/share/elasticsearch/data  #数据存储路径
        volumeMounts:                           
          - name: es-data                  
            mountPath: /usr/share/elasticsearch/data  #挂载数据目录
      initContainers:
      - name: fix-permissions
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:                           
          - name: es-data                  
            mountPath: /usr/share/elasticsearch/data  #挂载数据目录
​
      - name: increase-vm-max-map
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0
        imagePullPolicy: IfNotPresent
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      - name: increase-fd-ulimit
        image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0
        imagePullPolicy: IfNotPresent
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
      
  volumeClaimTemplates:                     #这步自动创建pvc,并挂载动态pv
    - metadata:
        name: es-data
      spec:
        accessModes: ["ReadWriteMany"]
        storageClassName: nfs-client  #存储类名称
        resources:
          requests:
            storage: 2Gi
​

2.5 部署所有资源

[root@master1 Elasticsearch]# ls
elasticsearch-service.yaml  elasticsearch-statefulset.yaml
[root@master1 Elasticsearch]# kubectl apply -f ./
service/elasticsearch-cluster created
service/elasticsearch created
statefulset.apps/elasticsearch created

2.6 检查Pod 状态

[root@master1 Elasticsearch]# kubectl get pod -n elk 
NAME              READY   STATUS    RESTARTS   AGE
elasticsearch-0   1/1     Running   0          45s
filebeat-6db9l    1/1     Running   0          87m
filebeat-qllxg    1/1     Running   0          87m
filebeat-r5hw7    1/1     Running   0          87m
kafka-0           1/1     Running   0          26m

网站公告

今日签到

点亮在社区的每一天
去签到