orkestra

module
v0.7.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 3, 2026 License: Apache-2.0

README

Orkestra

Orkestra

A runtime for Kubernetes operators.

Declare. Run.

Go Report Card Release Artifact Hub Go Kubernetes License

Quick Start · Docs · Discussions · Early Access Slack


You have a CRD. Kubernetes stores it, validates it, and serves it.

The only missing piece is something that watches it and acts on it.

Traditionally that means Go: informers, workqueues, reconcile loops, code generation, Dockerfiles, Helm charts — a software project per operator. Most engineers never start. Teams that do spend weeks before the first CR reconciles.

Orkestra removes that entirely.


Declare

apiVersion: orkestra.orkspace.io/v1
kind: Katalog
metadata:
  name: website-operator
spec:
  crds:
    website:
      crdFile: ./crd.yaml
      crFiles: [./cr.yaml]
      operatorBox:
        onCreate:
          deployments:
            - name: "{{ .metadata.name }}"
              image: "{{ .spec.image }}"
              replicas: "{{ .spec.replicas }}"
              reconcile: true
          services:
            - name: "{{ .metadata.name }}-svc"
              port: 80
              targetPort: "{{ .spec.port }}"
              reconcile: true

That is the whole operator.

Run

ork run

Orkestra reads the Katalog, applies the CRD and CR, starts the operator, creates the Deployment and Service, sets owner references on both, writes status, emits Kubernetes events, corrects drift, and exposes health, metrics, and a control center.

Not a single line of Go.

Your CRD is enough. The rest is just a Katalog.


What every CRD gets

Every CRD declared in a Katalog becomes a complete, isolated operator. Nothing to configure.

Informer Watches your exact GVK. In-memory cache. Zero API calls on read.
Workqueue Per-CRD. Rate-limited. Deduplicated. Isolated from every other CRD.
Worker pool Configurable concurrency. A panic in one CRD does not affect any other.
Drift correction reconcile: true — desired state is enforced on every cycle.
Owner references Child resources deleted when the CR is deleted. No onDelete logic needed.
Finalizers CRs protected from dirty deletion automatically.
Events Every reconcile is a traceable Kubernetes event.
Leader election One active instance. Followers hold warm caches. Failover in under 15s.
Status Ready condition + your own status fields written after every reconcile.
Health API /katalog/{crd}/health, /katalog/{crd}/cr, /metrics — per CRD.
Prometheus metrics Reconcile totals, queue depth, error rate — labeled by GVK.
Deletion protection Orkestra and everything it manages cannot be accidentally kubectl delete.
Control Center Realtime visibility per CRD, per Katalog, across instances. Auto-generated operator docs — overview, reconcile mode, child resources, kubectl reference, access control.

Getting started

Install

# Install (macOS)
brew install orkspace/tap/ork orkspace/tap/orkcc

# Install (Linux)
curl -sSL https://get.orkestra.sh | bash

Windows Download ork_windows_amd64.zip and orkcc_windows_amd64.zip from the latest release.
Extract the archives and add the folder containing ork.exe and orkcc.exe to your PATH.

Initialize and run

ork init
ork run

No cluster? Add --dev to create a temporary kind cluster. Requires Docker.

ork init scaffolds a katalog.yaml, crd.yaml, and cr.yaml in the current directory — like terraform init.

Learning to Orkestrate — the guided path from first operator to full platform. Every capability has a runnable example.


Control Center

In another terminal:

ork control

→ localhost:8081 · username:password → orkestra

Six Runtimes. 75 CRDs. One Control Center.

Live deployment: cc.orkestra.sh


Numbers

Traditional (75 operators) Orkestra
Processes 75 6 runtimes + 1 control center
Memory 3.75 GB – 15 GB ~79 MB per runtime (measured)
CRDs under management 75 75
First operator 3–6 weeks Under 1 hour
Lines of Go 400+ per operator 0
Adding a new CRD Days to weeks Minutes

79 MB is a live measurement from a 10-CRD runtime (process_resident_memory_bytes from the /metrics endpoint — raw scrape). The memory reduction works because Orkestra pays the cost of client-go, leader election, and health servers once per runtime. Per-CRD cost is a goroutine pool and an in-memory cache. Isolation works the same way kube-controller-manager isolates Deployment, StatefulSet, and Job controllers — dedicated informer, queue, and worker pool per CRD. A panic in one is caught by safeReconcile; the others keep running. The Control Center aggregates all runtimes into a single dashboard.


What Orkestra is not

Orkestra is not an operator — it is a runtime for Kubernetes behaviour. Each CRD you declare in a Katalog becomes an operator. Orkestra itself is the runtime that runs them.

CRD generation is a starting point, not the source of truth. ork generate crd scaffolds a base CRD from your Katalog. You own the final schema — add validation, printer columns, and version history to it. crdFile just points to whatever CRD file you maintain.

It does not replace Go for complex logic. Hooks and constructors exist for exactly this reason. ~90% of operators are declarative structure; ~10% need code. Orkestra handles the 90% and gives the 10% a clean interface.

External infrastructure providers are in development. For AWS, MongoDB, or cloud DNS alongside Kubernetes resources, use Crossplane for external infrastructure and Orkestra for the application layer. The two complement each other.

It does not auto-sync from Git. Configuration is resolved at startup and locked in. Katalogs define long-lived API contracts; silently reloading them is dangerous. Use a deployment pipeline like any other runtime change.


Documentation

Why Orkestra What Orkestra is, how it works, and why it’s different
Foundations The decisions that shaped the design — and why they hold
Trust and Failure Model What happens when things go wrong
Getting Started First operator in under an hour
Learning to Orkestrate Every capability, as a runnable example
Katalog Reference Complete field reference
Orkestra Registry OCI distribution for operators
Security How Orkestra is secure by default

Community

Issues · Discussions · Contributing


Apache 2.0 — see LICENSE

Directories

Path Synopsis
cmd
cli
devserver command
Package main is the standalone entry point for the Orkestra dev server.
Package main is the standalone entry point for the Orkestra dev server.
internal
cmd/internal/gateway.go
cmd/internal/gateway.go
orkestra command
Package main is the entry point for the Orkestra CLI (ork).
Package main is the entry point for the Orkestra CLI (ork).
domain/generic.go
domain/generic.go
hack
generate-notes command
hack/generate-notes/main.go
hack/generate-notes/main.go
pkg
autoscaler
pkg/autoscaler/autoscale_cross_metrics.go
pkg/autoscaler/autoscale_cross_metrics.go
certmanager
Package certmanager centralises the TLS certificate lifecycle for Orkestra.
Package certmanager centralises the TLS certificate lifecycle for Orkestra.
children
pkg/children/builtins.go
pkg/children/builtins.go
devserver
Package devserver provides a lightweight mock HTTP server for local development.
Package devserver provides a lightweight mock HTTP server for local development.
e2e
Package e2e implements the orchestration loop for `ork e2e`.
Package e2e implements the orchestration loop for `ork e2e`.
generate
pkg/generat/crd_generator.go
pkg/generat/crd_generator.go
health
health/admission_stats.go
health/admission_stats.go
informer
pkg/informer/factory.go
pkg/informer/factory.go
katalog
pkg/katalog/admission_registry.go
pkg/katalog/admission_registry.go
konfig
pkg/konfig/ork.go
pkg/konfig/ork.go
kordinator
pkg/kordinator/cr_children.go
pkg/kordinator/cr_children.go
kubeclient
pkg/kubeclient/context.go
pkg/kubeclient/context.go
labels
Package labels defines all label, annotation, and finalizer constants used by the Orkestra control plane.
Package labels defines all label, annotation, and finalizer constants used by the Orkestra control plane.
logger
pkg/logger/context.go
pkg/logger/context.go
merger
pkg/merger/file.go
pkg/merger/file.go
metrics
pkg/metrics/autoscale.go
pkg/metrics/autoscale.go
migrate
pkg/migrate/generator.go
pkg/migrate/generator.go
motif
pkg/motif/expander.go
pkg/motif/expander.go
note
pkg/note/git_docker.go
pkg/note/git_docker.go
notification
pkg/notification/email.go
pkg/notification/email.go
ork
profiles
Package profiles provides named presets — resource, security, probe, and autoscaler — that expand into fully-formed Orkestra types at katalog load time.
Package profiles provides named presets — resource, security, probe, and autoscaler — that expand into fully-formed Orkestra types at katalog load time.
provider/aws
pkg/providers/aws/provider.go
pkg/providers/aws/provider.go
provider/azure
pkg/provider/azure/provider.go
pkg/provider/azure/provider.go
provider/google
pkg/provider/google/provider.go
pkg/provider/google/provider.go
provider/mongo
pkg/providers/mongodb/provider.go
pkg/providers/mongodb/provider.go
provider/mysql
pkg/provider/mysql/provider.go
pkg/provider/mysql/provider.go
provider/postgres
pkg/provider/postgres/provider.go
pkg/provider/postgres/provider.go
provider/redis
pkg/provider/redis/provider.go
pkg/provider/redis/provider.go
queue
pkg/queue/registry.go
pkg/queue/registry.go
reconciler
pkg/reconciler/conditions.go
pkg/reconciler/conditions.go
registry
pkg/registry/client.go
pkg/registry/client.go
resources/clusterrolebindings
pkg/resources/clusterrolebindings/clusterrolebinding.go
pkg/resources/clusterrolebindings/clusterrolebinding.go
resources/clusterroles
pkg/resources/clusterroles/clusterrole.go
pkg/resources/clusterroles/clusterrole.go
resources/common
pkg/resources/common/probes.go
pkg/resources/common/probes.go
resources/configmaps
pkg/resources/configmaps/configmap.go
pkg/resources/configmaps/configmap.go
resources/cronjobs
pkg/resources/cronjobs/cronjob.go
pkg/resources/cronjobs/cronjob.go
resources/customresources
pkg/resources/customresources/customresources.go
pkg/resources/customresources/customresources.go
resources/deployments
pkg/resources/deployments/deployment.go
pkg/resources/deployments/deployment.go
resources/hpas
pkg/resources/hpas/hpa.go
pkg/resources/hpas/hpa.go
resources/ingresses
pkg/resources/ingresses/ingress.go
pkg/resources/ingresses/ingress.go
resources/jobs
pkg/resources/jobs/job.go
pkg/resources/jobs/job.go
resources/limitranges
pkg/resources/limitranges/limitrange.go
pkg/resources/limitranges/limitrange.go
resources/namespaces
pkg/resources/namespace/namespace.go
pkg/resources/namespace/namespace.go
resources/networkpolicies
pkg/resources/networkpolicies/networkpolicy.go
pkg/resources/networkpolicies/networkpolicy.go
resources/pdbs
pkg/resources/pdbs/pdb.go
pkg/resources/pdbs/pdb.go
resources/pods
pkg/resources/pods/pod.go
pkg/resources/pods/pod.go
resources/pvcs
pkg/resources/pvcs/pvc.go
pkg/resources/pvcs/pvc.go
resources/pvs
pkg/resources/pvs/pv.go
pkg/resources/pvs/pv.go
resources/replicasets
pkg/resources/replicasets/replicaset.go
pkg/resources/replicasets/replicaset.go
resources/resourcequotas
pkg/resources/resourcequotas/resourcequota.go
pkg/resources/resourcequotas/resourcequota.go
resources/rolebindings
pkg/resources/rolebindings/rolebinding.go
pkg/resources/rolebindings/rolebinding.go
resources/roles
pkg/resources/roles/role.go
pkg/resources/roles/role.go
resources/secrets
pkg/resources/secrets/secret.go
pkg/resources/secrets/secret.go
resources/serviceaccounts
pkg/resources/serviceaccounts/serviceaccount.go
pkg/resources/serviceaccounts/serviceaccount.go
resources/services
pkg/resources/services/service.go
pkg/resources/services/service.go
resources/statefulsets
pkg/resources/statefulsets/statefulset.go
pkg/resources/statefulsets/statefulset.go
resources/template
pkg/resources/template/resolver.go
pkg/resources/template/resolver.go
runners
pkg/runners/clusterrolebindings.go
pkg/runners/clusterrolebindings.go
typeregistry
pkg/typeregistry/zz_generated_typeregistry.go Code generated by "ork generate registry" on 2026-03-19T12:05:02Z. DO NOT EDIT.
pkg/typeregistry/zz_generated_typeregistry.go Code generated by "ork generate registry" on 2026-03-19T12:05:02Z. DO NOT EDIT.
types
pkg/types/admission.go
pkg/types/admission.go
utils
pkg/utils/file_cache.go
pkg/utils/file_cache.go
version
pkg/version/version.go
pkg/version/version.go
webhook
webhook/admission.go — /validate and /mutate HTTP handlers.
webhook/admission.go — /validate and /mutate HTTP handlers.
tests
helpers
tests/helpers/fake_kubeclient.go
tests/helpers/fake_kubeclient.go

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL