frankframework

A Helm chart for running the Frank!Framework on Kubernetes

0.5.3
frankframeworkintegrationtestingautomation

Frank!Framework Chart

Running the Frank!Framework in Kubernetes is made easy with this Helm chart. Multiple instances of the Frank!Framework can be deployed in the same Kubernetes cluster and managed from a single console (if enabled).

Configurations can be copied over into a Container Image, or be mounted as a ConfigMap or Secret. Just replace the image with the image.repository and image.tag parameters or mount the configurations with the extraVolumes and extraVolumeMounts parameters.

This chart can also be used as sub-chart for other charts, so other defaults can be provided and extra files can be added. Take a look at the Frank2Example chart for a simple example.

Table of Contents

Usage

Helm must be installed to use the charts. Please refer to Helm's documentation to get started.

Once Helm has been set up correctly, add the repo as follows:

helm repo add frankframework https://frankframework.github.io/charts

If you had already added this repo earlier, run helm repo update to retrieve the latest versions of the packages. You can then run helm search repofrankframework to see the charts.

Configure the Frank!Framework by creating a values.yaml file. Parameters can be found below, or in the values.yaml file, where additional documentation and examples are provided.

To install the frankframework chart:

helm install my-frankframework frankframework/frankframework -f values.yaml

To uninstall the chart:

helm delete my-frankframework

Configuration and installation details

DTAP Stage

The Frank!Framework will start with different settings enabled, depending on what DTAP stage is configured. Like if the Ladybug should be disabled, or if authentication should be enabled.

For more information about DTAP stages read: https://frank-manual.readthedocs.io/en/latest/deploying/dtapAndProperties.html

Authentication

The usage of an authenticator is based on the dtap.stage. But it can be overridden with the application.security.console.authentication.type and application.security.testtool.authentication.type environment variables, if needed.

If the separate console is enabled, the console will not use the same authentication as the Frank!Framework. And always needs to be configured.

Read more about configuring the authentication in the Frank!Framework Manual.

Ladybug Database

A database is added for the Ladybug to make it somewhat persistent and to make the data accessible for all replicas.

The database is used for Ladybug reports and is not needed when Ladybug is disabled. This is enabled by default, but can be disabled if you want to use an external database for Ladybug.

The database is not intended to be used with the Frank!Framework itself, that datasource should be configured with the resources.yaml file.

You can read more about it in the parameters section.

Parameters

Common parameters

Common parameters for the Frank!Framework chart.

Can be used to override the default name for the chart.

NameDescriptionValue
nameOverrideString to partially override fullname template (will maintain the release name)""
fullnameOverrideString to fully override fullname template""

Frank!Framework image parameters

Information about how to use and configure the image can be found in the documentation: https://github.com/frankframework/frankframework/blob/master/Docker.md

The image is pulled from nexus.frankframework.org by default. The images located there will be kept for as long as possible.

Here are the images available: https://nexus.frankframework.org/#browse/browse:frankframework-docker:v2%2Ffrankframework%2Ftags/

If you want to use a specific nightly, you can use the images on docker.io: https://hub.docker.com/r/frankframework/frankframework/tags

NameDescriptionValue
image.registryFrank!Framework image registrynexus.frankframework.org
image.repositoryFrank!Framework image repositoryfrankframework
image.tagFrank!Framework image tag (immutable tags are recommended)""
image.pullPolicyFrank!Framework image pull policyIfNotPresent
image.pullPolicySpecify a imagePullPolicy
image.pullPolicyDefaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'
image.pullPolicyref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images
image.pullSecretsFrank!Framework image pull secrets[]
image.pullSecretsOptionally specify an array of imagePullSecrets.
image.pullSecretsSecrets must be manually created in the namespace.
image.pullSecretsref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
image.pullSecretsExample is shown in the values.yaml file

Frank!Framework application parameters

The application parameters are used to configure the Frank!Framework and how it will run. For example, you can configure the DTAP stage and side of where the instance is running. You can also configure the name of the instance. And what configurations to load.

NameDescriptionValue
application.dtap.stage(Required) Set the DTAP stage. Options: LOC, DEV, TST, ACC, PRD""
application.dtap.stageThe DTAP stage is used to enable and disable features in the Frank!Framework.
application.dtap.stageref: https://frank-manual.readthedocs.io/en/latest/deploying/dtapAndProperties.html
application.dtap.sideSet the DTAP side of where the instance is running, and for sideSpecific properties""
application.instance.nameSet the name of the Frank! instance (default is the fullname)""
application.instance.nameKeep in mind that the name is used for the default datasource.
application.configurations.namesSet the configurations to load. Leave empty to use the default[]
application.configurations.namesExample is shown in the values.yaml file
application.propertiesSet Yaml properties for configuring the Frank!Framework or configurations{}
application.propertiesPlease read the section "Environment variables" for more information about the differance between .Values.application.properties and .Values.environmentVariables
application.propertiesref: https://github.com/frankframework/frankframework/blob/master/core/src/main/resources/AppConstants.properties
application.propertiesimplementation ref: https://github.com/frankframework/frankframework/blob/master/commons/src/main/java/org/frankframework/util/YamlParser.java

Environment variables

The environment variables are used to configure the Frank!Framework.

The differance between .Values.application.properties and .Values.environmentVariables is that the environment variables are set in the container and not in the yaml file. Environment variables are immediately available in the container and can be used to configure the Frank!Framework, even before the yaml file has been loaded. The yaml file will is loaded by the Frank!Framework after it has been started. This is an important differance because it means that some variables to configure the Frank!Framework can not be set in the yaml file.

It is possible to add environment variables with the .Values.environmentVariables parameter and to add environment variables from a configmap or secret with the .Values.envFrom parameter.

To configure credentials you need to add a volume (see section Volumes) and set these environment variables.

credentialFactory.class: "nl.nn.credentialprovider.PropertyFileCredentialFactory"
credentialFactory.map.properties: "path to credentials.properties"

For more information about credentials, see the documentation.

To fine tune memory refer to the Oracle documentation.

Refer to the Frank!Framework Manual for more information.

NameDescriptionValue
environmentVariablesSet environment variables for the Frank!Framework{}
environmentVariables.application.server.type.customSet the transaction manager, this is needed for transactionality supportNARAYANA
environmentVariables.JAVA_OPTSSet the JAVA_OPTS for the Frank!Framework-XX:MaxRAMPercentage=80.0
environmentVariables.application.security.http.authenticationSet the authentication for the Frank!Frameworkundefined
envFromSet environment variables from configmaps or secrets[]
envFromExample is shown in the values.yaml file

Generate ConfigMaps and Secrets

To deploy the Frank!Framework, it can be needed to add some files to the container.

The Frank!Framework chart allows you to generate configmaps and secrets from values. This is useful if you want to add local users or resources to the Frank!Framework.

Be sure to set a subPath and a mountPath if you want to avoid conflicts and use multiple secrets. With one secret, the subPath and mountPath are not needed. And it would be possible to implement items, like this:

generateSecret:
- name: frankframework-resources
mountPath: "/opt/frank/resources/"
items:
- key: credentials.properties
path: credentials.properties
- key: resources.yml
path: resources.yml
stringData:
credentials.properties: demo
resources.yml: demo

The following example will generate a resources.yaml file in the /opt/frank/secrets folder.

generateSecret:
- name: frankframework-resources
mountPath: /opt/frank/resources/resources.yml
subPath: resources.yml
stringData:
resources.yml: |-
jdbc:
- name: frank2example
type: org.h2.jdbcx.JdbcDataSource
url: jdbc:h2:mem:frank2example;NON_KEYWORDS=VALUE;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;TRACE_LEVEL_FILE=0;
NameDescriptionValue
generateConfigMapGenerate configmaps from values{}
generateConfigMapExample is shown in the values.yaml file
generateConfigMap.nameName of the configmapundefined
generateConfigMap.optionalMark the configmap as optional (default false)undefined
generateConfigMap.defaultModeDefault mode of the configmap (default 0644)undefined
generateConfigMap.itemsItems of the configmapundefined
generateConfigMap.items.keyKey of the configmapundefined
generateConfigMap.items.pathPath of the configmapundefined
generateConfigMap.items.modeMode of the configmapundefined
generateConfigMap.mountPathPath where the configmap will be mounted (default /opt/frank/secrets)undefined
generateConfigMap.readOnlyReadOnly of the configmap (default true)undefined
generateConfigMap.dataData of the configmapundefined
generateSecretGenerate secrets from values{}
generateSecretExample is shown in the values.yaml file
generateSecret.nameName of the secretundefined
generateSecret.typeType of the secret (default Opaque)undefined
generateSecret.optionalMark the secret as optional (default false)undefined
generateSecret.itemsItems of the secretundefined
generateSecret.items.keyKey of the secretundefined
generateSecret.items.pathPath of the secretundefined
generateSecret.items.modeMode of the secretundefined
generateSecret.mountPathPath where the secret will be mounted (default /opt/frank/secrets)undefined
generateSecret.readOnlyReadOnly of the secret (default true)undefined
generateSecret.dataData of the secretundefined
generateSecret.stringDataStringData of the secretundefined

Volumes

The Frank!Framework chart allows you to create and mount volumes to the Frank!Framework. This is useful if you want to add existing local users or resources to the Frank!Framework. You might also use it to mount a volume containing the Configurations for the Frank!Framework. Or to add a mount as part of the integration.

NameDescriptionValue
extraVolumesOptionally specify extra list of additional volumes for WordPress pods[]
extraVolumeMountsOptionally specify extra list of additional volumeMounts for WordPress container(s)[]

Sidecars

The Frank!Framework chart allows you to add additional sidecar containers to the Frank!Framework pod. This is useful if you want to add additional tools to the Frank!Framework. Like for logging.

NameDescriptionValue
sidecarsAdd additional sidecar containers to the Frank!Framework pod[]
sidecarsExample is shown in the values.yaml file
initContainersAdd additional init containers to the Frank!Framework pod[]
initContainersref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
initContainersExample is shown in the values.yaml file

Frank!Framework console parameters

The console is a web application that allows you to manage the Frank!Framework. Each Frank!Framework instance contains a build-in console, which can be accessed by going to the instance's URL and appending /iaf/gui. Enabling this additional console (apart from the build-in one) will allow you to manage multiple instances of Frank!Framework from a single console. The additional console is disabled by default, but can be enabled by setting console.enabled to true. Configuring the console is done by setting the console parameters. Which can be found in the frank-console chart. ref: https://frankframework.github.io/charts/frank-console

NameDescriptionValue
console.enabledEnable the Frank!Framework consolefalse
console.ladybugDatabase.auth.existingSecretName of the secretfrankframework-ladybug-database-auth

Ladybug Database

The Ladybug Database is a PostgreSQL dependency that is used to store Ladybug reports and is not needed when the Ladybug is disabled.

Note that this dependency is not used for the Frank!Framework itself, that datasource should be configured with the resources.yaml file.

The dependency is enabled by default, but can be disabled if you want to use an external database for Ladybug.

To configure the PostgreSQL Helm chart, please refer to the documentation and append to the Ladybug Database parameters: https://github.com/bitnami/charts/tree/main/bitnami/postgresql

Some of the parameters are pre-configured for an easy installation, but can be changed if needed.

NameDescriptionValue
ladybugDatabase.enabledEnable the Ladybug Database (PostgreSQL dependency)true
ladybugDatabase.nameOverrideOverride the name of the Ladybug Database dependencyladybug-database
ladybugDatabase.primary.persistence.enabledEnable persistence for the Ladybug Database dependency (default is false for easy installation)false
ladybugDatabase.auth.generatePostgresqlSecretEnable the generation of secrets for the PostgreSQL dependencytrue
ladybugDatabase.auth.existingSecretName of the secret (also the name of the generated secret)frankframework-ladybug-database-auth
ladybugDatabase.auth.postgresPasswordPassword for the PostgreSQL dependencypostgres

Frank!Framework deployment parameters

The startup probe will enable blue-green deployment, which are great for uptime during upgrades and such. It (and the liveness probe) will check if the console is accessible, until a better health endpoint is available. The readiness probe will check if all adapters are running using the server health endpoint

NameDescriptionValue
replicaCountNumber of Frank!Framework replicas to deploy1
replicaCountNOTE: ReadWriteMany PVC(s) are required if replicaCount > 1
startupProbeConfigure the startup probe
startupProberef: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
startupProbe.initialDelaySecondsInitial delay seconds for startupProbe40
startupProbe.periodSecondsPeriod seconds for startupProbe10
startupProbe.timeoutSecondsTimeout seconds for startupProbe1
startupProbe.failureThresholdFailure threshold for startupProbe12
startupProbe.successThresholdSuccess threshold for startupProbe1
startupProbe.httpGet.pathPath for startupProbe/iaf/api/server/health
startupProbe.httpGet.portPort for startupProbe8080
livenessProbeConfigure the liveness probe
livenessProberef: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
livenessProbe.initialDelaySecondsInitial delay seconds for livenessProbe0
livenessProbe.periodSecondsPeriod seconds for livenessProbe10
livenessProbe.timeoutSecondsTimeout seconds for livenessProbe1
livenessProbe.failureThresholdFailure threshold for livenessProbe12
livenessProbe.successThresholdSuccess threshold for livenessProbe1
livenessProbe.httpGet.pathPath for livenessProbe/iaf/api/server/health
livenessProbe.httpGet.portPort for livenessProbe8080
readinessProbeConfigure the readiness probe
readinessProberef: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes
readinessProbe.initialDelaySecondsInitial delay seconds for readinessProbe0
readinessProbe.periodSecondsPeriod seconds for readinessProbe5
readinessProbe.timeoutSecondsTimeout seconds for readinessProbe1
readinessProbe.failureThresholdFailure threshold for readinessProbe3
readinessProbe.successThresholdSuccess threshold for readinessProbe1
readinessProbe.httpGet.pathPath for readinessProbe/iaf/api/server/health
readinessProbe.httpGet.portPort for readinessProbe8080
resourcesSet the resources for the Frank!Framework containers{}
resourcesref: https://kubernetes.io/docs/user-guide/compute-resources/
resourcesExample is shown in the values.yaml file
resources.limitsThe resources limits for the Frank!Framework containersundefined
resources.requests.memoryThe requested memory for the Frank!Framework containersundefined
resources.requests.cpuThe requested cpu for the Frank!Framework containersundefined
terminationGracePeriodSecondsNumber of seconds after which pods are forcefully killed60
terminationGracePeriodSecondsNote: Lower values may cause running adapters to fail
nodeSelectorNode labels for pod assignment{}
nodeSelectorref: https://kubernetes.io/docs/user-guide/node-selection/
tolerationsSet tolerations for pod assignment[]
tolerationsref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
affinitySet affinity for pod assignment{}
affinityRef: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
affinityNOTE: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set
timeZoneused for database connection and log timestampsEtc/UTC

Traffic Exposure Parameters

NameDescriptionValue
service.typeFrank!Framework service typeClusterIP
service.portFrank!Framework service port80
service.annotationsAdditional annotations for the Frank!Framework service{}
ingressref: https://kubernetes.io/docs/concepts/services-networking/ingress/
ingress.enabledEnable ingress record generation for Frank!false
ingress.classNameIngressClass that will be used to implement the Ingress (Kubernetes 1.18+)""
ingress.classNameThis is supported in Kubernetes 1.18+ and required if you have more than one IngressClass marked as the default for your cluster .
ingress.classNameref: https://kubernetes.io/blog/2020/04/02/improvements-to-the-ingress-api-in-kubernetes-1.18/
ingress.annotationsAdditional annotations for the Ingress resource. To enable certificate autogeneration, place here your cert-manager annotations.{}
ingress.annotationsFor a full list of possible ingress annotations, please see
ingress.annotationsref: https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md
ingress.annotationsUse this parameter to set the required annotations for cert-manager, see
ingress.annotationsref: https://cert-manager.io/docs/usage/ingress/#supported-annotations
ingress.annotationsExample is shown in the values.yaml file
ingress.hostsSet hosts for ingress{}
ingress.hosts.hostSet hostnameundefined
ingress.hosts.pathsSet multiple pathsundefined
ingress.hosts.paths.pathSet path (context url)undefined
ingress.hosts.paths.pathTypeSet type of pathundefined
ingress.tlsDefine tls secrets for hosts{}
ingress.tlsExample is shown in the values.yaml file

Other Parameters

NameDescriptionValue
serviceAccountref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
serviceAccount.createEnable creation of ServiceAccount for Frank!Framework podtrue
serviceAccount.annotationsAdditional custom annotations for the ServiceAccount{}
serviceAccount.nameThe name of the ServiceAccount to use.""
podAnnotationsAnnotations for Frank!Framework pods{}
podAnnotationsref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/
podLabelsExtra labels for Frank!Framework pods{}
podLabelsref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/
podSecurityContextSet Frank!Framework pod's Security Context{}
podSecurityContextref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
securityContextSet Frank!Framework container's Security Context{}
securityContextref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container
securityContextExample is shown in the values.yaml file

Notable changes

0.5.0

Added a Ladybug Database (PostgreSQL variant) to the Chart.

Also added .Values.envFrom to allow for the mounting of environment variables from configmaps or secrets.

Removed .Values.application.security.http.authentication: "false". This is a more secure default. The dtap.stage will determine if authentication is enabled or not. It is possible to override this with environment variables. Read mote in the Frank!Framework Manual.

0.4.0

The Frank!Framework is an ever evolving project, and as such, the chart has been updated to reflect the latest changes.

To make the chart easier to maintain, the following features have been removed:

  • .Values.application.memory has been removed. Configure the memory with environment variables.
  • .Values.application.security.http has been removed. Configure the authentication with additional files and environment variables.
  • .Values.application.credentials has been removed. Configure the credentials with volumes and environment variables.
  • .Values.application.certificates has been removed. Configure the certificates with volumes and environment variables.

To accommodate for the removal of the above features, the following changes have been made:

  • .Values.application.environmentVariables has been changed to .Values.environmentVariables. And has some pre-defined values.
  • .Values.generateConfigMap has been added to allow for the generation of configmaps.
  • .Values.generateSecret has been added to allow for the generation of secrets.
  • .Values.extraVolumes has been added to allow for the mounting of additional volumes.
  • .Values.extraVolumeMounts has been added to allow for the mounting of additional volumes.

Also .Values.sidecars and .Values.initContainers have been added to allow for the mounting of additional sidecars and init containers.

All these changes make the deployment much more flexible and easier to maintain. It also doesn't require extra documentation or knowledge to use, because the deployment is the same as traditional deployments.

0.3.0

The common chart and its templates have been removed. Making this the main chart for other Frank!Framework-based charts.

.Values.frank has been changed to .Values.application.

The .Values.connections.jdbc and .Values.connections.jms have been changed to .Values.application.resources and have a different structure. It generates a resources.yml for the Frank!Framework. This is to allow for more flexibility.

A new chart has been added, called frank-console. This is a web application that allows you to manage multiple instances of Frank!Framework from a single console. It is disabled by default, but can be enabled by setting .Values.console.enabled to true.

All probes have been added to the values, making it possible to configure then separately. This could be useful if you want to make use of the new health endpoints.

0.2.10

The name of the chart has been renamed (frankframework) to match the project, organisation and Docker image.

0.2.8

The .Values.frank.memory notation has been changed. It is now possible to define a minimum and a maximum, and to set percentages.

0.2.7

The .Values.frank.dtap.stage and .Values.frank.dtap.side are now empty by default.

  • .Values.frank.dtap.stage is now required and should be set to the right stage. Read more in the Installation details
  • .Values.frank.dtap.side will default to the release namespace deployed in.

Application Version

8.3.0-SNAPSHOT

Chart Versions

0.5.3 - 12/12/2024
0.5.2 - 07/11/2024
0.5.1 - 22/10/2024
0.5.0 - 10/10/2024
0.4.1 - 26/09/2024
0.4.0 - 23/09/2024
0.3.4 - 09/09/2024
0.3.3 - 03/09/2024
0.3.2 - 02/09/2024
0.3.1 - 27/08/2024
+ Show all releases