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