Elasticsearch on Kubernetes 运维面试题
8 道题- 分类
- Kubernetes
- 子分类
- middleware-ops
- 题目数
- 8 道
6 ECK(Elastic Cloud on Kubernetes)Operator 架构与 CRD
答案:
ECK 是 Elastic 官方提供的 Kubernetes Operator,通过 CR 声明式管理 Elasticsearch、Kibana、APM Server、Beats、Logstash 等组件的全生命周期,覆盖部署、扩缩容、滚动升级与快照备份。
[分层展开]
- 架构组成:ECK Operator 以 Deployment 形式运行在 Kubernetes 集群中,监听 CR 变更并生成对应的 StatefulSet、Service、Secret、ConfigMap 等原生资源。
- 核心 CRD:
Elasticsearch:定义 ES 集群拓扑、节点池、存储、网络、安全策略。Kibana:定义 Kibana 实例配置与 ES 关联。ApmServer:定义 APM Server 实例与 ES 关联。Beat:定义 Filebeat / Metricbeat / Auditbeat 等 Agent 部署。Logstash:定义 Logstash Pipeline 配置与部署。ElasticMapsServer:定义 Maps Server(ES 8.x +)。EnterpriseSearch:定义 Enterprise Search 实例。
- 管理范围:支持管理多个 Namespace 中的资源,支持跨命名空间关联。
- 生命周期管理:自动处理证书轮换、滚动升级、节点缩容前的数据迁移、分片重平衡。
# ECK Operator 安装
kubectl create -f https://download.elastic.co/downloads/eck/2.16.1/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.16.1/operator.yaml
# ECK CRD 列表
kubectl api-resources --api-group elasticsearch.k8s.elastic.co
# NAME SHORTNAMES APIGROUP NAMESPACED KIND
# agents agent.k8s.elastic.co true Agent
# apmservers apm.k8s.elastic.co true ApmServer
# beats beat.k8s.elastic.co true Beat
# elasticsearches es elasticsearch.k8s.elastic.co true Elasticsearch
# enterprisesearches ents enterprisesearch.k8s.elastic.co true EnterpriseSearch
# kibanas kb kibana.k8s.elastic.co true Kibana
# logstashes ls logstash.k8s.elastic.co true Logstash
# elasticmapsservers ems maps.k8s.elastic.co true ElasticMapsServer
| CRD | 对应底层资源 | 管理功能 |
|---|---|---|
| Elasticsearch | StatefulSet + PVC + Service + Secret | 集群部署、扩缩容、快照 |
| Kibana | Deployment + Service + Ingress | UI 部署、版本关联 |
| Beat | DaemonSet / Deployment | 日志/指标采集 |
| ApmServer | Deployment + Service | 应用性能监控数据接入 |
| Logstash | StatefulSet + ConfigMap | Pipeline 管理 |
7 ECK 的 Elasticsearch 集群部署(Master / Data / Ingest / Coordinating 节点拓扑)
答案:
ECK 通过 nodeSets 定义多节点池拓扑,每个 nodeSet 独立配置角色(Master、Data、Ingest、ML)、副本数、存储和资源需求,Operator 自动生成对应的 StatefulSet。
[分层展开]
- Master-eligible 节点:负责集群状态管理、分片分配、索引创建与删除。配置
node.roles: ["master"]。生产建议 3 个专用 Master 节点。 - Data 节点:负责数据存储、CRUD、搜索与聚合。可按内容类型细分为
data_content、data_hot、data_warm、data_cold、data_frozen。 - Ingest 节点:执行 Ingest Pipeline 预处理(Grok、GeoIP、Date 解析等),在数据索引前完成 ETL 转换。
- Coordinating 节点:ES 7.x 后所有节点默认都是 Coordinating 节点(兼任),专用 Coordinating 节点需明确不分配 data/master/ingest/ml 角色,仅承担请求路由分发与结果聚合。
- ML 节点:运行机器学习 Job(异常检测、数据帧分析),需要
node.roles: ["ml"]。
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: production
spec:
version: 8.17.0
nodeSets:
# Master 专用节点池
- name: master
count: 3
config:
node.roles: ["master"]
node.store.allow_mmap: false
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "2Gi"
cpu: "2"
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10Gi
# Data Hot 节点池
- name: data-hot
count: 6
config:
node.roles: ["data_hot"]
node.attr.data: "hot"
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
requests:
memory: "16Gi"
cpu: "4"
limits:
memory: "16Gi"
cpu: "8"
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "ssd"
resources:
requests:
storage: 1Ti
# Ingest 节点池
- name: ingest
count: 2
config:
node.roles: ["ingest"]
podTemplate:
spec:
containers:
- name: elasticsearch
resources:
requests:
memory: "4Gi"
cpu: "2"
limits:
memory: "4Gi"
cpu: "4"
| 节点角色 | StatefulSet Name | 典型数量 | 存储需求 | 资源配置 |
|---|---|---|---|---|
| Master | production-es-master | 3 | 10-50 GB SSD | 2C/4G |
| Data Hot | production-es-data-hot | 3-12 | SSD / NVMe | 16C/64G + |
| Data Warm | production-es-data-warm | 3-6 | HDD | 8C/32G |
| Ingest | production-es-ingest | 2-4 | 无持久存储 | 4C/8G |
| Coordinating | production-es-coordinating | 2-4 | 无持久存储 | 2C/4G |
8 ECK 的热温冷架构(Hot-Warm-Cold)与 Index Lifecycle Management
答案:
热温冷架构通过 ILM(Index Lifecycle Management)策略自动将索引数据从 Hot 节点迁移至 Warm 节点,最终迁移至 Cold 或 Frozen 节点,配合 ECK 的 node.roles 与 node.attr 标签实现物理资源分层。
[分层展开]
- Hot 阶段:新索引优先分配到 Hot 节点(高速 SSD / NVMe),承载高频写入与查询,配置较高 CPU 与内存。
- Warm 阶段:索引不再写入且查询频率降低后迁移至 Warm 节点(HDD / 低速存储),可执行 Force Merge 减少 Segment 数量,Shrink 减少分片。
- Cold 阶段:查询极低频的数据迁移至 Cold 节点,可结合 Searchable Snapshot 将数据存储至对象存储(S3 / GCS / MinIO)。
- Frozen 阶段:极少访问的数据仅保留元数据,数据主体存于对象存储,查询时按需加载(ES 8.x Frozen Tier)。
- Delete 阶段:超过保留期限的索引自动删除。
- ECK 配置方式:通过
node.roles配置节点类型,通过node.attr.data设置温度属性,ILM Policy 依据此属性在各阶段分配索引。
// ILM Policy — Hot -> Warm -> Cold -> Delete
PUT _ilm/policy/logs-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "1d"
},
"set_priority": { "priority": 100 }
}
},
"warm": {
"min_age": "3d",
"actions": {
"allocate": {
"require": { "data": "warm" }
},
"forcemerge": { "max_num_segments": 1 },
"shrink": { "number_of_shards": 1 },
"set_priority": { "priority": 50 }
}
},
"cold": {
"min_age": "30d",
"actions": {
"allocate": {
"require": { "data": "cold" }
},
"searchable_snapshot": {
"snapshot_repository": "s3-backup"
},
"set_priority": { "priority": 0 }
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}
# ECK — 热温冷节点配置
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
spec:
nodeSets:
- name: hot
count: 3
config:
node.roles: ["data_hot"]
node.attr.data: "hot"
volumeClaimTemplates:
- spec:
storageClassName: "ssd"
resources:
requests:
storage: 500Gi
- name: warm
count: 3
config:
node.roles: ["data_warm"]
node.attr.data: "warm"
volumeClaimTemplates:
- spec:
storageClassName: "hdd"
resources:
requests:
storage: 2Ti
- name: cold
count: 2
config:
node.roles: ["data_cold"]
node.attr.data: "cold"
volumeClaimTemplates:
- spec:
storageClassName: "hdd"
resources:
requests:
storage: 5Ti
| 阶段 | 存储介质 | 典型时间 | 操作 | 查询性能 |
|---|---|---|---|---|
| Hot | NVMe / SSD | 0-3 天 | Rollover / 写入 | 高 |
| Warm | SSD / HDD | 3-30 天 | Force Merge / Shrink | 中 |
| Cold | HDD + 对象存储 | 30-90 天 | Searchable Snapshot | 低 |
| Frozen | 对象存储 | 90 天+ | 按需加载 | 极低 |
| Delete | — | > 保留期 | 索引删除 | — |
9 ECK 的 Kibana 部署与仪表板管理
答案:
ECK 通过 Kibana CR 声明式部署 Kibana 实例,自动关联 Elasticsearch 集群,配置 TLS 证书、Ingress 暴露与资源配置,支持多版本管理与 Saved Objects 导入导出。
[分层展开]
- 部署关联:Kibana CR 中
elasticsearchRef.name指向目标 Elasticsearch CR,Operator 自动注入 ES 连接地址与证书。 - 安全集成:Operator 自动生成 Kibana 与 ES 之间的双向 TLS 证书,并创建 Service Account Token 用于 Kibana 内部认证。
- Ingress 暴露:通过 Ingress 或 LoadBalancer Service 对外暴露 Kibana UI。
- Dashboard 管理:Kibana Dashboard 以 Saved Object 形式存储,通过
Export / ImportAPI 实现环境间迁移;ECK 8.x + 支持通过 Filebeat Sidecar 自动导入预定义 Dashboard。注意:跨大版本(如 7.x → 8.x)Saved Objects 可能不兼容,建议先做兼容性测试。 - 多实例部署:支持部署多个 Kibana 实例对接不同 ES 集群或不同用途(运维看板 / 业务看板)。
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: production
spec:
version: 8.17.0
count: 2
elasticsearchRef:
name: production
namespace: elastic-stack
config:
server.publicBaseUrl: https://kibana.example.com
xpack.fleet.agents.elasticsearch.hosts:
- https://production-es-http:9200
podTemplate:
spec:
containers:
- name: kibana
resources:
requests:
memory: 2Gi
cpu: 1
limits:
memory: 4Gi
cpu: 2
http:
tls:
selfSignedCertificate:
disabled: true
# Ingress 暴露
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kibana-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- kibana.example.com
secretName: kibana-tls
rules:
- host: kibana.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: production-kb-http
port:
number: 5601
# Dashboard 导入导出
# 导出
curl -X POST "https://kibana.example.com/api/saved_objects/_export" \
-H "kbn-xsrf: true" \
-H "Content-Type: application/json" \
-d '{ "type": "dashboard", "includeReferencesDeep": true }' \
-o dashboards.ndjson
# 导入
curl -X POST "https://kibana.example.com/api/saved_objects/_import?overwrite=true" \
-H "kbn-xsrf: true" \
--form file=@dashboards.ndjson
10 ECK 的 Beats(Filebeat / Metricbeat)Sidecar Agent 部署
答案:
ECK 通过 Beat CR 在 Kubernetes 集群中以 DaemonSet 或 Deployment 形式部署 Filebeat / Metricbeat,支持 Sidecar 模式随业务 Pod 一同运行,将日志与指标发送至 Elasticsearch 或 Logstash。
[分层展开]
- Filebeat Sidecar:与业务容器共享 Pod 的
emptyDirVolume,读取应用日志文件并发送至 ES,每个应用 Pod 一个 Filebeat 实例。 - Metricbeat Deployment:以 Deployment 运行,采集 ES 节点 JMX 指标、Kubernetes API Server 指标与节点系统指标。
- Beat CR 配置:
deployment.kibanaRef关联 Kibana 以导入预定义 Dashboard;config字段定义 Input / Output;daemonSet/deployment指定运行模式。 - 自动发现:Filebeat 支持 Kubernetes Autodiscover,基于 Pod Annotation 自动识别日志路径与格式。
- 输出目标:支持直接写入 Elasticsearch 或经 Logstash / Kafka 中转。
# Filebeat Sidecar — 采集应用日志
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
name: app-filebeat
spec:
type: filebeat
version: 8.17.0
elasticsearchRef:
name: production
config:
filebeat.inputs:
- type: container
paths:
- /var/log/containers/*.log
processors:
- add_kubernetes_metadata:
host: ${NODE_NAME}
matchers:
- logs_path:
logs_path: "/var/log/containers/"
output.elasticsearch:
hosts: ["${ECK_ES_HOSTS}"]
username: "${ECK_ES_USER}"
password: "${ECK_ES_PASSWORD}"
daemonSet:
podTemplate:
spec:
serviceAccountName: filebeat
containers:
- name: filebeat
securityContext:
runAsUser: 0
volumeMounts:
- name: varlog
mountPath: /var/log
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumes:
- name: varlog
hostPath:
path: /var/log
# Metricbeat — 采集 ES 集群指标
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
name: metricbeat
spec:
type: metricbeat
version: 8.17.0
elasticsearchRef:
name: production
kibanaRef:
name: production
config:
metricbeat.modules:
- module: elasticsearch
metricsets: ["node", "node_stats", "index", "cluster_stats"]
period: 10s
hosts: ["https://${ECK_ES_HOSTS}:9200"]
username: "${ECK_ES_USER}"
password: "${ECK_ES_PASSWORD}"
ssl.verification_mode: "certificate"
- module: kubernetes
metricsets: ["node", "system", "pod", "container", "volume"]
period: 10s
host: ${NODE_NAME}
output.elasticsearch:
hosts: ["https://${ECK_ES_HOSTS}:9200"]
username: "${ECK_ES_USER}"
password: "${ECK_ES_PASSWORD}"
deployment:
podTemplate:
spec:
serviceAccountName: metricbeat
| Beat 类型 | 运行模式 | 采集目标 | 输出 |
|---|---|---|---|
| Filebeat | DaemonSet | 容器日志、应用日志文件 | ES / Logstash / Kafka |
| Metricbeat | Deployment | ES JMX、K8s 指标、系统指标 | ES |
| Auditbeat | DaemonSet | Linux 审计日志、文件完整性 | ES |
| Heartbeat | Deployment | 服务可用性探测 | ES |
| Packetbeat | DaemonSet | 网络流量分析 | ES |
11 ECK 的 APM Server 部署
答案:
ECK 通过 ApmServer CR 声明式部署 APM Server,自动关联 Elasticsearch 集群并注入证书,应用无需额外配置即可通过 APM Agent 将 Trace、Metrics 与 Errors 数据发送至 ES。
[分层展开]
- APM Server 架构:接收来自应用 APM Agent(Java、Go、Python、Node.js 等)的 OTLP / Intake API 数据,经校验、采样、预聚合后写入 Elasticsearch 的特定 Data Stream。
- Secret Token / API Key 认证:APM Server 验证 Agent 请求,Auth 策略包括
secret_token与api_key。 - RUM(Real User Monitoring):前端 RUM Agent 通过独立
/intake/v2/rum/events端点发送浏览器端性能数据,需配置 CORS 与 Source Map。 - Tail-based Sampling:APM Server 8.x 支持基于尾部采样的分布式追踪,在完整 Trace 级别决定采样策略,保证慢请求与错误 Trace 完整留存。
- Fleet 管理模式:ECK 9.x 推荐通过 Fleet Server 集中管理 Elastic Agent,APM Server 以 Elastic Agent Integration 形式运行。
apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
name: production
spec:
version: 8.17.0
count: 3
elasticsearchRef:
name: production
kibanaRef:
name: production
config:
apm-server:
host: "0.0.0.0:8200"
secret_token: "${APM_SECRET_TOKEN}"
rum:
enabled: true
allow_origins: ["https://app.example.com"]
source_mapping:
cache.expiration: 5m
index_pattern: "apm-*-sourcemap*"
sampling:
tail:
enabled: true
interval: 1m
policies:
- sample_rate: 0.1
- sample_rate: 1.0
trace.name: "checkout"
http:
tls:
selfSignedCertificate:
disabled: true
podTemplate:
spec:
containers:
- name: apm-server
resources:
requests:
memory: 512Mi
cpu: 500m
limits:
memory: 1Gi
cpu: 1
// Java APM Agent 配置示例
// -javaagent:elastic-apm-agent.jar \
// -Delastic.apm.server_url=https://apm.example.com \
// -Delastic.apm.secret_token=${APM_SECRET_TOKEN} \
// -Delastic.apm.service_name=order-service \
// -Delastic.apm.environment=production \
// -Delastic.apm.application_packages=com.example.order
| APM 组件 | 协议 | 默认端口 | 作用 |
|---|---|---|---|
| Intake API | HTTP | 8200 | 接收 Agent Trace / Metrics / Errors |
| RUM Endpoint | HTTP | 8200 | 接收浏览器 RUM 数据 |
| Tail Sampling | — | — | Trace 级别保留策略 |
12 ECK 的 Elastic Stack 统一部署与关联
答案:
ECK 通过多个 CR 的 ref 字段建立组件间关联关系,Operator 自动注入连接地址、证书与认证凭据,实现 Elastic Stack 全链路一站式部署。
[分层展开]
- 关联模型:Elasticsearch 作为核心存储,Kibana、APM Server、Beat、Logstash、Enterprise Search 等组件通过
elasticsearchRef引用 ESS CR。 - 服务发现:
Service命名规范为<elasticsearch-name>-es-http(HTTP)与<elasticsearch-name>-es-transport(Transport),各组件自动通过此 Service 连接。 - 证书管理:Operator 为每个关联组件自动签发客户端证书,结合
.spec.elasticsearchRef.secretName指定的 Secret 进行 mTLS 认证。 - 版本兼容:ECK 自动校验组件版本兼容性,阻止不匹配版本的关联。
- 多集群关联:支持跨 Namespace 的
elasticsearchRef.namespace引用。
graph TD
ES[Elasticsearch CR
production] -->|elasticsearchRef| KB[Kibana CR
production]
ES -->|elasticsearchRef| APM[ApmServer CR
production]
ES -->|elasticsearchRef| BEAT[Beat CR
filebeat / metricbeat]
APM -->|kibanaRef| KB
BEAT -->|kibanaRef| KB
# 完整 Elastic Stack 部署示例
# Elasticsearch
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: production
namespace: elastic-stack
spec:
version: 8.17.0
nodeSets:
- name: default
count: 3
config:
node.store.allow_mmap: false
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
resources:
requests:
storage: 200Gi
# Kibana
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: production
namespace: elastic-stack
spec:
version: 8.17.0
count: 1
elasticsearchRef:
name: production
# APM Server
apiVersion: apm.k8s.elastic.co/v1
kind: ApmServer
metadata:
name: production
namespace: elastic-stack
spec:
version: 8.17.0
count: 2
elasticsearchRef:
name: production
# Filebeat DaemonSet
apiVersion: beat.k8s.elastic.co/v1beta1
kind: Beat
metadata:
name: filebeat
namespace: elastic-stack
spec:
type: filebeat
version: 8.17.0
elasticsearchRef:
name: production
kibanaRef:
name: production
config:
filebeat.inputs:
- type: container
paths: ["/var/log/containers/*.log"]
output.elasticsearch:
hosts: ["https://${ECK_ES_HOSTS}:9200"]
daemonSet: {}
30 Elasticsearch on Kubernetes 生产环境最佳实践
答案:
ES on Kubernetes 生产部署需覆盖节点规划、存储选型、资源配置、安全策略、备份恢复、监控告警与容量管理七个维度,核心原则为专用节点角色、SSD 存储、JVM Heap 约束、TLS 加密、RBAC 最小权限与自动化备份。
[分层展开]
节点规划
- Master 节点专用化:3 个 Master-eligible 节点,禁用 Data / Ingest / ML 角色。
- Data 节点按温度分层:Hot(SSD / NVMe)、Warm(SSD / HDD)、Cold(HDD + 对象存储)。
- 专用 Ingest 节点:CPU 密集型 Pipeline 迁移至 Ingest 节点,释放 Data 节点算力。
- 每个 AZ 至少 1 个 Master-eligible 节点。
存储配置
- Data 节点使用 SSD(Hot 层建议 NVMe),Warm / Cold 可用 HDD。
- PV 使用
RetainReclaimPolicy,防止误删 PVC 导致数据丢失。 - 配置
volumeClaimTemplates的storageClassName明确指定存储类型。 - 开启 StorageClass
allowVolumeExpansion支持在线扩容。
资源限制
requests=limits(Guaranteed QoS),避免 CPU Throttling 与 OOM Kill。- Heap = 物理内存限制的 50%,上限 32GB(Compressed OOPs,>32GB 指针压缩失效)。
- 设置
vm.max_map_count >= 262144(initContainer 或securityContext.sysctls)。 - 关闭
swap(bootstrap.memory_lock: true)。
安全加固
- 启用 TLS:HTTP(9200)+ Transport(9300)层双向 mTLS。
- 内置用户密码轮换:
elastic、kibana_system、logstash_system等。 - RBAC 最小权限:Data、Ingest、ML、Monitor 角色分离。
- NetworkPolicy 限制 Pod 间通信范围。
- Audit Log 启用并输出至独立索引。
备份恢复
- Snapshot Repository 配置 S3 / GCS(避免 FS 类型)。
- SLM Policy 每日自动备份,保留策略 ≥ 30 天。
- 定期执行恢复演练验证备份完整性。
监控告警
- Prometheus Exporter + Grafana Dashboard 实时监控。
- 核心告警:Cluster Red、Unassigned Shards、Heap > 85%、Disk > 85%、Thread Pool Rejections。
- Slow Log(Query / Index):捕获慢查询与慢写入阈值 ≥ 5s。
容量管理
- 单个 Shard 大小 10-50GB,总 Shard 数 ≤
节点数 × 20。 - ILM 自动 Rollover(
max_primary_shard_size: 50GB)防止单分片过大。 - ILM Cold / Delete 阶段自动清理数据,避免磁盘满。
- 定期 Review Index Pattern 与 Field Mapping。
# 完整生产环境配置示例
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: production
namespace: elastic-stack
spec:
version: 8.17.0
updateStrategy:
changeBudget:
maxUnavailable: 1
# Master 节点池
nodeSets:
- name: master
count: 3
config:
node.roles: ["master"]
node.store.allow_mmap: false
xpack.security.authc.accept_default_password: false
podTemplate:
spec:
initContainers:
- name: sysctl
securityContext:
privileged: true
command:
- sysctl
- -w
- vm.max_map_count=262144
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: "-Xms2g -Xmx2g"
resources:
requests:
memory: 4Gi
cpu: 1
limits:
memory: 4Gi
cpu: 2
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 20Gi
# Data Hot 节点池
- name: data-hot
count: 6
config:
node.roles: ["data_hot", "data_content"]
node.attr.data: "hot"
node.store.allow_mmap: false
# 慢查询日志
index.search.slowlog.threshold.query.warn: 5s
index.search.slowlog.threshold.query.info: 2s
index.indexing.slowlog.threshold.index.warn: 5s
podTemplate:
spec:
initContainers:
- name: sysctl
securityContext:
privileged: true
command: ["sysctl", "-w", "vm.max_map_count=262144"]
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: "-Xms16g -Xmx16g"
resources:
requests:
memory: 32Gi
cpu: 8
limits:
memory: 32Gi
cpu: 8
readinessProbe:
exec:
command:
- bash
- -c
- |
curl -s -k -u "elastic:${ELASTIC_PASSWORD}" https://localhost:9200/_cluster/health?local=true | grep -q '"status":"green"'
initialDelaySeconds: 120
periodSeconds: 30
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "ssd"
resources:
requests:
storage: 1Ti
# Ingest 节点池
- name: ingest
count: 2
config:
node.roles: ["ingest"]
podTemplate:
spec:
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: "-Xms4g -Xmx4g"
resources:
requests:
memory: 8Gi
cpu: 2
limits:
memory: 8Gi
cpu: 4
# TLS 安全配置
http:
tls:
selfSignedCertificate:
disabled: true
certificate:
secretName: es-http-tls
transport:
tls:
certificate:
secretName: es-transport-tls
# 监控集成
monitoring:
metrics:
elasticsearchRefs:
- name: production
logs:
elasticsearchRefs:
- name: production
# Network Policy — 限制 ES Pod 通信范围
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: es-network-policy
namespace: elastic-stack
spec:
podSelector:
matchLabels:
elasticsearch.k8s.elastic.co/cluster-name: production
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector: {}
- namespaceSelector:
matchLabels:
name: monitoring
ports:
- protocol: TCP
port: 9200
- protocol: TCP
port: 9300
egress:
- to:
- podSelector:
matchLabels:
elasticsearch.k8s.elastic.co/cluster-name: production
ports:
- protocol: TCP
port: 9300
| 维度 | 关键实践 | 风险规避 |
|---|---|---|
| 节点规划 | Master / Data / Ingest 专用化 | 角色混合导致资源争抢 |
| 存储 | SSD + Retain PVC + allowVolumeExpansion | 磁盘 I/O 瓶颈、误删数据 |
| 资源 | Guaranteed QoS + Heap = 50% mem | CPU Throttle / OOM Kill |
| 安全 | mTLS + RBAC + NetworkPolicy | 未授权访问、数据泄露 |
| 备份 | SLM 每日备份 + 30 天保留 | 数据不可恢复 |
| 监控 | Prometheus + 告警规则 | 故障未及时感知 |
| 容量 | Shard 10-50GB + ILM Rollover | 分片过大 / 分片爆炸 |