Skip to main content

Helm Chart Values

The values you are likely to set, grouped by what you are trying to do. Anything not listed here is an internal default or a passthrough to a subchart.

The chart is open source at nudgebee/k8s-agent. If this page and values.yaml disagree, the chart is right.

Subcharts

RepositoryNameVersionCondition
https://charts.bitnami.com/bitnamiclickhouse3.1.*opentelemetry-collector.enabled
https://open-telemetry.github.io/opentelemetry-helm-chartsopentelemetry-collector0.165.0opentelemetry-collector.enabled

Required

KeyTypeDefaultDescription
runner.nudgebee.auth_secret_keystring""Agent auth key from Admin → Integrations → Kubernetes Clusters. The backend derives the account and cluster from this key.
runner.nudgebee.endpointstringhttps://collector.nudgebee.comCollector URL. Self-hosted: https://collector.yourcompany.com.
runner.relay_addressstringwss://relay.nudgebee.com/registerRelay WebSocket URL. Self-hosted: wss://relay.yourcompany.com/register.
globalConfig.prometheus_urlstring""Prometheus/Thanos/VictoriaMetrics query URL. Empty = auto-discover in-cluster.

Auth key from an existing Secret

If something else creates the credential — External Secrets, a parent chart, your own pipeline — point the agent at that Secret instead of putting the key in your values. Setting this and auth_secret_key together fails the install rather than silently picking one.

runner:
nudgebee:
authSecretKeyFrom:
name: my-existing-secret
key: NUDGEBEE_AUTH_SECRET_KEY

Permissions and access mode

A default install can already act on workloads: delete and evict pods, exec into them, cordon nodes, restart rollouts, scale Deployments and ReplicaSets, patch HPAs, manage PrometheusRules, and read Secrets. Two values change that in either direction.

KeyTypeDefaultDescription
runner.enableWritePermissionsboolfalseAdds the cluster-shape permissions the default install leaves out: node delete, Service/Endpoint/ServiceAccount management, Secret update and delete, namespace create and delete, ResourceQuota and LimitRange writes, statefulsets/scale, workload creation, Ingress and NetworkPolicy writes, rollout lifecycle.
runner.readOnlyboolfalseCuts the ClusterRole down to get, list, watch. No Secrets access at all, no pods/exec, no eviction, no node patch. The few writes the agent needs to run come from a Role scoped to the release namespace.
runner.mutateEnabledbooltrueTurns the runner's mutating actions on or off inside the agent itself (delete_pod, cordon, rollout_restart, PrometheusRule CRUD, Alertmanager silences, Loki rules). With false they are never registered at startup, whatever RBAC allows.
runner.scannerAutoCopyPullSecretsboolfalseLets an image scan copy the scanned pod's imagePullSecrets into the scanner namespace so private images can be pulled. Also grants secret update, patch, and delete in the release namespace to clean the copies up afterwards.
runner.customClusterRoleRuleslist[]Extra rules appended to the runner ClusterRole.
runnerServiceAccount.imagePullSecretslist[]Pull secrets attached to the runner ServiceAccount.
automountServiceAccountTokenbooltrueMount the ServiceAccount token in agent pods.
CapabilityDefaultenableWritePermissionsreadOnly
Read cluster inventory and metricsyesyesyes
Scanner Jobs and script-runner in the release namespaceyesyesyes
Create and edit PrometheusRules from the UIyesyesrelease namespace only
Exec, terminal, profiling into a podyesyesrelease namespace only
Read Secretsyesyesno
Delete or evict a pod, cordon a node, restart a rolloutyesyesno
Scale a Deployment or ReplicaSet, apply a rightsizingyesyesno
Delete a nodenoyesno
Create a workload or namespacenoyesno
Write Services, Ingresses, NetworkPolicies, Secretsnoyesno
Scale a StatefulSetnoyesno

To switch modes on an existing install:

helm upgrade nudgebee-agent nudgebee-agent/nudgebee-agent \
-n nudgebee-agent --reuse-values \
--set runner.enableWritePermissions=true # or runner.readOnly=true

readOnly cannot be combined with enableWritePermissions or scannerAutoCopyPullSecrets. The install fails if you set both.

Under readOnly the rightsizing recommendations still compute; you just cannot apply them from the UI. If your security review needs to see the exact permissions first, the whole read-only ClusterRole is in one file: runner-service-account-readonly.yaml.

If what you want is for the agent not to act, rather than for its ServiceAccount to lose the permission, mutateEnabled: false is the smaller change. The actions are never registered and the RBAC stays as it is.

Actions triggered from the UI

runner:
nudgebee:
relay_signing_public_key: "<server SIGNING_PUBLIC_KEY>"

This is the relay's Ed25519 public key. The agent uses it to check that a request really came from the relay before running a workload mutation. Leave it empty and those requests are rejected with 401 no matter what RBAC allows. The install command generated by the UI fills it in for you; you only set it by hand when writing your own values file for a self-hosted server.


Metrics backend

KeyTypeDefaultDescription
globalConfig.prometheus_urlstring""Query URL for Prometheus, Thanos Query, Mimir, VictoriaMetrics, Chronosphere, AMP.
globalConfig.prometheus_headersstring""Comma-separated Header: value pairs (static auth header).
globalConfig.prometheus_additional_labelsobject{}Labels appended to every PromQL query, e.g. {k8s_cluster: aws-prod}.
runner.prometheus.auth.coralogixTokenstring""Coralogix token (sent as the token header).
runner.prometheus.auth.awsAccessKey / awsSecretAccessKey / awsRegion / awsServiceNamestring""AWS SigV4 for Amazon Managed Prometheus. serviceName defaults to aps.
runner.prometheus.auth.azureUseManagedId / azureClientId / azureClientSecret / azureTenantId / azureResourcestring""Azure AD for Azure Monitor managed Prometheus.

In-cluster Prometheus needs none of the auth values. Use them for managed backends that sign requests rather than accepting a static header. If more than one is filled in, AWS wins, then Coralogix, then Azure. Endpoint formats for each backend are in Prometheus Metrics Integrations.


Alerts

These values only control the alert rules the chart ships. Getting alerts to the agent is a separate job that happens in your Alertmanager: see Alert Forwarding.

KeyTypeDefaultDescription
alertmanager.create_nb_default_rulesbooltrueRender NudgeBee's default PrometheusRule set.
alertmanager.extra_rule_exclusionslist[]Silences the default log-error and API-failure rules for workloads you expect to fail, such as demo or load-test apps. Each term is matched as a substring of /k8s/<namespace>/<pod>/<container>, so a namespace name excludes everything in it: ["demo", "nb-bench"].
alertmanager.rule_keep_firing_forstring""Keeps the flappy rules firing through short dips instead of resolving and re-firing, e.g. "10m". Set it only if every rule evaluator in the cluster understands keep_firing_for. Prometheus older than 2.42 rejects the entire rule file when it sees the field, which takes down all the rules in it.

Logs

KeyTypeDefaultDescription
runner.loki.urlstring""Loki endpoint.
runner.loki.headersstring""Extra headers (e.g. X-Scope-OrgID: tenant).
runner.loki.username / passwordstring""Optional HTTP basic auth.
runner.es.enabledboolfalseElasticsearch is off unless you set both enabled: true and url, so a leftover url never quietly takes over from another logs provider.
runner.es.url / apiKeystring""Elasticsearch endpoint and API key.
runner.es.headersstring""Extra request headers, comma-separated Key: Value pairs. For OpenSearch-compatible services that authenticate on a custom header — Logz.io uses X-API-TOKEN.
runner.es.sslVerifyboolfalseVerify the ES TLS certificate (https URLs).
runner.signoz.urlstring""SigNoz endpoint.
runner.signoz.apiKey / user / passwordstring""apiKey takes precedence over user/password.

See Logging Integration.


Traces

KeyTypeDefaultDescription
opentelemetry-collector.enabledbooltrueIn-cluster OTel collector writing to the bundled ClickHouse.
clickhouse.enabledbooltrueBundled ClickHouse for traces/logs storage.
clickhouse.persistence.sizestring50GiClickHouse PVC size.
clickhouse.auth.passwordstring""Empty = the subchart generates one on first install, stored in the <release>-clickhouse Secret under admin-password.
runner.clickhouse_enabledbooltrueRunner reads traces from ClickHouse.
runner.clickhouse_secretstring""Secret holding the ClickHouse password (key admin-password). Empty = the bundled <release>-clickhouse Secret.
runner.jaeger.queryUrl / tokenstring""In-cluster Jaeger query endpoint for jaeger_query_* actions.
runner.chronosphere.url / apiKeystring""Chronosphere trace queries.
runner.chronosphere.tracesEnabledbooltrueReport Chronosphere as the traces provider when url is set.
runner.chronosphere.tracesUrlstring""Explicit traces URL; empty falls back to prometheus_url when it points at chronosphere.io.
runner.pinot.url / authToken / username / passwordstring""Apache Pinot broker.
runner.grafana.url / username / password / extra_headersstring""Grafana endpoint the agent proxies UI requests to. extra_headers is semicolon-separated.

See Tracing Integration.


Runner sizing

If the runner is getting OOMKilled, this is the section you want. Its memory is dominated by the informer cache, so it scales with the number of objects in the cluster, not with traffic.

KeyTypeDefaultDescription
runner.resources.requests.cpustring250m
runner.resources.requests.memorystring1000Mi
runner.resources.limits.memorystring2000MiBudget roughly 1Gi per 50k watched objects. Under 100 nodes the default is fine; around 500 nodes use 4000Mi; around 1000 nodes use 6000Mi or more.
runner.goMemLimitRatiofloat0.8How much of the memory limit the Go heap may use, with the rest left for non-heap memory. The chart derives GOMEMLIMIT from the limit and this ratio, so the GC knows about the ceiling instead of finding it via a SIGKILL. Lower it if the pod still OOMs at a limit you think is generous.
runner.goMemLimitstring""Sets GOMEMLIMIT directly, e.g. 1600MiB, and skips the calculation above.
runner.probes.enabledbooltrueLiveness and readiness probes against /healthz on port 5000.
runner.scaling.snapshotBatchingbooltrueSends the full inventory snapshot in batches rather than one payload.
runner.scaling.batchSizeint1000Objects per snapshot batch.
runner.scaling.incrementalBatchSizeint100How many informer events are coalesced into one POST.
runner.scaling.emitTombstonesbooltrueReports deletions so the backend drops objects that no longer exist.
runner.pprofboolfalseExposes net/http/pprof on the runner. The endpoints are unauthenticated, so turn it on for a debugging session and off again.
runner.tolerations / nodeSelector / annotations / affinityStandard scheduling controls.
runner.extraVolumes / extraVolumeMountslist[]Extra volumes on the runner pod.
runner.additional_env_varslistCLICKHOUSE_PORT, CLICKHOUSE_USER, CLICKHOUSE_DBExtra environment variables on the runner. Helm replaces lists rather than merging them, so if you set this, re-state the three CLICKHOUSE_* entries from the chart.

Node agent (eBPF)

KeyTypeDefaultDescription
nodeAgent.enabledbooltrueeBPF DaemonSet for network metrics, logs, and profiles.
nodeAgent.image.repositorystringghcr.io/nudgebee/node-agent
nodeAgent.image.tagstring0.1.5
nodeAgent.resources.requestsobject100m / 500Mi
nodeAgent.resources.limitsobject1 / 1Gi
nodeAgent.podmonitor.enabledbooltrueRender a PodMonitor so Prometheus scrapes the node agent.
nodeAgent.podmonitor.additionalLabelsobject{}These have to match your Prometheus CR's podMonitorSelector. If they do not, the operator ignores the PodMonitor, no scrape target is created, and network metrics stay empty with nothing reporting an error. Example: {pod-monitor: pod-monitor}.
nodeAgent.podmonitor.namespaceSelectorobject{}Which namespaces Prometheus looks in for the pods. Empty means the PodMonitor's own namespace. Example: {matchNames: [nudgebee-agent]} or {any: true}.
nodeAgent.podmonitor.azuremanagedboolfalseEmits the azmonitoring.coreos.com PodMonitor that Azure Monitor managed Prometheus reads instead.
nodeAgent.priorityClassNamestring""
nodeAgent.envlistsee chartIncludes SENSITIVE_HEADERS, the header names the node agent strips from captured traffic.

Without the prometheus-operator there is no PodMonitor to create. Scrape the node agent with the job from kube-prometheus-stack-values.yaml instead. More detail in Node Agent Configuration.


Event watcher (kubewatch)

KeyTypeDefaultDescription
kubewatch.image.repositorystringghcr.io/nudgebee/kubewatch
kubewatch.image.tagstring2.14.1-nb.2
kubewatch.config.namespacestring""Restrict watching to one namespace. Empty = all.
kubewatch.config.resource.*boolsee chartPer-resource watch toggles. secret and coreevent are off by default; replicationcontroller is unsupported.
kubewatch.resources.requestsobject10m / 512Mi

Platform-specific

KeyTypeDefaultDescription
openshift.enabledboolfalseRender OpenShift SCCs.
openshift.createSccbooltrueBaseline SCC.
openshift.createPrivilegedSccboolfalsePrivileged SCC (node agent eBPF).
openshift.sccName / privilegedSccName / sccPriority / privilegedSccPrioritynullOverrides.
enablePrometheusStackbooltrueAsserts that the prometheus-operator CRDs (ServiceMonitor, PodMonitor, PrometheusRule) are registered, so those manifests still render during offline templating (Argo CD, Flux). Set false on a cluster with no operator.
enableServiceMonitorsbooltrueRender ServiceMonitors for agent components.
nameOverride / fullnameOverridestring""Resource naming.
globalConfig.custom_annotationsobject{}Annotations added to all agent pods.

Installing where there is no Prometheus operator

The install fails on unregistered CRDs unless you turn off both of these. The ClickHouse subchart also emits monitoring.coreos.com resources, and a parent chart can only flip a subchart's values, not add a condition to its templates, so it needs its own flag:

--set enablePrometheusStack=false \
--set clickhouse.metrics.serviceMonitor.enabled=false

Component names

Names come from the release name, which is what you need when writing an Alertmanager receiver URL or tailing logs. For a release named nudgebee-agent:

ComponentKindName
RunnerDeployment / Servicenudgebee-agent-runner (Service port 80 → container 5000)
Event watcherDeploymentnudgebee-agent-forwarder
Node agentDaemonSetnudgebee-agent-node-agent (pod label app=nudgebee-node-agent)
ClickHouseStatefulSet / Servicenudgebee-agent-clickhouse-shard0 / nudgebee-agent-clickhouse
OTel collectorDeployment / Servicenudgebee-agent-opentelemetry-collector