K8S部署ELK(三):部署Elasticsearch搜索引擎
目录
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)写入流程
-
客户端发送文档到任意 Node。
-
Node 根据文档 ID 计算目标分片(默认
_id
哈希)。 -
数据写入主分片后,同步到副本分片。
-
返回写入成功响应。
(2)搜索流程
-
客户端发送查询请求到 Node。
-
Node 作为协调节点,将查询广播到所有相关分片。
-
各分片返回结果,协调节点合并后返回客户端。
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: elklabels:app: elasticsearch spec:ports:- port: 9200name: elasticsearchclusterIP: Noneselector:app: elasticsearch --- apiVersion: v1 kind: Service metadata:name: elasticsearch #service服务的名称,向外暴露端口namespace: elklabels:app: elasticsearch spec:ports:- port: 9200name: elasticsearchtype: NodePortselector:app: elasticsearch
2.4 创建statefulset
vim elasticsearch-statefulset.yaml
--- apiVersion: apps/v1 kind: StatefulSet metadata:name: elasticsearchnamespace: elk spec:serviceName: "elasticsearch-cluster" #填写无头服务的名称replicas: 1 #实例数,最好为3selector: matchLabels: app: elasticsearchtemplate:metadata:labels:app: elasticsearchspec:containers:- name: elasticsearchimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/elasticsearch:7.17.3imagePullPolicy: IfNotPresentresources:requests:memory: "500Mi"cpu: "500m"limits:memory: "1000Mi"cpu: "1000m"ports:- containerPort: 9200name: elasticsearchenv:- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name- name: discovery.typevalue: zen- name: cluster.namevalue: elasticsearch- name: cluster.initial_master_nodesvalue: "elasticsearch-0"- name: discovery.zen.minimum_master_nodesvalue: "1"- name: discovery.seed_hostsvalue: "elasticsearch-0.elasticsearch-cluster"- name: network.hostvalue: "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.datavalue: /usr/share/elasticsearch/data #数据存储路径volumeMounts: - name: es-data mountPath: /usr/share/elasticsearch/data #挂载数据目录initContainers:- name: fix-permissionsimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]securityContext:privileged: truevolumeMounts: - name: es-data mountPath: /usr/share/elasticsearch/data #挂载数据目录 - name: increase-vm-max-mapimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0imagePullPolicy: IfNotPresentcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true- name: increase-fd-ulimitimage: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/library/busybox:1.37.0imagePullPolicy: IfNotPresentcommand: ["sh", "-c", "ulimit -n 65536"]securityContext:privileged: truevolumeClaimTemplates: #这步自动创建pvc,并挂载动态pv- metadata:name: es-dataspec: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