Operator Helm values
Configure the ToolHive operator with these Helm values.
Chart: toolhive-operator. Chart version: 0.51.4. Source:
values.yaml
at v0.51.4.
Values
nameOverride
Type: string
Default: ""
Override the name of the chart
fullnameOverride
Type: string
Default: "toolhive-operator"
Provide a fully-qualified name override for resources
operator
Type: object
Default value
affinity: {}
autoscaling:
enabled: false
maxReplicas: 100
minReplicas: 1
targetCPUUtilizationPercentage: 80
containerSecurityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
defaultImagePullSecrets: []
defaultRedis:
addr: ''
existingSecret: ''
existingSecretKey: ''
env: []
features:
experimental: false
storageVersionMigrator: true
gc:
gogc: 75
gomemlimit: 110MiB
image: ghcr.io/stacklok/toolhive/operator:v0.51.4
imageDiscovery:
enabled: false
resources: {}
imagePullPolicy: IfNotPresent
imagePullSecrets: []
leaderElectionRole:
binding:
name: toolhive-operator-leader-election-rolebinding
name: toolhive-operator-leader-election-role
rules:
- apiGroups:
- ''
resources:
- configmaps
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- create
- patch
livenessProbe:
httpGet:
path: /healthz
port: health
initialDelaySeconds: 15
periodSeconds: 20
nodeSelector: {}
podAnnotations: {}
podLabels: {}
podSecurityContext:
runAsNonRoot: true
ports:
- containerPort: 8080
name: metrics
protocol: TCP
- containerPort: 8081
name: health
protocol: TCP
proxyHost: 0.0.0.0
rbac:
allowedNamespaces: []
scope: cluster
readinessProbe:
httpGet:
path: /readyz
port: health
initialDelaySeconds: 5
periodSeconds: 10
replicaCount: 1
resources:
limits:
cpu: 500m
memory: 128Mi
requests:
cpu: 10m
memory: 64Mi
serviceAccount:
annotations: {}
automountServiceAccountToken: true
create: true
labels: {}
name: toolhive-operator
tolerations: []
toolhiveRunnerImage: ghcr.io/stacklok/toolhive/proxyrunner:v0.51.4
vmcpImage: ghcr.io/stacklok/toolhive/vmcp:v0.51.4
volumeMounts: []
volumes: []
All values for the operator deployment and associated resources
operator.features.experimental
Type: bool
Default: false
Enable experimental features
operator.features.storageVersionMigrator
Type: bool
Default: true
Enable the StorageVersionMigrator controller, which auto-cleans
status.storedVersions on opted-in toolhive.stacklok.dev CRDs so a future release
can drop deprecated versions (e.g. v1alpha1) without orphaning etcd objects in
the cluster. Enabled by default; set to false to opt out and handle
storage-version cleanup yourself. Sets TOOLHIVE_ENABLE_STORAGE_VERSION_MIGRATOR
in the operator deployment. Requires operator.rbac.scope=cluster — the
controller watches cluster-scoped CRDs and re-stores resources across all
namespaces, so the chart rejects this being true when scope is namespace.
operator.replicaCount
Type: int
Default: 1
Number of replicas for the operator deployment
operator.imagePullSecrets
Type: list
Default: []
List of image pull secrets to use
operator.defaultImagePullSecrets
Type: list
Default: []
List of image pull secrets that the operator applies as defaults to every
workload it spawns (proxy runners, vMCP servers, registry API, etc.). Per-CR
imagePullSecrets take precedence on name collisions; chart-level entries are
appended additively. The operator parses these once at startup from the
TOOLHIVE_DEFAULT_IMAGE_PULL_SECRETS environment variable. The Secrets must exist
in the namespace where each workload is created. Each entry may be either a
plain string (the Secret name) or an object with a name field, e.g.:
defaultImagePullSecrets: - regcred - name: otherscred The two shapes are
equivalent; the object form matches operator.imagePullSecrets above for
convenience.
operator.defaultRedis
Type: object
Default: {"addr":"","existingSecret":"","existingSecretKey":""}
Default Redis/Valkey address used by the operator when a workload CR has no sessionStorage configured. The operator injects this as TOOLHIVE_DEFAULT_REDIS_ADDR on pods it creates. When empty, no global Redis default is active. Override per-CR with spec.sessionStorage. global.redis.host (from a parent umbrella chart) is used as fallback when addr is empty here. Both express the same addr concept; addr takes precedence. For the password, reference a pre-existing Kubernetes Secret: defaultRedis: addr: "myredis.svc:6379" existingSecret: "redis-credentials" existingSecretKey: "password"
operator.defaultRedis.addr
Type: string
Default: ""
addr is the Redis/Valkey address (host:port).
operator.defaultRedis.existingSecret
Type: string
Default: ""
existingSecret is the name of a Secret containing the Redis password.
operator.defaultRedis.existingSecretKey
Type: string
Default: ""
existingSecretKey is the key within existingSecret that holds the password. Empty means use global.redis.existingSecretKey or fall back to "redis-password".
operator.image
Type: string
Default: "ghcr.io/stacklok/toolhive/operator:v0.51.4"
Container image for the operator
operator.imagePullPolicy
Type: string
Default: "IfNotPresent"
Image pull policy for the operator container
operator.toolhiveRunnerImage
Type: string
Default: "ghcr.io/stacklok/toolhive/proxyrunner:v0.51.4"
Image to use for Toolhive runners
operator.vmcpImage
Type: string
Default: "ghcr.io/stacklok/toolhive/vmcp:v0.51.4"
Image to use for Virtual MCP Server (vMCP) deployments
operator.imageDiscovery
Type: object
Default: {"enabled":false,"resources":{}}
Air-gap image-discovery aid. toolhiveRunnerImage, vmcpImage, and
registryAPI.image are never rendered as chart image: keys — the operator only
injects them into child workloads at runtime via env vars (TOOLHIVE_RUNNER_IMAGE
/ VMCP_IMAGE / TOOLHIVE_REGISTRY_API_IMAGE). Static manifest scanners used by
air-gap tooling (e.g. a vendor portal's image list generator) discover images by
reading image: keys out of helm template output, so they miss these three
and an air-gapped customer can hit ImagePullBackOff on the first MCPServer /
VirtualMCPServer / MCPRegistry create. Enabling this renders a replicas: 0
Deployment (<release-name>-image-discovery) whose pod template references all
three images. A zero-replica Deployment never has Kubernetes schedule a pod from
it, so the images are never pulled or run — this exists purely to put the refs
in front of a static manifest scan.
operator.imageDiscovery.enabled
Type: bool
Default: false
Render the zero-replica image-discovery Deployment described above.
operator.imageDiscovery.resources
Type: object
Default: {}
Resource requests/limits for the image-discovery Deployment's containers. Admission control (a LimitRange, an OPA/Kyverno policy requiring explicit requests) validates these at CREATE time even though replicas: 0 means nothing ever actually runs, so this is exposed separately from operator.resources for clusters that need it set.
operator.proxyHost
Type: string
Default: "0.0.0.0"
Host for the proxy deployed by the operator
operator.env
Type: list
Default: []
Environment variables to set in the operator container. Supported toolhive-specific variables include: - TOOLHIVE_SKIP_UPDATE_CHECK: set to "true" to disable the operator's periodic update check against the ToolHive update API. Also disables the usage-metrics collection that is gated on the same check.
operator.ports
Type: list
Default value
- containerPort: 8080
name: metrics
protocol: TCP
- containerPort: 8081
name: health
protocol: TCP
List of ports to expose from the operator container
operator.podAnnotations
Type: object
Default: {}
Annotations to add to the operator pod
operator.podLabels
Type: object
Default: {}
Labels to add to the operator pod
operator.podSecurityContext
Type: object
Default: {"runAsNonRoot":true}
Pod security context settings
operator.containerSecurityContext
Type: object
Default value
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
seccompProfile:
type: RuntimeDefault
Container security context settings for the operator
operator.livenessProbe
Type: object
Default:
{"httpGet":{"path":"/healthz","port":"health"},"initialDelaySeconds":15,"periodSeconds":20}
Liveness probe configuration for the operator
operator.readinessProbe
Type: object
Default:
{"httpGet":{"path":"/readyz","port":"health"},"initialDelaySeconds":5,"periodSeconds":10}
Readiness probe configuration for the operator
operator.autoscaling
Type: object
Default:
{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80}
Configuration for horizontal pod autoscaling
operator.autoscaling.enabled
Type: bool
Default: false
Enable autoscaling for the operator
operator.autoscaling.minReplicas
Type: int
Default: 1
Minimum number of replicas
operator.autoscaling.maxReplicas
Type: int
Default: 100
Maximum number of replicas
operator.autoscaling.targetCPUUtilizationPercentage
Type: int
Default: 80
Target CPU utilization percentage for autoscaling
operator.resources
Type: object
Default:
{"limits":{"cpu":"500m","memory":"128Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}
Resource requests and limits for the operator container
operator.gc
Type: object
Default: {"gogc":75,"gomemlimit":"110MiB"}
Go memory limits and garbage collection percentage for the operator container
operator.gc.gomemlimit
Type: string
Default: "110MiB"
Go memory limits for the operator container
operator.gc.gogc
Type: int
Default: 75
Go garbage collection percentage for the operator container
operator.rbac
Type: object
Default: {"allowedNamespaces":[],"scope":"cluster"}
RBAC configuration for the operator
operator.rbac.scope
Type: string
Default: "cluster"
Scope of the RBAC configuration. - cluster: The operator will have cluster-wide
permissions via ClusterRole and ClusterRoleBinding. - namespace: The operator
will have permissions to manage resources in the namespaces specified in
allowedNamespaces. The operator will have a ClusterRole and RoleBinding for
each namespace in allowedNamespaces.
operator.rbac.allowedNamespaces
Type: list
Default: []
List of namespaces that the operator is allowed to have permissions to manage. Only used if scope is set to "namespace".
operator.serviceAccount
Type: object
Default value
annotations: {}
automountServiceAccountToken: true
create: true
labels: {}
name: toolhive-operator
Service account configuration for the operator
operator.serviceAccount.create
Type: bool
Default: true
Specifies whether a service account should be created
operator.serviceAccount.automountServiceAccountToken
Type: bool
Default: true
Automatically mount a ServiceAccount's API credentials
operator.serviceAccount.annotations
Type: object
Default: {}
Annotations to add to the service account
operator.serviceAccount.labels
Type: object
Default: {}
Labels to add to the service account
operator.serviceAccount.name
Type: string
Default: "toolhive-operator"
The name of the service account to use. If not set and create is true, a name is generated.
operator.leaderElectionRole
Type: object
Default value
binding:
name: toolhive-operator-leader-election-rolebinding
name: toolhive-operator-leader-election-role
rules:
- apiGroups:
- ''
resources:
- configmaps
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- create
- patch
Leader election role configuration
operator.leaderElectionRole.name
Type: string
Default: "toolhive-operator-leader-election-role"
Name of the role for leader election
operator.leaderElectionRole.binding.name
Type: string
Default: "toolhive-operator-leader-election-rolebinding"
Name of the role binding for leader election
operator.leaderElectionRole.rules
Type: list
Default value
- apiGroups:
- ''
resources:
- configmaps
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
- apiGroups:
- events.k8s.io
resources:
- events
verbs:
- create
- patch
Rules for the leader election role
operator.volumes
Type: list
Default: []
Additional volumes to mount on the operator pod
operator.volumeMounts
Type: list
Default: []
Additional volume mounts on the operator container
operator.nodeSelector
Type: object
Default: {}
Node selector for the operator pod
operator.tolerations
Type: list
Default: []
Tolerations for the operator pod
operator.affinity
Type: object
Default: {}
Affinity settings for the operator pod
registryAPI
Type: object
Default: {"image":"ghcr.io/stacklok/thv-registry-api:v1.5.2"}
All values for the registry API deployment and associated resources
registryAPI.image
Type: string
Default: "ghcr.io/stacklok/thv-registry-api:v1.5.2"
Container image for the registry API