Octopus
1.x
Docs/Octopus/Helm chart
Open

Reading4 min
Updated31 Jul 2026
Sourcev1/kubernetes/helm-chart.mdx

Helm chart

The Octopus Helm chart deploys the gateway with RBAC, health probes, a Service, a PodDisruptionBudget, and optional autoscaling and a Prometheus ServiceMonitor. It is published to the OCI registry oci://ghcr.io/xraph/charts as chart octopus, and the container image is ghcr.io/xraph/octopus.

helm install octopus oci://ghcr.io/xraph/charts/octopus \
  --namespace octopus --create-namespace

See Install for installation flows and CRD setup. The values below are the chart defaults; only documented keys exist.

Image & rollout01

FieldTypeDefaultDescription
replicaCountint2Replicas (ignored when autoscaling.enabled).
image.repositorystringghcr.io/xraph/octopusContainer image.
image.tagstring""Image tag; defaults to the chart appVersion.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretslist[]Pull secrets for private registries.
nameOverride / fullnameOverridestring""Override the generated resource names.
extraArgslist[]Extra args appended after serve --config /etc/octopus/config.yaml.
logLevelstringinfoRUST_LOG for the container.

Gateway config02

config is rendered verbatim into a ConfigMap as config.yaml and mounted at /etc/octopus/config.yaml. Add upstreams, routes, plugins, and auth here. The chart's default config includes the gateway listen/timeouts/probes and a kubernetes discovery backend under farp.discovery.

FieldTypeDefaultDescription
config.gateway.listenstring0.0.0.0:8080Listen address.
config.gateway.workersint0Worker threads (0 = auto).
config.gateway.request_timeoutduration30sPer-request timeout.
config.gateway.shutdown_timeoutduration30sMax wait for in-flight requests on shutdown.
config.gateway.pre_stop_delayduration5sDelay after SIGTERM before the server stops accepting.
config.gateway.probes.enabledbooltrueServe probe endpoints.
config.gateway.probes.liveness_pathstring/livezLiveness path.
config.gateway.probes.readiness_pathstring/readyzReadiness path.
config.gateway.probes.startup_pathstring/startupzStartup path.
config.gateway.probes.require_discovery_syncbooltrueGate readiness on the first discovery sync.
config.farp.enabledbooltrueEnable FARP (hosts the discovery backends).
config.farp.discovery.backendslist(kubernetes backend)Discovery backends — see Discovery.
config.observability.logging.level / .formatstringinfo / jsonLogging level and format.
Note

The default config does not set kubernetes.enabled, so the chart deploys the gateway with EndpointSlice discovery but without the operator. To run the operator, add a kubernetes: block under config (e.g. --set config.kubernetes.enabled=true). The full gateway config schema is in the configuration section.

Service discovery scope03

FieldTypeDefaultDescription
discovery.namespacestring""Namespace the gateway watches; empty watches all namespaces (needs cluster-scoped RBAC).

Service account & RBAC04

FieldTypeDefaultDescription
serviceAccount.createbooltrueCreate a ServiceAccount.
serviceAccount.namestring""Name (generated when empty).
serviceAccount.annotationsmap{}Annotations (e.g. IRSA/workload identity).
rbac.createbooltrueCreate RBAC resources.
rbac.clusterScopedbooltruetrueClusterRole/ClusterRoleBinding (watch all namespaces); false → namespaced Role/RoleBinding.
Warning

The namespaced Role (rbac.clusterScoped=false) only covers services, endpoints, and endpointslices. To reconcile cluster-wide Gateway API / Octopus CRDs, keep the default cluster-scoped RBAC.

Service05

FieldTypeDefaultDescription
service.typestringClusterIPService type.
service.portint8080Gateway port (http).
service.adminPortint9090Admin port (admin).
service.annotationsmap{}Service annotations.

The Service sets publishNotReadyAddresses: false so draining pods leave the EndpointSlice — see Probes & drain.

Pod & container06

FieldTypeDefaultDescription
terminationGracePeriodSecondsint45Must be ≥ pre_stop_delay + shutdown_timeout.
podAnnotations / podLabelsmap{}Extra pod metadata.
podSecurityContextmaprunAsNonRoot: true, uid/gid/fsGroup 1000Pod security context.
containerSecurityContextmapallowPrivilegeEscalation: false, readOnlyRootFilesystem: true, drop ALL capsContainer security context.
resources.requestsmapcpu: 100m, memory: 128MiResource requests.
resources.limitsmapcpu: "1", memory: 512MiResource limits.
nodeSelector / tolerations / affinity{} / [] / {}Scheduling.
topologySpreadConstraintslist[]Spread replicas across nodes/zones.
preStopHook.enabledboolfalseAdd a sleep preStop hook (set pre_stop_delay: 0 to avoid double-counting).
preStopHook.sleepSecondsint5preStop sleep duration.

Probes07

Kubernetes probe tuning (paths default to the gateway's probe paths). All three target the http port.

FieldTypeDefaultDescription
probes.startup.pathstring/startupzStartup probe path.
probes.startup.periodSecondsint2Startup probe period.
probes.startup.failureThresholdint30~60s startup budget.
probes.liveness.pathstring/livezLiveness probe path.
probes.liveness.periodSecondsint10Liveness probe period.
probes.liveness.failureThresholdint3Liveness failure threshold.
probes.readiness.pathstring/readyzReadiness probe path.
probes.readiness.periodSecondsint5Readiness probe period.
probes.readiness.failureThresholdint2Readiness failure threshold.

Metrics & ServiceMonitor08

FieldTypeDefaultDescription
metrics.pathstring/metricsPrometheus metrics path (served on the gateway port).
metrics.serviceMonitor.enabledboolfalseCreate a monitoring.coreos.com/v1 ServiceMonitor (needs the Prometheus Operator).
metrics.serviceMonitor.intervalduration30sScrape interval.
metrics.serviceMonitor.scrapeTimeoutduration10sScrape timeout.
metrics.serviceMonitor.labelsmap{}Extra labels (e.g. to match your Prometheus selector).

Autoscaling (HPA)09

FieldTypeDefaultDescription
autoscaling.enabledboolfalseCreate an autoscaling/v2 HorizontalPodAutoscaler.
autoscaling.minReplicasint2Minimum replicas.
autoscaling.maxReplicasint10Maximum replicas.
autoscaling.targetCPUUtilizationPercentageint80Target CPU utilization.
autoscaling.targetMemoryUtilizationPercentageint(unset)Target memory utilization (uncomment to enable).

PodDisruptionBudget10

FieldTypeDefaultDescription
podDisruptionBudget.enabledbooltrueCreate a policy/v1 PodDisruptionBudget.
podDisruptionBudget.minAvailableint/string1Minimum available pods.
podDisruptionBudget.maxUnavailableint/string(unset)Alternative to minAvailable.

Ingress (optional)11

For fronting the gateway with another ingress controller.

FieldTypeDefaultDescription
ingress.enabledboolfalseCreate an Ingress.
ingress.classNamestring""IngressClass name.
ingress.annotationsmap{}Ingress annotations.
ingress.hostslistgateway.example.com / PrefixHost/path rules.
ingress.tlslist[]TLS blocks.

For the gateway's own TLS termination (rather than fronting it), see TLS & cert-manager.