elasticsearch - 如何在 Kubernetes 上禁用 Elasticsearch 中的交换?
问题描述
根据官方 es 文档,禁用交换是 Elasticsearch 可用的最佳性能提升之一。
但是,事实证明它很难配置。我花了几个小时研究并尝试使用 Kubernetes 上的官方 ES docker 映像禁用交换的不同方法。
当设置bootstrap.memory_lock: true
为环境变量时,图像无法启动并出现错误:Unable to lock JVM Memory: error=12, reason=Cannot allocate memory. This can result in part of the JVM being swapped out. Increase RLIMIT_MEMLOCK, soft limit: 65536, hard limit: 65536
. 正如文档指出的那样,这是意料之中的。我什/etc/security/limits.conf
至用设置安装了一个自定义,但这失败了。
在 k8s 上使用官方 es 镜像时,禁用交换的推荐方法是什么?
而且,这里是我的 yaml 的相关部分
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: elastic-data
spec:
serviceName: elastic-data
replicas: 1
template:
spec:
securityContext:
runAsUser: 0
fsGroup: 0
containers:
- name: elastic-data
image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.0
env:
- name: ES_JAVA_OPTS
value: "-Xms2g -Xmx2g"
- name: cluster.name
value: "elastic-devs"
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: discovery.zen.ping.unicast.hosts
value: "elastic-master.default.svc.cluster.local"
- name: node.master
value: "false"
- name: node.ingest
value: "false"
- name: node.data
value: "true"
- name: network.host
value: "0.0.0.0"
- name: path.data
value: /usr/share/elasticsearch/data
- name: indices.memory.index_buffer_size
value: "512MB"
- name: bootstrap.memory_lock
value: "true"
resources:
requests:
memory: "3Gi"
limits:
memory: "3Gi"
ports:
- containerPort: 9300
name: transport
- containerPort: 9200
name: http
volumeMounts:
- name: data-volume
mountPath: /usr/share/elasticsearch/data
- name: swappiness-config
mountPath: /etc/security/limits.conf
subPath: limits.conf
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-es
- name: swappiness-config
configMap:
name: swappiness-config
items:
- key: limits.conf
path: limits.conf
限制.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536
解决方案
我认为,我的 yaml 中的 ulimit 没有被识别,所以我关注了这篇文章并创建了一个带有自定义入口点的图像来设置设置。
推荐阅读
- lora - Lora 双工发送但收不到应答
- docker - 将日志轮换添加到现有容器而不重新创建
- python - 如何自动从另一个 List 的元素在 python 中创建列表
- go - 无法从 github 获取 gorose 2.0
- mysql - 无法在 MacBook Air 中的 mySQL 上运行模式
- javascript - 为什么 React 不显示来自组件的内容?
- javascript - 未捕获的 ReferenceError:在 __webpack_require__ 的 Object.babel-polyfill 中未定义 require
- github - 如何在 Github 中自动将一个分支合并到另一个分支中?
- require - 在 Nashorn JavaScript 引擎中,如何从文件系统中读取文件?
- python - python - 在主 x 轴旁边制作一个附加(寄生轴)