|
1 | | -# ToolHive Operator Helm Chart |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | -A Helm chart for deploying the ToolHive Operator into Kubernetes. |
7 | | - |
8 | | ---- |
9 | | - |
10 | | -## TL;DR |
11 | | - |
12 | | -```console |
13 | | -helm upgrade -i toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --create-namespace |
14 | | -``` |
15 | | - |
16 | | -Or for a custom values file: |
17 | | - |
18 | | -```consoleCustom |
19 | | -helm upgrade -i toolhive-operator oci://ghcr.io/stacklok/toolhive/toolhive-operator -n toolhive-system --create-namespace --values values-openshift.yaml |
20 | | -``` |
21 | | - |
22 | | -## Prerequisites |
23 | | - |
24 | | -- Kubernetes 1.25+ |
25 | | -- Helm 3.10+ minimum, 3.14+ recommended |
26 | | - |
27 | | -## Usage |
28 | | - |
29 | | -### Installing from the Chart |
30 | | - |
31 | | -Install one of the available versions: |
32 | | - |
33 | | -```shell |
34 | | -helm upgrade -i <release_name> oci://ghcr.io/stacklok/toolhive/toolhive-operator --version=<version> -n toolhive-system --create-namespace |
35 | | -``` |
36 | | - |
37 | | -> **Tip**: List all releases using `helm list` |
38 | | -
|
39 | | -### Uninstalling the Chart |
40 | | - |
41 | | -To uninstall/delete the `toolhive-operator` deployment: |
42 | | - |
43 | | -```console |
44 | | -helm uninstall <release_name> |
45 | | -``` |
46 | | - |
47 | | -The command removes all the Kubernetes components associated with the chart and deletes the release. You will have to delete the namespace manually if you used Helm to create it. |
48 | | - |
49 | | -## Values |
50 | | - |
51 | | -| Key | Type | Default | Description | |
52 | | -|-----|-------------|------|---------| |
53 | | -| fullnameOverride | string | `"toolhive-operator"` | Provide a fully-qualified name override for resources | |
54 | | -| nameOverride | string | `""` | Override the name of the chart | |
55 | | -| operator | object | `{"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"}},"env":{},"features":{"experimental":false,"registry":true,"server":true,"virtualMCP":true},"gc":{"gogc":75,"gomeglimit":"150MiB"},"image":"ghcr.io/stacklok/toolhive/operator:v0.7.2","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":[""],"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.7.2","vmcpImage":"ghcr.io/stacklok/toolhive/vmcp:v0.7.2","volumeMounts":[],"volumes":[]}` | All values for the operator deployment and associated resources | |
56 | | -| operator.affinity | object | `{}` | Affinity settings for the operator pod | |
57 | | -| operator.autoscaling | object | `{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80}` | Configuration for horizontal pod autoscaling | |
58 | | -| operator.autoscaling.enabled | bool | `false` | Enable autoscaling for the operator | |
59 | | -| operator.autoscaling.maxReplicas | int | `100` | Maximum number of replicas | |
60 | | -| operator.autoscaling.minReplicas | int | `1` | Minimum number of replicas | |
61 | | -| operator.autoscaling.targetCPUUtilizationPercentage | int | `80` | Target CPU utilization percentage for autoscaling | |
62 | | -| operator.containerSecurityContext | object | `{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"runAsUser":1000,"seccompProfile":{"type":"RuntimeDefault"}}` | Container security context settings for the operator | |
63 | | -| operator.env | object | `{}` | Environment variables to set in the operator container | |
64 | | -| operator.features.experimental | bool | `false` | Enable experimental features | |
65 | | -| operator.features.registry | bool | `true` | Enable registry controller (MCPRegistry). This automatically sets ENABLE_REGISTRY environment variable. | |
66 | | -| operator.features.server | bool | `true` | Enable server-related controllers (MCPServer, MCPExternalAuthConfig, MCPRemoteProxy, and ToolConfig). This automatically sets ENABLE_SERVER environment variable. | |
67 | | -| operator.features.virtualMCP | bool | `true` | Enable Virtual MCP aggregation features (VirtualMCPServer, MCPGroup controllers and webhooks). Set to false to disable Virtual MCP controllers when Virtual MCP CRDs are not installed. This automatically sets ENABLE_VMCP environment variable. Requires server to be enabled (server: true). | |
68 | | -| operator.gc | object | `{"gogc":75,"gomeglimit":"150MiB"}` | Go memory limits and garbage collection percentage for the operator container | |
69 | | -| operator.gc.gogc | int | `75` | Go garbage collection percentage for the operator container | |
70 | | -| operator.gc.gomeglimit | string | `"150MiB"` | Go memory limits for the operator container | |
71 | | -| operator.image | string | `"ghcr.io/stacklok/toolhive/operator:v0.7.2"` | Container image for the operator | |
72 | | -| operator.imagePullPolicy | string | `"IfNotPresent"` | Image pull policy for the operator container | |
73 | | -| operator.imagePullSecrets | list | `[]` | List of image pull secrets to use | |
74 | | -| operator.leaderElectionRole | object | `{"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":[""],"resources":["events"],"verbs":["create","patch"]}]}` | Leader election role configuration | |
75 | | -| operator.leaderElectionRole.binding.name | string | `"toolhive-operator-leader-election-rolebinding"` | Name of the role binding for leader election | |
76 | | -| operator.leaderElectionRole.name | string | `"toolhive-operator-leader-election-role"` | Name of the role for leader election | |
77 | | -| operator.leaderElectionRole.rules | list | `[{"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":[""],"resources":["events"],"verbs":["create","patch"]}]` | Rules for the leader election role | |
78 | | -| operator.livenessProbe | object | `{"httpGet":{"path":"/healthz","port":"health"},"initialDelaySeconds":15,"periodSeconds":20}` | Liveness probe configuration for the operator | |
79 | | -| operator.nodeSelector | object | `{}` | Node selector for the operator pod | |
80 | | -| operator.podAnnotations | object | `{}` | Annotations to add to the operator pod | |
81 | | -| operator.podLabels | object | `{}` | Labels to add to the operator pod | |
82 | | -| operator.podSecurityContext | object | `{"runAsNonRoot":true}` | Pod security context settings | |
83 | | -| operator.ports | list | `[{"containerPort":8080,"name":"metrics","protocol":"TCP"},{"containerPort":8081,"name":"health","protocol":"TCP"}]` | List of ports to expose from the operator container | |
84 | | -| operator.proxyHost | string | `"0.0.0.0"` | Host for the proxy deployed by the operator | |
85 | | -| operator.rbac | object | `{"allowedNamespaces":[],"scope":"cluster"}` | RBAC configuration for the operator | |
86 | | -| operator.rbac.allowedNamespaces | list | `[]` | List of namespaces that the operator is allowed to have permissions to manage. Only used if scope is set to "namespace". | |
87 | | -| operator.rbac.scope | string | `"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`. | |
88 | | -| operator.readinessProbe | object | `{"httpGet":{"path":"/readyz","port":"health"},"initialDelaySeconds":5,"periodSeconds":10}` | Readiness probe configuration for the operator | |
89 | | -| operator.replicaCount | int | `1` | Number of replicas for the operator deployment | |
90 | | -| operator.resources | object | `{"limits":{"cpu":"500m","memory":"128Mi"},"requests":{"cpu":"10m","memory":"64Mi"}}` | Resource requests and limits for the operator container | |
91 | | -| operator.serviceAccount | object | `{"annotations":{},"automountServiceAccountToken":true,"create":true,"labels":{},"name":"toolhive-operator"}` | Service account configuration for the operator | |
92 | | -| operator.serviceAccount.annotations | object | `{}` | Annotations to add to the service account | |
93 | | -| operator.serviceAccount.automountServiceAccountToken | bool | `true` | Automatically mount a ServiceAccount's API credentials | |
94 | | -| operator.serviceAccount.create | bool | `true` | Specifies whether a service account should be created | |
95 | | -| operator.serviceAccount.labels | object | `{}` | Labels to add to the service account | |
96 | | -| operator.serviceAccount.name | string | `"toolhive-operator"` | The name of the service account to use. If not set and create is true, a name is generated. | |
97 | | -| operator.tolerations | list | `[]` | Tolerations for the operator pod | |
98 | | -| operator.toolhiveRunnerImage | string | `"ghcr.io/stacklok/toolhive/proxyrunner:v0.7.2"` | Image to use for Toolhive runners | |
99 | | -| operator.vmcpImage | string | `"ghcr.io/stacklok/toolhive/vmcp:v0.7.2"` | Image to use for Virtual MCP Server (vMCP) deployments | |
100 | | -| operator.volumeMounts | list | `[]` | Additional volume mounts on the operator container | |
101 | | -| operator.volumes | list | `[]` | Additional volumes to mount on the operator pod | |
102 | | -| registryAPI | object | `{"image":"ghcr.io/stacklok/thv-registry-api:v0.4.8","serviceAccount":{"annotations":{},"automountServiceAccountToken":true,"labels":{},"name":"toolhive-registry-api"}}` | All values for the registry API deployment and associated resources | |
103 | | -| registryAPI.image | string | `"ghcr.io/stacklok/thv-registry-api:v0.4.8"` | Container image for the registry API | |
104 | | -| registryAPI.serviceAccount | object | `{"annotations":{},"automountServiceAccountToken":true,"labels":{},"name":"toolhive-registry-api"}` | Service account configuration for the registry API | |
105 | | -| registryAPI.serviceAccount.annotations | object | `{}` | Annotations to add to the registry API service account | |
106 | | -| registryAPI.serviceAccount.automountServiceAccountToken | bool | `true` | Automatically mount a ServiceAccount's API credentials | |
107 | | -| registryAPI.serviceAccount.labels | object | `{}` | Labels to add to the registry API service account | |
108 | | -| registryAPI.serviceAccount.name | string | `"toolhive-registry-api"` | The name of the service account to use for the registry API | |
109 | | - |
| 1 | +\n |
0 commit comments