Kubernetes集群部署Elasticsearch7.6.1如何正确配置禁用内存交换
具体修改方案
你直接修改现有Elasticsearch资源的YAML即可,配置会被ECK自动同步到所有Pod,重启不会丢失,需要调整两处核心配置:
- 给每个nodeSet的ES配置项开启内存锁
- 给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
相关产品推荐
相关产品推荐

