Как отключить подкачку в Elasticsearch на Kubernetes?
Согласно официальным документам ES, отключение подкачки является одним из лучших способов повышения производительности, доступных Elasticsearch.
Тем не менее, это оказывается трудно настроить. Я провел несколько часов, исследуя и пытаясь различными способами отключить обмен, используя официальный образ ES-докера в Kubernetes.
При настройке bootstrap.memory_lock: true
в качестве переменной env образ не загружается с ошибкой: 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
с настройками, но это не удалось.
Каков рекомендуемый способ отключить подкачку при использовании официального образа es на k8s?
А вот соответствующие разделы моего ямля
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
limits.conf
elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited
elasticsearch hard nofile 65536
elasticsearch soft nofile 65536
2 ответа
Я думаю, что ulimits в моем yaml не были распознаны, поэтому я последовал этому посту и создал изображение с пользовательской точкой входа, которая устанавливает настройки.
Какой тип изображения вы используете? Если его ОС оптимизирована для контейнеров (cos), попробуйте переключиться на образы на основе Ubuntu