Configure Elasticsearch JVM Options
The Elasticsearch offers users to configure the JVM settings by using jvm.options
file. The jvm.options
file located at the $ES_HOME/config
(ie. /usr/share/elasticsearch/config
) directory.
Deploy Elasticsearch with Custom jvm.options File
Before deploying the Elasticsearch instance, you need to create a k8s secret with the custom config files (here: jvm.options
).
apiVersion: v1
kind: Secret
metadata:
name: es-custom-config
namespace: demo
stringData:
jvm.options: |-
## G1GC Configuration
10-:-XX:+UseG1GC
10-13:-XX:-UseConcMarkSweepGC
10-13:-XX:-UseCMSInitiatingOccupancyOnly
10-:-XX:G1ReservePercent=25
10-:-XX:InitiatingHeapOccupancyPercent=30
## JVM temporary directory
-Djava.io.tmpdir=${ES_TMPDIR}
## heap dumps
# generate a heap dump when an allocation from the Java heap fails
# heap dumps are created in the working directory of the JVM
-XX:+HeapDumpOnOutOfMemoryError
# specify an alternative path for heap dumps; ensure the directory exists and
# has sufficient space
-XX:HeapDumpPath=data
# specify an alternative path for JVM fatal error logs
-XX:ErrorFile=logs/hs_err_pid%p.log
# JDK 9+ GC logging
9-:-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m
If you want to provide node-role specific settings, say you want to configure ingest nodes with a different setting than others in a topology cluster, add node role
as a prefix in the file name.
stringData:
ingest-jvm.options: |-
... ...
master-jvm.options: |-
... ...
... ...
Deploy the k8s secret:
kubectl apply -f https://github.com/kubedb/docs/raw/v2024.12.18/docs/guides/elasticsearch/configuration/jvm-options/yamls/custom-config.yaml
secret/es-custom-config created
Now Deploy the Elasticsearch Cluster with the custom jvm.options
file:
apiVersion: kubedb.com/v1
kind: Elasticsearch
metadata:
name: es-test
namespace: demo
spec:
# Make sure that you've mentioned the config secret name here
configSecret:
name: es-custom-config
enableSSL: false
version: opensearch-2.8.0
storageType: Durable
deletionPolicy: WipeOut
topology:
master:
suffix: master
replicas: 3
storage:
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
data:
suffix: data
replicas: 2
storage:
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
ingest:
suffix: ingest
replicas: 2
storage:
storageClassName: "standard"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Deploy Elasticsearch:
$ kubectl apply -f https://github.com/kubedb/docs/raw/v2024.12.18/docs/guides/elasticsearch/configuration/jvm-options/yamls/elasticsearch.yaml
elasticsearch/es-test created
Wait for the Elasticsearch to become ready:
$ kubectl get elasticsearch -n demo -w
NAME VERSION STATUS AGE
es-test opensearch-2.8.0 Provisioning 12s
es-test opensearch-2.8.0 Provisioning 2m2s
es-test opensearch-2.8.0 Ready 2m2s