Appendix A: Configuring the Helm chart

Amanda Jennewein
Amanda Jennewein
  • Updated

Use the following topics to configure the Helm chart.

BEST PRACTICE: To help you configure the Helm chart, use the examples for basic and HA values available in this GitHub repository.

If you have an existing KOTS stack and you want to copy some of its settings, see Appendix C: Mapping KOTS configuration to Helm values.

Configure custom memory settings for OpenSearch

Use the following information to configure custom memory settings for OpenSearch.

OS/NODE METHOD (PREFERRED)

Refer to Prepare custom memory settings for OpenSearch in Preparing your environment

INIT CONTAINERS METHOD (OPTIONAL)

Our chart optionally sets and checks the memory setting at pod startup. If your cluster forbids privileged pods, you must use the OS/node method.

Init containers available:

  • Checker — Always runs. Verifies the node’s vm.max_map_count is at least the required value. If not, the pod fails to start.
  • Setter — Privileged. Only runs when explicitly enabled. It attempts to raise the value on the node before OpenSearch starts.

To enable the Setter initContainer, add the following to your values.yaml file:

core:
  search:
    opensearch:
      application:
        virtualMemory:
          autoSet: true

AVAILABLE RELATED PARAMETERS

Parameter Description Default
core.search.opensearch.application.virtualMemory.autoSet If true, run a privileged initContainer to set vm.max_map_count. false
core.search.opensearch.application.virtualMemory.maxMapCount Desired vm.max_map_count value. Must be at least 262144. Higher values are accepted. 262144
core.search.opensearch.application.virtualMemory.timeoutSeconds Seconds the checker container waits before failing. 60

Configure container image registry

Parameter Description Example
global.repo.host Container registry for images. registry.jamasoftware.net/docker
global.repo.secrets List of imagePullSecrets names within the same namespace to use for pulling images. jama-registry-creds

Configure ingress

Parameter Description Default Example
global.url.domain Host name used as the base URL of Jama Connect. Make sure this domain name is routable on your network. If you change this host name later, make sure to also change the base URL through the Jama Connect system admin (root user). example.org
global.url.httpPort Http port that will be used as part of the base URL of Jama Connect. Only used when global.url.secure is false. If you change this port later, make sure to also change the base URL through the Jama Connect system admin (root user). 80
global.url.httpsPort Https port that will be used as part of the base URL of Jama Connect. Only used when global.url.secure is true. If you change this port later, make sure to also change the base URL through the Jama Connect system admin (root user). 443
global.url.secure Specifies if the base URL of Jama Connect will be accessed through a secure protocol (https). true
ingress.className Class name of the ingress controller to use. If empty, default ingress class for the cluster is used.
ingress.annotations Map of annotations for the ingress resource.

CONFIGURE TLS FOR INGRESS

When you set global.url.secure to true, you can enable TLS termination at the ingress resource level. You can bring your own certificate, let the chart generate a self-signed one, or reuse an existing Kubernetes TLS secret.

To do so, use the following parameters. The Priority column indicates the order in which the parameters are considered.

Parameter Description Priority Default
ingress.tls.secretName Name of an existing kubernetes.io/tls secret to use. 1
ingress.tls.cert PEM-encoded certificate to store in the TLS secret. Must match ingress.tls.key. 2
ingress.tls.key PEM-encoded private key that matches ingress.tls.cert. 2
ingress.tls.generateSelfSigned If true, generate a self-signed certificate when no TLS secret exists yet. 3 false

On installation and upgrade:

  • Custom certificate — If you set ingress.tls.cert and ingress.tls.key, the chart always creates or updates the TLS secret with these values, even if a secret already exists. To renew/rotate your certificate, simply update these values and run Helm upgrade.
  • Self-signed certificate — If ingress.tls.generateSelfSigned: true, and there is no TLS secret yet; the chart generates a self-signed certificate for global.url.domain and stores it in the TLS secret. If the TLS secret already exists, the existing certificate is reused, and no new one is generated. To force a new self-signed certificate, delete the existing TLS secret (or change to a custom cert/key) and run Helm upgrade.
  • Reuse an existing TLS secret — If you specify ingress.tls.secretName (or there is already a TLS secret with the chart’s configured name) and you do not set ingress.tls.cert/ingress.tls.key, the chart uses that secret name in our ingress. This is useful when the certificate is managed externally.
  • No TLS secret — If no certificate is provided, generateSelfSigned is false, and no matching TLS secret exists, the chart does not create a TLS secret.

To see the TLS secret names, if any, used by the ingress resources in a namespace, run:

kubectl get ingress -n <namespace> -o jsonpath='{.items[*].spec.tls[*].
secretName}{"\\n"}'

If this command returns nothing, no ingress in that namespace is currently configured with TLS.

OPTIONAL INGRESS CONFIGURATION

If your ingress controller requires it, you can configure the service resources used by the ingress resource:

Parameter Description Default Example
core.service.type Type of the core service resource. ClusterIP NodePort
core.service.annotations Map of annotations for the core service resource. alb.ingress.kubernetes.io/healthcheck-path: /
core.diff.service.type Type of the diff service resource. ClusterIP NodePort
core.diff.service.annotations Map of annotations for the diff service resource. alb.ingress.kubernetes.io/healthcheck-path: /health
core.saml.service.type Type of the SAML service resource. ClusterIP NodePort
core.saml.service.annotations Map of annotations for the SAML service resource. alb.ingress.kubernetes.io/healthcheck-path: /health

Additionally, we bundle a Traefik ingress controller inside our chart. To use it, see Traefik ingress controller.

Configure persistent storage

Parameter Description Default
global.storageClass Name of the storage class to use when creating persistent volume claims. If empty, default storage class for the cluster is used.
core.application.storage.sharedVolume.storageClass Name of the storage class for the assets volume. If empty, fallbacks to global.storageClass.
core.application.storage.sharedVolume.request Size for the assets volume. Examples of assets that Connect saves: attachments, avatars, reports, backups, etc. 7 Gi
core.application.storage.sharedVolume.accessMode Access mode for the assets volume. If planning to enable horizontal scaling of core pods across multiple nodes, set this to ReadWriteMany. ReadWriteOnce
core.activemq.application.storage.accessMode Access mode for ActiveMQ's persistent volumes. If high availability is desired for ActiveMQ, set this to ReadWriteMany. ReadWriteOnce
core.activemq.application.storage.request Size for each volume associated to an ActiveMQ pod.
core.search.opensearch.application.storage.request Size for each volume associated with an OpenSearch pod. 10 Gi

Configure database

Parameter Description Default Example
global.database.type Database type/vendor. 
Possible values: 
mysql
mssql
mysql
global.database.host Database host. db.example.com
global.database.port Database port. "3306" for mysql
"1433" for mssql
global.database.schema Database schema. jama
global.database.connectionParameters Database connection parameters.
global.database.driver Database driver. 
Possible values are: 
com.mysql.jdbc.Driver
net.sourceforge.jtds.jdbc.Driver
com.microsoft.sqlserver.jdbc.SQLServerDriver (don’t use unless specifically instructed)
com.mysql.jdbc.Driver for mysql
net.sourceforge.jtds.jdbc.Driver for mssql
core.application.database.connect.username Database username. jamauser
core.application.database.connect.password Database password.
core.oauth.application.database.schema OAuth database schema. oauth
core.oauth.application.database.username OAuth database username. oauthuser
core.oauth.application.database.password OAuth database password.
core.oauth.application.database.connectionParameters OAuth database connection parameters. Only used when using mysql.
core.saml.application.database.schema SAML database schema. saml
core.saml.application.database.username SAML database username. samluser
core.saml.application.database.password SAML database password.
core.saml.application.database.connectionParameters SAML database connection parameters. Only used when using mysql.

Configure license

Parameter Description
core.tenant-manager.application.license Jama Connect license

Optional configuration

Use the information in the following topics to configure your environment optionally.

Trusted certificates

You can use a PEM-formatted file containing any certificates that Jama Connect needs to trust. The file might contain a concatenation of multiple PEM-formatted certificates to trust. For example, you might need this functionality to make an encrypted connection from Jama Connect to your database if the database is protected with a self-signed certificate.

Parameter Description
core.secrets.trustedCertificates.data Content of the PEM file.

When a TLS certificate is available for ingress (see Configure TLS for ingress), the chart:

  • Creates a dedicated secret for trusted certificates
  • Stores the concatenation of:
    • Any PEM content provided in core.secrets.trustedCertificates.data
    • The ingress TLS certificate

This allows Jama Connect to trust both your own custom CAs or intermediate certificates and the same certificate that is used for HTTPS at ingress.

Horizontal scaling of core pods

Enable horizontal scaling of core pods to deploy specialized core pods instead of a single one.

Before enabling this feature, consider the following:

  • If this is the first time you are installing Jama Connect in the cluster, DO NOT enable this feature. Once Jama Connect is installed and working properly, you can enable horizontal scaling safely. If you are restoring a backup, restore it without horizontal scaling enabled.
  • You must provide a new database schema and user for Quartz to use.
  • You can configure the number of replicas for each role. Once you have increased the number of replicas, DO NOT decrease it.
Parameter Description Default
global.core.enableHorizontalScaling Enables horizontal scaling of core pods false
core.replicaCounts.ingress Number of core ingress pods. 1
core.replicaCounts.jobs Number of core jobs pods. 1
core.replicaCounts.reports Number of core reports pods. 1
core.topologySpreadConstraints.maxSkew Describes the degree to which core pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with a core pod if it doesn't satisfy the spread constraint. DoNotSchedule
core.application.database.quartz.schema Quartz database schema. quartz
core.application.database.quartz.username Quartz database username. quartzuser
core.application.database.quartz.password Quartz database password.

Traefik ingress controller

This table shows the main parameters that you can pass. For a full list, see the official Traefik documentation.

Parameter Description Default Example
traefik.enabled Specifies if the bundled Traefik ingress controller should be deployed. If true, our ingress resource is auto-configured to use it. false
global.url.useTraefikNodePorts If true, the Traefik ingress controller overrides the http and https ports defined in global.url. true
traefik.image.registry Registry host to pull Traefik images from. docker.io
traefik.deployment.kind Kind of resource. DaemonSet Deployment
traefik.service.type Type of the Traefik service resource. NodePort
traefik.ports.web.nodePort HTTP port number. This overrides the value set for global.url.httpPort when traefik.service.type is set to NodePort and global.url.useTraefikNodePorts is true. 80
traefik.ports.websecure.nodePort HTTPS port number. This overrides the value set for global.url.httpPort when traefik.service.type is set to NodePort and global.url.useTraefikNodePorts is true. 443
traefik.resources.limits.cpu Max CPU for each Traefik pod. 1000 m
traefik.resources.limits.memory Max memory for each Traefik pod. 512 Mi

Memory and CPU settings

In memory values, you MUST use a literal size, such as 2 G or 1000 M or 2000000 k, although sensible defaults are given. It is unlikely that you need to override them.

In CPU values, 1000 m is equal to one core.

In case of any doubt, don’t make any changes and contact Support.

Parameter Description Default
core.resources.limits.cpu Max CPU for each core pod 4000 m
core.resources.limits.memory Max memory for each core pod 12 G
core.application.env.MAX_HEAP Max memory for each core container 8 G
core.activemq.resources.limits.cpu Max CPU for the activemq pod 1000 m
core.activemq.resources.limits.memory Max memory for the activemq pod 1 G
core.activemq.application.java.xmx Max memory for the activemq container 700M
core.diff.resources.limits.cpu Max CPU for the diff pod 1000 m
core.diff.resources.limits.memory Max memory for the diff pod 512 M
core.diff.application.env.MAX_HEAP Max memory for the diff container 512 M
core.hazelcast.resources.limits.cpu Max CPU for the Hazelcast pod 1000 m
core.hazelcast.resources.limits.memory Max memory for the Hazelcast pod 7 G
core.hazelcast.application.env.MAX_HEAP Max memory for the Hazelcast container 6 G
core.oauth.resources.limits.cpu Max CPU for the oauth pod 1000 m
core.oauth.resources.limits.memory Max memory for the oauth pod 1 G
core.oauth.application.env.MAX_HEAP Max memory for the oauth container 1 G
core.saml.resources.limits.cpu Max CPU for the saml pod 1000 m
core.saml.resources.limits.memory Max memory for the saml pod 1 G
core.saml.application.env.MAX_HEAP Max memory for the saml container 1 G
core.search.resources.limits.cpu Max CPU for the search pod 2000 m
core.search.resources.limits.memory Max memory for the search pod 3 G
core.search.application.env.MAX_HEAP Max memory for the search container 2 G
core.search.opensearch.resources.limits.cpu Max CPU for the OpenSearch pod 2000 m
core.search.opensearch.resources.limits.memory Max memory for the OpenSearch pod 5 G
core.search.opensearch.application.env.MAX_HEAP Max memory for the OpenSearch container 4 G

Wiris

Use these settings to configure a custom connection to your own Wiris instance. In case of any doubt, don’t make any changes and contact Jama Support.

Parameter Description Default
core.application.env.WIRIS_CUSTOM_CONFIG_ENABLED Enables custom Wiris connection false
core.application.env.WIRIS_HOST Wiris host
core.application.env.WIRIS_PATH Wiris path /client/editor/render
core.application.env.WIRIS_PORT Wiris port
core.application.env.WIRIS_PROTOCOL Wiris protocol https
core.application.env.WIRIS_PROXY_ENABLED Use proxy for Wiris false
core.secrets.wirisProxy.username Wiris proxy user
core.secrets.wirisProxy.password Wiris proxy password

OpenSearch cluster

The properties that control settings to enable multiple OpenSearch pods are:

Parameter Description Default
core.search.opensearch.replicaCount Number of pods for the OpenSearch component 1
core.search.opensearch.topologySpreadConstraints.maxSkew Describes the degree to which OpenSearch pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.search.opensearch.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.search.opensearch.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with an OpenSearch pod if it doesn't satisfy the spread constraint. DoNotSchedule

High Availability

To enable HA mode for Jama Connect, you must create a Kubernetes cluster with nodes in different availability zones and set a storage class that supports RWX for the tenant assets. See Configure persistent storage.

Besides that, you must configure the HA properties for each Jama Connect component:

HA SETTINGS FOR TRAEFIK INGRESS CONTROLLER

When using Traefik ingress controller (traefik.enabled set to true) in high availability mode, you must:

  1. Set up a load balancer that forwards requests to the Kubernetes nodes using the ports defined for Traefik in Traefik ingress controller. If your load balancer handles TLS termination, you can disable TLS termination at ingress level by leaving ingress.tls.cert and ingress.tls.key empty.
  2. Set the following properties:
Parameter Description Default
global.url.useTraefikNodePorts This must be set to false, to avoid overriding the http and https ports defined in global.url. true
traefik.ports.web.forwardedHeaders.insecure This must be set to true, so that Traefik passes the incoming X-Forwarded-* headers to upstreams. false
traefik.ports.websecure.forwardedHeaders.insecure This must be set to true, so that Traefik passes the incoming X-Forwarded-* headers to upstreams. false

HA SETTINGS FOR OPENSEARCH

The properties that control HA settings for OpenSearch pods are detailed in the OpenSearch cluster.

HA SETTINGS FOR ACTIVEMQ

ActiveMQ uses a shared-store HA model in this chart. That means it supports only:

  • core.activemq.replicaCount: 1 for standalone mode.
  • core.activemq.replicaCount: 2 for HA mode (1 live broker + 1 backup broker).

IMPORTANT: Only values 1 and 2 are supported for ActiveMQ HA in this chart.

The properties that control HA settings for activemq components are:

Parameter Description Default
core.activemq.replicaCount Number of pods for the activemq component. Set to 1 for standalone mode or 2 for HA mode. In HA mode, both brokers share the same data store, but only one broker is active at a time. The second broker remains in standby and takes over if the active broker fails. 1
core.activemq.topologySpreadConstraints.maxSkew Describes the degree to which activemq pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.activemq.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.activemq.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with an activemq pod if it doesn't satisfy the spread constraint. DoNotSchedule
core.activemq.application.storage.class The storage class to use for ActiveMQ persistent data. For HA, you must provide a storage class that can provision persistent volumes with ReadWriteMany access mode so that the shared broker data is accessible across availability zones. ''

HA SETTINGS FOR DIFF

The properties that control HA settings for diff components are:

Parameter Description Default
core.diff.replicaCount Number of pods for diff component. To enable HA mode, this should be set to an odd number, usually 3. 1
core.diff.topologySpreadConstraints.maxSkew Describes the degree to which diff pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.diff.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.diff.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with a diff pod if it doesn't satisfy the spread constraint. DoNotSchedule

HA SETTINGS FOR HAZELCAST

The properties that control HA settings for Hazelcast components are:

Parameter Description Default
core.hazelcast.replicaCount Number of pods for Hazelcast component. To enable HA mode, this should be set to an odd number, usually 3. 1
core.hazelcast.topologySpreadConstraints.maxSkew Describes the degree to which Hazelcast pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.hazelcast.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.hazelcast.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with a Hazelcast pod if it doesn't satisfy the spread constraint. DoNotSchedule

HA SETTINGS FOR OAUTH

The properties that control HA settings for oauth components are:

Parameter Description Default
core.oauth.replicaCount Number of pods for oauth component. To enable HA mode, this should be set to an odd number, usually 3. 1
core.oauth.topologySpreadConstraints.maxSkew Describes the degree to which oauth pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.oauth.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.oauth.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with an oauth pod if it doesn't satisfy the spread constraint. DoNotSchedule

HA SETTINGS FOR SAML

The properties that control HA settings for saml components are:

Parameter Description Default
core.saml.replicaCount Number of pods for saml component. To enable HA mode, this should be set to an odd number, usually 3. 1
core.saml.topologySpreadConstraints.maxSkew Describes the degree to which saml pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.saml.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.saml.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with a saml pod if it doesn't satisfy the spread constraint. DoNotSchedule

HA SETTINGS FOR SEARCH

The properties that control HA settings for search components are:

Parameter Description Default
core.search.replicaCount Number of pods for search component. To enable HA mode, this should be set to an odd number, usually 3. 1
core.search.topologySpreadConstraints.maxSkew Describes the degree to which search pods might be unevenly distributed. You must specify this field, and the number must be greater than zero. 1
core.search.topologySpreadConstraints.topologyKey The key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. topology.kubernetes.io/zone
core.search.topologySpreadConstraints.whenUnsatisfiable Indicates how to deal with a search pod if it doesn't satisfy the spread constraint. DoNotSchedule

Restore from the .jama backup

To restore from an existing .jama backup, use the following parameters:

Parameter Description Default Example
core.application.storage.core.path The restore process looks for backup files in this directory, which is mounted into the pods using a hostPath volume. /data/restore
core.tenant-manager.application.env.RESTORE_BACKUP_FILE The backup file’s absolute path. '' /data/restore/mybackup.jama

See Use a .jama backup file to configure a dataset under Preparing your environment for more details on this restore mechanism.

Enable JMX monitoring

JMX can be enabled for the JVM-based components core, search, OpenSearch, and diff to expose standard management data (heap usage, thread counts, class loading, OS metrics, system properties, and any registered MBeans). Each component is configured independently and listens on its own fixed JMX port inside the pod.

JMX SETTINGS

Parameter Description Default
core.application.env.ENABLE_JAVA_JMX_REMOTE Enables JMX on the core JVM. false
core.application.env.JAVA_JMX_REMOTE_PORT JMX port on the core pod. 9090
core.search.application.env.ENABLE_JAVA_JMX_REMOTE Enables JMX on the search JVM. false
core.search.application.env.JAVA_JMX_REMOTE_PORT JMX port on the search pod. 9091
core.search.opensearch.application.env.ENABLE_JAVA_JMX_REMOTE Enables JMX on the OpenSearch JVM. false
core.search.opensearch.application.env.JAVA_JMX_REMOTE_PORT JMX port on the OpenSearch pod. 9092
core.diff.application.env.ENABLE_JAVA_JMX_REMOTE Enables JMX on the diff JVM. false
core.diff.application.env.JAVA_JMX_REMOTE_PORT JMX port on the diff pod. 9093

JMX RMI HOSTNAME

You can define a global RMI hostname to be used by core, search, OpenSearch, and diff pods.

By default, each pod uses its own IP, which might not be accessible externally. If needed, set this to a hostname that can be reached from outside the cluster.

Parameter Description Default
global.jmx.javaRmiHostName RMI hostname to use for all JMX-enabled pods (core, search, OpenSearch and diff) status.podIP

In This Section

 

 

 

Was this article helpful?

0 out of 0 found this helpful

Have more questions? Submit a request

Comments

0 comments

Please sign in to leave a comment.