You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kubernetes集群部署Elasticsearch7.6.1如何正确配置禁用内存交换

具体修改方案

你直接修改现有Elasticsearch资源的YAML即可,配置会被ECK自动同步到所有Pod,重启不会丢失,需要调整两处核心配置:

  1. 给每个nodeSet的ES配置项开启内存锁
  2. 给ES容器赋予锁内存的系统权限,同时保证内存的requests和limits一致,让Pod的QoS等级为Guaranteed,避免K8s调度时触发交换。

完整修改示例(以default节点组为例,data节点组按相同规则修改即可):

- name: default
    count: 3
    config:
      node.master: true
      node.data: true
      node.ingest: true
      # 新增:开启ES内存锁,禁用交换
      bootstrap.memory_lock: true
    podTemplate:
      metadata:
        labels:
          type: elastic-master-node
      spec:
        nodeSelector:
          node-pool: <NODE_POOL>
        initContainers:
        - name: sysctl
          securityContext:
            privileged: true
          command: ['sh', '-c', 'sysctl -w vm.max_map_count=262144']
        containers:
        - name: elasticsearch
          resources:
            limits:
              memory: 11.2Gi
            requests:
              cpu: 3200m
              # 新增:内存请求和限制设为一致,保证Guaranteed QoS
              memory: 11.2Gi
          # 新增:配置安全上下文,允许ES容器持有内存锁
          securityContext:
            capabilities:
              add:
                - IPC_LOCK
            allowPrivilegeEscalation: true
          env:
          - name: ES_JAVA_OPTS
            value: "-Xms6g -Xmx6g"

可选补充(按需选择)

如果集群节点本身默认开启了交换,你也可以在initContainer中新增节点级关闭交换的操作(需要initContainer有更高特权,会影响节点上所有Pod):

initContainers:
- name: disable-swap
  securityContext:
    privileged: true
  command: ['sh', '-c', 'swapoff -a']
# 原有sysctl的initContainer保留即可

修改完成后重新apply这份YAML,ECK会自动滚动更新所有ES Pod,配置永久生效。


配置验证

集群更新完成后,执行以下命令验证配置是否生效:

kubectl port-forward svc/elastic-cluster-1-es-http 9200
# 另开终端执行
curl -u elastic:你的ES密码 "http://localhost:9200/_nodes?filter_path=**.mlockall"

返回结果中所有节点的mlockall字段为true,即说明内存锁配置成功,交换已被禁用。

内容的提问来源于stack exchange,提问作者Montoya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:24:03