跳转到内容

Elasticsearch on Kubernetes 运维面试题

8 道题
分类
Kubernetes
子分类
middleware-ops
题目数
8 道
已阅读 0 / 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对应底层资源管理功能
ElasticsearchStatefulSet + PVC + Service + Secret集群部署、扩缩容、快照
KibanaDeployment + Service + IngressUI 部署、版本关联
BeatDaemonSet / Deployment日志/指标采集
ApmServerDeployment + Service应用性能监控数据接入
LogstashStatefulSet + ConfigMapPipeline 管理
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_contentdata_hotdata_warmdata_colddata_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典型数量存储需求资源配置
Masterproduction-es-master310-50 GB SSD2C/4G
Data Hotproduction-es-data-hot3-12SSD / NVMe16C/64G +
Data Warmproduction-es-data-warm3-6HDD8C/32G
Ingestproduction-es-ingest2-4无持久存储4C/8G
Coordinatingproduction-es-coordinating2-4无持久存储2C/4G
8 ECK 的热温冷架构(Hot-Warm-Cold)与 Index Lifecycle Management

答案:

热温冷架构通过 ILM(Index Lifecycle Management)策略自动将索引数据从 Hot 节点迁移至 Warm 节点,最终迁移至 Cold 或 Frozen 节点,配合 ECK 的 node.rolesnode.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
阶段存储介质典型时间操作查询性能
HotNVMe / SSD0-3 天Rollover / 写入
WarmSSD / HDD3-30 天Force Merge / Shrink
ColdHDD + 对象存储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 / Import API 实现环境间迁移;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 的 emptyDir Volume,读取应用日志文件并发送至 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 类型运行模式采集目标输出
FilebeatDaemonSet容器日志、应用日志文件ES / Logstash / Kafka
MetricbeatDeploymentES JMX、K8s 指标、系统指标ES
AuditbeatDaemonSetLinux 审计日志、文件完整性ES
HeartbeatDeployment服务可用性探测ES
PacketbeatDaemonSet网络流量分析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_tokenapi_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 APIHTTP8200接收 Agent Trace / Metrics / Errors
RUM EndpointHTTP8200接收浏览器 RUM 数据
Tail SamplingTrace 级别保留策略
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 使用 Retain ReclaimPolicy,防止误删 PVC 导致数据丢失。
  • 配置 volumeClaimTemplatesstorageClassName 明确指定存储类型。
  • 开启 StorageClass allowVolumeExpansion 支持在线扩容。

资源限制

  • requests = limits(Guaranteed QoS),避免 CPU Throttling 与 OOM Kill。
  • Heap = 物理内存限制的 50%,上限 32GB(Compressed OOPs,>32GB 指针压缩失效)。
  • 设置 vm.max_map_count >= 262144(initContainer 或 securityContext.sysctls)。
  • 关闭 swapbootstrap.memory_lock: true)。

安全加固

  • 启用 TLS:HTTP(9200)+ Transport(9300)层双向 mTLS。
  • 内置用户密码轮换:elastickibana_systemlogstash_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% memCPU Throttle / OOM Kill
安全mTLS + RBAC + NetworkPolicy未授权访问、数据泄露
备份SLM 每日备份 + 30 天保留数据不可恢复
监控Prometheus + 告警规则故障未及时感知
容量Shard 10-50GB + ILM Rollover分片过大 / 分片爆炸