Helm values
Use the values.yaml packaged with the Koldan chart you are installing as the exhaustive, version-matched reference. This page explains the operator-facing value contracts and important interactions; it does not duplicate every value accepted by dependency subcharts.
Pin a chart version before preparing overrides:
helm show chart <chart-reference> --version <chart-version>
helm show values <chart-reference> --version <chart-version> > koldan-defaults.yaml
Keep a small, site-owned override file in source control and protect any secret-bearing companion file. Do not copy the full defaults into the override: copied defaults hide changes introduced by a later chart release.
Configuration precedence
The chart builds the application configuration in this order:
- Chart defaults for the service names of bundled dependencies.
- Chart-derived values, including the advertised HTTP endpoint when
web.ingress.enabledistrue. - Operator application YAML supplied through
config.
The last layer takes precedence. Use dedicated Helm values for Kubernetes resources-images, replicas, Services, exposure, storage, pod security, and placement-and use config for the application properties that do not have a dedicated chart value.
config is rendered into a ConfigMap. Do not place credentials there when an existing-Secret interface is available. If the current configuration contract requires a credential in config, treat the values file, rendered manifests, Helm release record, ConfigMap, and their backups as sensitive.
Release-wide controls
| Value path | Type and purpose | Operational behavior |
|---|---|---|
fullnameOverride |
String; fixes the base name of chart-managed resources. | Changing it after installation creates resources under new names and can disconnect workloads from existing Secrets and PVCs. Keep it stable. |
nameOverride |
String; changes the chart-name component when fullnameOverride is empty. |
Treat as immutable after installation for the same reason. |
serviceAccount.create |
Boolean; creates the Koldan service account. | Set to false when the platform provisions the account separately. |
serviceAccount.name |
String; selects the created or pre-existing account. | Web, gRPC, and workflow-worker pods use it. Verify the rendered engine pods separately; the current engine templates do not consume this global value. |
serviceAccount.automount |
Boolean; controls API-token automounting on the chart-created service account. | Disable unless workloads need Kubernetes API credentials. Confirm any cloud workload-identity integration still works. |
serviceAccount.annotations |
Map; adds identity or policy annotations to the chart-created account. | A change affects newly created pods. Restart workloads after changing an external identity binding. |
license |
Multiline string containing the issued license document. | Rendered into a chart-managed Secret. A change automatically rolls the Koldan application workloads through a checksum annotation. See License. |
config |
Multiline application YAML. | Rendered into a ConfigMap. A change automatically rolls Koldan application workloads. Validate the resulting configuration and dependency connectivity. |
legacyDependencies.elasticsearchEnabled |
Boolean; enables Koldan Desktop legacy log storage and APIs. | Defaults to true. Set it and elasticsearch.install to false to omit Elasticsearch entirely. |
legacyDependencies.zookeeperEnabled |
Boolean; enables ZooKeeper-backed internal-engine discovery. | Defaults to true. Set it and zookeeper.install to false only when no Koldan-managed internal engines are deployed. |
customCA.enabled |
Boolean; enables the private-CA trust mount. | Takes effect only when customCA.data is non-empty. |
customCA.data |
Map of filename to PEM certificate content. | Rendered into a Secret and mounted by web, gRPC, engines, and workers. Secret content changes do not change the pod template; restart affected Deployments after rotation. See TLS and custom CAs. |
googleCredentials.enabled |
Boolean; mounts Google Application Default Credentials in web and workflow-worker pods. | Enabling or disabling changes the pod template and rolls those workloads. |
googleCredentials.existingSecret |
String; names a Secret containing google-credentials.json. |
Preferred over embedding a key. A change to the referenced Secret's data does not roll pods; restart web and workers after rotation. |
googleCredentials.json |
Multiline JSON used to create a chart-managed Secret when existingSecret is empty. |
Sensitive. Avoid it in Git, shell history, CI output, and shared rendered manifests. |
Helm stores supplied values and rendered manifests in the release record. Access to Helm release Secrets is therefore equivalent to access to the sensitive values submitted through the chart.
Koldan workload controls
Common pod controls
The following paths are available where listed in the packaged defaults:
| Value pattern | Applies to | Effect |
|---|---|---|
<workload>.image.repository, .tag, .pullPolicy |
web, grpc, engineSlibe, engineK2, workflowsWorker, docs |
Selects the container image. An empty tag uses the chart appVersion. Pin immutable release images in production. |
<workload>.imagePullSecrets |
Same workload groups | Adds registry pull Secrets to the pod. The Secrets must already exist in the release namespace. |
<workload>.podAnnotations, .podLabels |
Same workload groups | Adds policy, inventory, or observability metadata. Engine values apply to every instance; worker values apply to every pool. |
<workload>.podSecurityContext, .securityContext |
Same workload groups | Configures pod- and container-level security context. Render and validate against the cluster admission policy before rollout. |
<workload>.resources |
web, grpc, docs; per instance or pool for engines and workers |
Sets requests and limits. Engine resources are under engineSlibe.instances[] or engineK2.instances[]; worker resources are under workerPools.<pool>. |
<workload>.strategy |
web, grpc, discovery; per pool under workerPools.<pool> |
Sets the Kubernetes Deployment strategy. Capacity profiles use a no-surge rolling update. |
<workload>.nodeSelector, .tolerations, .affinity |
web, grpc, docs; per instance or pool for engines and workers |
Controls placement. Worker pools inherit the corresponding workflowsWorker value when their local map or list is empty. |
<workload>.volumes, .volumeMounts |
web, grpc, docs; per instance for engines; shared through workflowsWorker for workers |
Adds operator-managed mounts. Use unique names and paths that do not collide with chart mounts. |
A change to an image, resource, security, metadata, volume, or placement value changes the pod template and triggers a Kubernetes rollout. Confirm rollout status and readiness before continuing to the next workload.
The chart exposes strategy for HTTP, gRPC, discovery, and each worker pool. The supported profiles set maxSurge: 0 and maxUnavailable: 1; changing this affects rollout capacity and availability. Koldan application PodDisruptionBudgets and generic topology-spread controls are not exposed. Use the available affinity controls, dependency-subchart placement controls, or separately reviewed Kubernetes resources where required.
API workloads
| Workload | Fixed replicas | HPA | Workload-specific controls |
|---|---|---|---|
| HTTP API | web.replicaCount |
web.autoscaling.* |
web.hikari.*, web.oauth.*, web.service.*, web.ingress.*, web.route.*, web.hostAliases, and web.persistence.updates.* |
| gRPC API | grpc.replicaCount |
grpc.autoscaling.* |
grpc.hikari.*, grpc.oauth.*, grpc.certificate.*, grpc.service.*, grpc.route.*, and grpc.hostAliases |
web.replicaCount and grpc.replicaCount default to 0; an operator must explicitly enable the required workloads. When an API HPA is enabled, the Deployment omits its fixed replica count and the HPA uses:
autoscaling.minReplicasautoscaling.maxReplicasautoscaling.targetCPUUtilizationPercentage- optional
autoscaling.targetMemoryUtilizationPercentage
Resource-utilization HPAs require meaningful resource requests and a working cluster metrics pipeline.
The Hikari paths for these workloads use camel case: hikari.maximumPoolSize and hikari.minimumIdle. Include every replica and HPA maximum in the database connection budget.
Engine instances
engineSlibe.instances and engineK2.instances are lists. Each entry creates one named Deployment and private Service. Because Helm replaces lists rather than merging them, an operator override of instances must contain every instance that should remain deployed.
| Value path | Purpose |
|---|---|
engineSlibe.instances[].id, engineK2.instances[].id |
Stable instance identifier used in resource names and labels. Keep it DNS-safe and stable across upgrades. |
instances[].replicaCount |
Fixed number of replicas for that instance. Defaults to 0 in the packaged values. |
instances[].service.type, .port, .annotations |
Configures the instance Service. Defaults are ClusterIP and port 8200; keep engine Services private. |
instances[].resources, .volumes, .volumeMounts, .nodeSelector, .tolerations, .affinity |
Per-instance capacity, mounts, and placement. |
engineK2.instances[].modelType, .decodingMethod |
Selects supported runtime modes for the K2 instance. Use release-provided values. |
engineK2.instances[].hotwords.enabled, .content |
Creates and mounts a ConfigMap containing the configured hot-word data. Do not put secrets in this content. |
engineSlibe.hikari.*, engineK2.hikari.* |
Shared database-pool settings for every replica of that engine type. Uses camel-case field names. |
engineSlibe.oauth.*, engineK2.oauth.* |
Client identity supplied to engine pods. The client secret is rendered directly in the pod specification and Helm release record. |
Although the packaged values include instances[].autoscaling, the current chart has no engine HPA template. Do not set instances[].autoscaling.enabled: true: it suppresses the Deployment replica count without creating an HPA. Use instances[].replicaCount and confirm the rendered Deployment has the intended replica count.
Workflow-worker pools and Temporal task queues
The chart creates the compute, inference, and orchestration pools under workerPools. The compute pool supports an optional resource-utilization HPA. Inference and orchestration use explicit replica counts because their safe scale depends on external-provider and coordination capacity.
Shared controls under workflowsWorker apply to all pools. A non-empty pool-local nodeSelector, tolerations, or affinity takes precedence over the shared value. Pool-specific operational controls are:
| Value path | Type and effect |
|---|---|
workflowsWorker.transcription.activityHeartbeatTimeout |
Spring duration shared by long-running activities. Defaults to 4m and must be longer than the fixed 10-second heartbeat interval. A changed value applies to newly started transcription workflows. |
workerPools.<pool>.replicaCount |
Integer; number of poller pods for every queue assigned to the pool. |
workerPools.compute.autoscaling.enabled |
Boolean; creates an autoscaling/v2 HPA for the compute Deployment and omits its fixed replica count. Defaults to false. |
workerPools.compute.autoscaling.minReplicas, .maxReplicas |
Lower and upper compute replica bounds. Size the maximum against node CPU, ephemeral storage, database connections, and aggregate worker concurrency. |
workerPools.compute.autoscaling.targetCPUUtilizationPercentage |
Optional CPU utilization target, calculated from the compute pod CPU request. |
workerPools.compute.autoscaling.targetMemoryUtilizationPercentage |
Optional memory utilization target, calculated from the compute pod memory request. |
workerPools.<pool>.managementPort |
Integer; pod management port used by readiness, liveness, and metrics. It is not published by a chart-managed Service. Keep it cluster-internal. |
workerPools.<pool>.resources |
Kubernetes resource requirements for each pool pod. |
workerPools.<pool>.hikari.maximum-pool-size, .minimum-idle |
Database pool settings for each pool replica. These keys use hyphens, unlike the API and engine Hikari keys. |
workerPools.<pool>.capacityOverrides.<worker-name>.max-concurrent-activity-executors |
Limits concurrent activity execution for the named worker. |
workerPools.<pool>.capacityOverrides.<worker-name>.max-concurrent-workflow-task-executors |
Limits concurrent workflow-task execution for the named worker. |
workerPools.<pool>.capacityOverrides.<worker-name>.activity-task-pollers-configuration.poller-behavior-autoscaling.* |
Overrides the explicit activity poller minimum, initial value, or maximum. |
workerPools.<pool>.capacityOverrides.<worker-name>.workflow-task-pollers-configuration.poller-behavior-autoscaling.* |
Overrides the explicit workflow poller minimum, initial value, or maximum. |
workerPools.orchestration.workflowCache.* |
Controls the shared workflow cache/thread ceiling. Packaged values are 200 instances, 400 threads, and virtual workflow threads disabled. |
The workerPools.<pool>.workers lists, task types, and task-queue assignments are release-managed. Do not replace them in operator values and do not set spring.temporal.workers under config; either action can remove required pollers. Override capacity only for a worker name present in the same packaged pool. Helm deep-merges these overrides without applying Temporal-specific semantic validation; inspect the rendered worker ConfigMap before an upgrade.
A capacity override changes the affected pool's pod-template checksum and automatically rolls that Deployment. Wait for the rollout, then verify that its queues have pollers:
Before increasing replicas or concurrency, calculate the Temporal, inference-backend, database, CPU, memory, and ephemeral-storage budgets. Use the compute HPA's maxReplicas in those budgets when autoscaling is enabled. The queue map, capacity formulas, review steps, and rollback procedure are in Temporal and Scaling and capacity.
Optional documentation workload
docs.replicaCount, docs.image.*, docs.siteUrl, docs.service.*, and docs.ingress.* control the optional documentation site. It is independent of the Koldan API workloads and defaults to zero replicas with Ingress disabled.
Services, DNS, and TLS
HTTP exposure
Use web.service.type, .port, .nodePort, and .annotations for the HTTP Service. Use exactly one chart-managed edge:
- Kubernetes Ingress:
web.ingress.enabled,.className,.annotations,.hosts, and.tls. - OpenShift Route:
web.route.enabled,.host,.path,.annotations, and.tls.*.
The chart rejects a release when both the web Ingress and Route are enabled. When web Ingress is enabled, its first host and TLS presence are used to derive the advertised HTTP endpoint. Route, NodePort, and LoadBalancer exposure do not receive that derivation; set the externally reachable advertisement properties under config and verify generated links from outside the cluster.
For web.service.type: NodePort, an empty web.service.nodePort renders the chart fallback 31113.
gRPC exposure
Use grpc.service.type, .port, .nodePort, and .annotations for the gRPC Service. For OpenShift, configure grpc.route.*. For grpc.service.type: NodePort, an empty grpc.service.nodePort renders the fallback 31114.
grpc.certificate.enabled, .cert, and .key configure TLS in the Koldan gRPC pod and create a chart-managed Secret. These values are distinct from grpc.route.tls.*, which configures OpenShift Route termination and can place private-key material directly in the Route manifest. Prefer a platform-managed certificate path where available. Certificate Secret changes do not alter the pod checksum; restart gRPC pods after rotation and verify both the certificate chain and hostname.
The chart does not derive the advertised gRPC address from its Service or Route. Supply and verify it through config.
Keycloak exposure
The bundled identity provider uses its subchart Ingress values under keycloak.ingress.* or the Koldan-provided OpenShift Route values under keycloak.route.*. The chart rejects a release when both are enabled. See Identity providers for redirect URI and client requirements.
Keep management ports, engine Services, data stores, and coordination services off untrusted networks. See Network, DNS, and ports and Operational endpoints.
Persistence
Koldan update storage
web.persistence.updates.create, .class, .size, and .accessModes configure the update PVC mounted by the web workload. The current template always mounts <fullname>-updates; setting create: false requires an operator-created PVC with that exact name. The declared web.persistence.updates.name value does not change the generated or mounted claim name in the current chart.
Render this PVC before installation and validate accessModes against the target cluster. Test expansion with the selected StorageClass; Kubernetes does not support shrinking a PVC. Back up required content before uninstall or storage migration.
Bundled dependency storage
These packaged defaults are the main persistence entry points:
| Dependency | Value paths |
|---|---|
| PostgreSQL | postgresql.primary.persistence.*, postgresql.readReplicas.persistence.*, and postgresql.backup.* |
| MinIO | minio.persistence.*, minio.replicas, and minio.mode |
| ZooKeeper | zookeeper.persistence.* |
| Elasticsearch | elasticsearch.volumeClaimTemplate.* |
| Grafana | grafana.persistence.* |
| Temporal | temporal.server.config.persistence.* plus persistence controls supported by the pinned Temporal subchart |
Storage behavior is owned by the pinned dependency chart. Inspect its version-matched defaults and rendered StatefulSets/PVCs before changing storage class, topology, replicas, or retention. A Helm rollback cannot reverse data migration or restore deleted data; follow Backup and restore and Upgrade and rollback.
Bundled and external dependencies
Each dependency is gated by an exact install value:
| Install switch | Bundled service | External configuration when false |
|---|---|---|
postgresql.install |
PostgreSQL | Set datasource URL, username, password, TLS, and connection-pool properties under config. Ensure pgvector is installed as described in PostgreSQL. |
temporal.install |
Temporal | Set Temporal endpoint, namespace, credentials, and TLS properties under config. |
minio.install |
MinIO | Set the S3 endpoint, bucket, and credentials under config. |
keycloak.install |
Keycloak | Set OIDC issuer and related properties under config; provision clients and roles externally. |
zookeeper.install |
ZooKeeper | Set the external ZooKeeper endpoint under config. |
elasticsearch.install |
Elasticsearch | Set the external search endpoint and security properties under config. |
prometheus.install |
Prometheus | Point the external monitoring system at the management metrics endpoints. |
grafana.install |
Grafana | Configure the external dashboard service and its identity integration separately. |
Setting an install switch to false prevents that subchart from rendering in the target release. On an upgrade from true to false, Helm can remove dependency resources that the release previously managed; it does not migrate their data, configure the external replacement, rewrite Koldan's default endpoint, or validate connectivity. Back up the dependency, provision and test the replacement, supply all external settings in the same controlled change, and inspect the planned manifest changes before applying them.
Elasticsearch and ZooKeeper also have application-level switches. install: false alone means “use an externally managed service”; it does not disable the Koldan integration. To run without either service, use both layers:
elasticsearch:
install: false
zookeeper:
install: false
legacyDependencies:
elasticsearchEnabled: false
zookeeperEnabled: false
Elasticsearch can be disabled when Koldan Desktop client-log ingestion/query is not required. ZooKeeper can be disabled when no Koldan-managed internal engines are deployed. Both application switches default to true for backward compatibility.
All other values nested under postgresql, temporal, minio, keycloak, zookeeper, elasticsearch, prometheus, and grafana are passed to their pinned subcharts. Use the packaged Chart.yaml and Chart.lock to identify the exact dependency version, then consult that version's values.yaml. Do not assume a value from a newer upstream chart is supported by the Koldan release.
Credential and secret exposure
| Value path | Rendered location | Rotation behavior |
|---|---|---|
config containing koldan.security.encryption-key |
Chart-managed ConfigMap and Helm release record | Changing config rolls application workloads, but changing the key without re-encrypting existing database values causes decryption failures. Treat it as a non-rotatable recovery root unless following a tested migration procedure. |
config containing koldan.api.api-keys.hmac-secret |
Chart-managed ConfigMap and Helm release record | Changing config rolls application workloads and invalidates all existing API keys. Coordinate HTTP/gRPC rollout and client key replacement. |
license |
Koldan license Secret | Application workloads roll automatically. |
googleCredentials.json |
Chart-managed Google credentials Secret | Restart web and worker Deployments after data changes. |
googleCredentials.existingSecret |
Operator-managed Secret reference | Update the Secret, then restart web and workers. |
customCA.data |
Chart-managed CA Secret | Restart every dependent Deployment after rotation. |
grpc.certificate.cert, .key |
Chart-managed Koldan Secret | Restart gRPC after rotation. |
web.oauth.clientSecret, grpc.oauth.clientSecret, engineSlibe.oauth.clientSecret, engineK2.oauth.clientSecret, workflowsWorker.oauth.clientSecret |
Pod environment in rendered Deployment; workers fall back to the gRPC secret when their value is empty | A Helm value change rolls affected Deployments. Restrict manifest and pod-read access. |
web.route.tls.*, grpc.route.tls.*, keycloak.route.tls.* |
OpenShift Route | Private keys become part of the rendered manifest and Helm release record. Prefer referenced/platform-managed TLS where possible. |
| Dependency credentials | Dependency-specific Secret or workload, according to the pinned subchart | Follow the dependency chart's rotation procedure and verify Koldan reconnects. |
Never pass sensitive values through --set; shells and CI systems can retain command arguments. Use protected values files, --set-file for supported scalar/file values, or an approved deployment secret integration. Restrict access to rendered manifests, release Secrets, diagnostic bundles, and namespace backups.
Rollout and restart matrix
| Change | Automatic application rollout | Required operator action |
|---|---|---|
config or license |
Yes | Watch every affected Deployment and run dependency/readiness checks. |
| Images, resources, OAuth values, placement, security context, or pod metadata | Yes | Watch the changed workload rollout. |
workerPools.<pool>.capacityOverrides |
Yes, for the affected pool | Watch the affected worker-pool rollout and verify queue pollers and capacity metrics. |
Existing Secret data, customCA.data, or gRPC certificate content |
No reliable checksum rollout | Restart every pod that consumes the changed Secret and verify authentication/TLS. |
| Service, Ingress, or Route metadata | Usually no pod rollout | Verify DNS, load balancer, certificate, HTTP, and gRPC paths externally. A Service port change also changes the API pod template. |
| PVC size | No application rollout | Confirm the PVC and filesystem expansion; never attempt a size reduction. |
| Dependency subchart values | Dependency-specific | Read the pinned subchart procedure and observe its StatefulSet/Deployment rollout. |
Preflight and verification
Before every install or upgrade:
- Pin the chart version and review its packaged
Chart.yaml,Chart.lock,values.yaml, and release notes. - Confirm each dependency package matches the lock file before deployment.
- Compare the site override with the new defaults; pay special attention to lists such as engine instances.
- Render the exact release inputs in a protected workspace.
- Inspect Deployments, replica counts, HPAs, Services, Ingresses or Routes, Secrets, PVCs, resource requests, service accounts, security contexts, and placement rules.
- Apply through Install with Helm or Upgrade and rollback.
- Verify rollout status, readiness, public HTTP and gRPC connectivity, Temporal pollers, dependency health, and licensed operation.
helm lint <unpacked-chart-directory> -f operator-values.yaml
helm template <release> <chart-reference> \
--version <chart-version> \
--namespace <namespace> \
-f operator-values.yaml > rendered.yaml
helm get values <release> -n <namespace> --all
helm get manifest <release> -n <namespace>
kubectl get deploy,statefulset,hpa,svc,ingress,pvc -n <namespace>
Rendering proves only that Helm can produce manifests. Complete the task-specific verification in the linked Operations guides, and use Troubleshooting if a rollout stalls or a dependency remains unhealthy.