Skip to content

Kubernetes

The Oriel Helm chart is published from Arbor. It can run bundled PostgreSQL, ClickHouse, and Valkey for a cluster test, or point Oriel at external datastores for production.

  • Kubernetes cluster with a default StorageClass when bundled databases are used
  • Helm 3 or newer
  • Network access to the Arbor Helm repository
  • Oriel image available at arbor.klado.dev/oriel/oriel

The chart default image repository is arbor.klado.dev/oriel/oriel. When image.tag is empty, the chart uses its appVersion; set image.tag only when you need to override the image tag separately from the chart version.

Add the Helm repository:

Terminal window
helm repo add oriel https://arbor.klado.dev/api/packages/oriel/helm
helm repo update

Install Oriel with bundled PostgreSQL, ClickHouse, and Valkey:

Terminal window
helm install oriel oriel/oriel --namespace oriel --create-namespace

Pin a production install to a chart version:

Terminal window
helm install oriel oriel/oriel \
--namespace oriel \
--create-namespace \
--version 0.2.0

The default install creates a Secret named oriel-db-auth for database passwords, Oriel DSNs, and ORIEL_AUTH_COOKIE_SECRET. Generated values are preserved on upgrade while the Secret remains in the cluster.

Create a Secret with the Oriel application DSNs:

Terminal window
kubectl create secret generic oriel-external \
--namespace oriel \
--from-literal=ORIEL_METADATA_DSN='postgres://oriel:...@postgres.example.com:5432/oriel' \
--from-literal=ORIEL_CLICKHOUSE_DSN='clickhouse://oriel:...@clickhouse.example.com:9000/oriel' \
--from-literal=ORIEL_VALKEY_DSN='valkey://:...@valkey.example.com:6379/0' \
--from-literal=ORIEL_AUTH_COOKIE_SECRET='replace-with-a-stable-random-secret'

Install with bundled databases disabled:

Terminal window
helm install oriel oriel/oriel \
--namespace oriel \
--create-namespace \
--set postgresql.enabled=false \
--set clickhouse.enabled=false \
--set valkey.enabled=false \
--set oriel.secrets.existingAppSecret=oriel-external

To have the chart create the Oriel Secret while using external stores, leave oriel.secrets.existingAppSecret empty and set:

postgresql:
enabled: false
clickhouse:
enabled: false
valkey:
enabled: false
oriel:
secrets:
externalMetadataDsn: postgres://oriel:...@postgres.example.com:5432/oriel
externalClickhouseDsn: clickhouse://oriel:...@clickhouse.example.com:9000/oriel
externalValkeyDsn: valkey://:...@valkey.example.com:6379/0
cookieSecret: replace-with-a-stable-random-secret

The chart creates separate Services for API/UI, OTLP gRPC, and OTLP HTTP:

Service Default port
API/UI 6743
OTLP gRPC 4317
OTLP HTTP 4318

Services default to ClusterIP. Set service.*.type to NodePort or LoadBalancer when the cluster exposes traffic directly. Use ingress.api, ingress.otlpHttp, and ingress.otlpGrpc for controller-managed ingress.

Set oriel.config.server.publicUrl to the externally visible HTTPS URL when the UI/API is behind ingress or a proxy.

Default mode runs one Deployment:

oriel:
roleMode: all

Split mode runs query, ingest, and worker Deployments:

oriel:
roleMode: split
replicas:
query: 2
ingest: 2
worker: 1

In split mode, the API Service targets query pods and OTLP Services target ingest pods.

The checked-in values-production.yaml is a production baseline for split-role deployments. With the hosted chart, copy it into your release configuration and upgrade from the Arbor repo:

Terminal window
helm upgrade --install oriel oriel/oriel \
--namespace oriel \
--create-namespace \
-f values-production.yaml \
--version 0.2.0

The overlay runs split deployments, disables plaintext non-loopback binds, turns on NetworkPolicy rendering, enables a PodDisruptionBudget, sets per-role resources and per-role config, spreads pods across zones, and autoscales query and ingest.

Use the local chart path when you are changing chart templates or testing this repository checkout:

Terminal window
helm dependency build deploy/k8s
helm install oriel deploy/k8s --namespace oriel --create-namespace

Render and lint the checked-in chart before submitting chart changes:

Terminal window
helm lint deploy/k8s
helm template oriel deploy/k8s
helm template oriel deploy/k8s -f deploy/k8s/values-production.yaml

Run the Helm test:

Terminal window
helm test oriel -n oriel

Bootstrap the first admin:

Terminal window
kubectl exec -n oriel deploy/oriel -- \
env ORIEL_BOOTSTRAP_PASSWORD='change-me' \
oriel admin bootstrap --email you@example.com

Create a workspace:

Terminal window
kubectl exec -n oriel deploy/oriel -- oriel admin create-workspace --slug demo

These examples use the default all-in-one deployment. In split mode, run the commands against deploy/oriel-query.

Check pods and migration state:

Terminal window
kubectl get pods -n oriel
kubectl exec -n oriel deploy/oriel -- oriel migrate status

If readiness returns ORL-5002, run migrations with the same environment as the pods:

Terminal window
kubectl exec -n oriel deploy/oriel -- oriel migrate up

If login or OIDC callbacks fail, confirm oriel.config.server.publicUrl matches the external HTTPS URL.