Skip to main content
Private Preview·Early access by invitation.Request access →
Kirimana.
Docs · Deploy

Deploy on plain Kubernetes

The kirimana deploy --cloud=azure path provisions a whole environment — AKS, managed Postgres, KeyVault, DNS, TLS — with one command. This page is for the other case: you already run a Kubernetes cluster and you want Kirimana on it, using the chart directly. The application layer is cloud-neutral, so the same Helm chart installs on any conformant cluster; only the surrounding infrastructure differs.

What the managed path does that this one doesn’t

kirimana deploy is an orchestrator. It runs Terraform to create the cluster and its dependencies, wires workload identity, seeds secrets, and then Helm-installs the chart. On a bring-your-own cluster you own the layers underneath the chart, and Kirimana owns only the chart:

ConcernManaged AKS pathPlain Kubernetes
ClusterCreated by TerraformYou bring it
PostgresAzure DB for PostgreSQL, provisioned + CMKYou bring a reachable Postgres
SecretsKeyVault + workload identity bindingYou wire a secret store / K8s Secrets
Ingress + TLSPublic IP, DNS delegation, cert-managerYou bring ingress + certificates
InstallHelm, invoked by the orchestratorHelm, invoked by you

The trade is control for convenience. You get to fit Kirimana into an existing platform — your ingress class, your Postgres, your secret manager — at the cost of assembling those pieces yourself.

Prerequisites

  • Kubernetes 1.28 or newer, conformant. The chart uses no provider-specific CRDs; a stock cluster is enough.
  • A reachable PostgreSQL for the automation database (14.x, 15.x, or 16.x are supported). Managed or in-cluster both work — the chart only needs a connection string.
  • Helm 3 and kubectl configured against the target cluster.
  • An ingress controller and a way to terminate TLS (cert-manager, or certificates you supply).
  • Your data-platform credentials — for Databricks, a Service Principal token with Unity Catalog and workspace permissions on the catalog you’ll target.
  • GitHub App credentials if you want Kirimana to open PRs on your DW project repo (App ID + private key). Optional for a read-first install; required for the GitOps write-back loop.

Install

Create a namespace and install the chart into it:

kubectl create namespace kirimana

helm install kirimana ./charts/kiriapp \
  --namespace kirimana \
  --values my-values.yaml

The multi-replica components (web, web-bff) carry a PodDisruptionBudget (minAvailable: 1), so an in-flight node drain can never evict the last healthy pod. The database migration runs as a bounded Job — its migration.activeDeadlineSeconds fails a hung migration rather than stalling the release. Keep any --timeout you pass on upgrades greater than or equal to that deadline so Helm waits for the Job’s own bound.

Values

A minimal my-values.yaml wires the three things the chart can’t infer: the database, how it reaches your data platform, and how users sign in.

postgres:
  # A connection to your Postgres. In-cluster or managed both work.
  host: postgres.data.svc.cluster.local
  database: kirimana
  # Prefer a secret reference over an inline value.
  passwordSecret:
    name: kirimana-postgres
    key: password

ingress:
  enabled: true
  className: nginx
  host: kirimana.example.com
  tls:
    enabled: true
    secretName: kirimana-tls

auth:
  # OIDC issuer + client for your IdP (Azure AD / Okta / etc.).
  issuer: https://login.example.com/oidc
  clientId: kirimana-web

github:
  # Optional — enables the PR write-back loop.
  appId: "123456"
  privateKeySecret:
    name: kirimana-github-app
    key: private-key.pem

Your DW project’s own kiri.yml — not the chart — describes the data platform target. On Databricks:

adapter: databricks
default_target: prod
targets:
  prod:
    adapter: databricks
    host: https://adb-xxxx.azuredatabricks.net
    warehouse_id: w-abc123
    catalog: acme_prod
    schema: bronze
    token: ${vault:databricks/prod:token}

Store the Databricks Service Principal token in whatever secret store your ${vault:...} resolver is bound to, never inline in the committed YAML.

Health checks

The chart ships readiness and liveness probes on each component; a successful helm install waits for them. Confirm the rollout landed:

kubectl get pods -n kirimana
kubectl rollout status deployment/kiriapp-web -n kirimana
kubectl rollout status deployment/kiriapp-web-bff -n kirimana

Then check the application’s own end-to-end wiring — cluster identity, secret resolution, and data-platform reachability — from inside a pod or from your CLI against the same target:

kirimana doctor

kirimana doctor runs the same three checks the managed path runs after deploy: the secret store holds the data-platform token at the expected path, the workload can resolve it, and the data platform accepts it. For Databricks specifically:

kiri databricks health --target prod

Once doctor is green and the ingress resolves, open your host over HTTPS and sign in with your IdP. Users who see “Access denied” need an RBAC role granted (viewer, approver, or platform-admin); that is an authorization step, not an install failure.

Upgrading

Upgrades follow the same atomic path as the managed deployment. Capture a restorable snapshot first, then upgrade with rollback-on-failure:

kiri upgrade snapshot --out ./.kiri-snapshots

helm upgrade kirimana ./charts/kiriapp \
  --namespace kirimana \
  --values my-values.yaml \
  --atomic --timeout=15m

--atomic rolls the whole release — including the migration Job — back to the prior good revision if any pod fails readiness or the migration exhausts its deadline. If you need to reverse a completed upgrade, kiri upgrade rollback --snapshot ./.kiri-snapshots --namespace kirimana reverses the Helm release and restores Postgres from the snapshot. Run kiri upgrade --check before any minor bump to see the kiri.yml and values-schema changes the new release expects.

Where next

Updated 5 July 2026 · v1.0.0-beta.1