Create a Validator
A validator is declared as a single Validator custom resource. You apply it, and the operator provisions everything else to create the validator.
Validators are created, changed, and deleted through custom resources — not through the UI. This keeps validator configuration reviewable and GitOps-friendly. The UI is where you operate a validator once it exists.
What the operator does
Provisions authentication
When spec.auth.managedKeycloak is true, the operator creates the OIDC clients, client scopes, protocol mappers, and wallet user for this validator, then writes the generated backend client secret to a Kubernetes Secret and records the result in status.managedAuth.
Provisions databases
The participant and validator-app databases and schemas are created, plus the PQS and Wallet Gateway databases when those components are enabled.
Creates the component applications
One child Application resource per component: participant, validator, wallet-ui, cns-ui, and optionally pqs and wallet-gateway.
Creates the workloads
Each Application becomes a Deployment, a Service, and — for externally reachable components — a Traefik IngressRoute.
The validator reports Ready once every component it owns is ready.
Prepare the secrets
Two secrets are needed in the validator's namespace before you apply.
# Database credentials — must be able to CREATE DATABASE
kubectl create secret generic my-validator-db-credentials \
--from-literal=username=<db-user> \
--from-literal=password=<db-password> \
-n <namespace>
# One-time onboarding secret from the sponsoring Super Validator
kubectl create secret generic my-validator-onboarding \
--from-literal=secret=<onboarding-secret> \
-n <namespace>The onboarding secret's key must be secret. The operator reads that exact key name.
If you are using an external identity provider rather than managed authentication, you also need a secret holding the backend OIDC client secret — see External Identity Provider.
A minimal Validator
This example relies on managed authentication and on operator defaults for every component. It is the shortest useful Validator.
spec.network.partyHint is pattern-validated. It must match ^[a-zA-Z0-9]+-[a-zA-Z0-9]+-[0-9]+$ — that is, two alphanumeric segments and a numeric segment, separated by hyphens. catalyx-devnet-001 is valid; myvalidator and my_validator_1 are rejected at apply time.
Required fields
Only three top-level blocks are mandatory, and the API server rejects the resource at apply time if any is missing:
spec.auth
None individually, but the block itself is required.
spec.network
partyHint
spec.database
host, participantDb, validatorDb, credentialsSecretRef.name
spec.network.scan and spec.network.synchronizer are not marked mandatory in the schema, but the validator cannot reconcile without them. Always supply both.
For the complete field list, see the Validator CRD Reference.
Watch it come up
The Validator resource prints a READY column, and -o wide adds the REASON for a validator that is not ready.
Or open the UI and watch the validator's Summary and Status tabs, which refresh automatically.
If it does not become ready
The Ready condition carries a reason that tells you which kind of problem you have:
InvalidSpec
A configuration problem the operator detected. The condition message names the exact field. Fix the Validator and re-apply.
ReconcileError
Something went wrong that is not a configuration error — for example the database or identity provider was unreachable. Check the operator logs.
ApplicationNotReady
The configuration is accepted but a component has not come up. Look at status.applications to see which one, then at that component's pods.
Deleting a validator
Kubernetes garbage-collects the child Application resources and their workloads.
Deleting a Validator does not remove:
the databases — participant, validator, PQS, and Wallet Gateway data all remain;
the identity provider objects created by managed authentication — clients, scopes, and users stay in the realm;
the managed authentication secret
<validator-name>-managed-ledger-api-auth.
Clean these up yourself if you are decommissioning a validator permanently. Retaining them is what makes it possible to recreate a validator against its existing state.
Last updated
Was this helpful?