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.3.16/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/v1alpha2
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
  terminationPolicy: 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.3.16/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