Validator CRD User Guide
Catalyst uses the operator pattern with Custom Resource Definitions. The same operations available in the Catalyst GUI can also be performed directly on Kubernetes with access to the cluster.
Creating a Validator
Full creation example (Kubernetes YAML)
apiVersion: v1
kind: Secret
metadata:
namespace: canton-dev
name: database-validator-dev-foo
data:
user: "YWRtaW4="
password: "YWRtaW4="
---
apiVersion: v1
kind: Secret
metadata:
namespace: canton-dev
name: cn-app-validator-dev-foo-onboarding-validator
data:
secret: "<onboarding-secret-base64>"
---
apiVersion: v1
kind: Secret
metadata:
namespace: canton-dev
name: cn-app-validator-dev-foo-cns-ui-auth
data:
url: "<keycloak-url-base64>"
clientId: "<cns-client-id-base64>"
---
apiVersion: v1
kind: Secret
metadata:
namespace: canton-dev
name: cn-app-validator-dev-foo-wallet-ui-auth
data:
url: "<keycloak-url-base64>"
clientId: "<wallet-client-id-base64>"
username: "<wallet-username-base64>"
---
apiVersion: v1
kind: Secret
metadata:
namespace: canton-dev
name: cn-app-validator-dev-foo-ledger-api-auth
data:
client-id: "<client-id-base64>"
client-secret: "<client-secret-base64>"
ledger-api-user: "<ledger-api-user-base64>"
url: "<token-url-base64>"
---
apiVersion: catalyst.manager.canton/v1
kind: Validator
metadata:
name: validator-dev-foo
namespace: canton-dev
spec:
config:
scanAddress: "https://scan.sv-1.dev.global.canton.network.sync.global"
svSponsorAddress: "https://sv.sv-1.dev.global.canton.network.sync.global"
defaultJvmOptions: "-Xms1152M -Xmx1152M -Dscala.concurrent.context.minThreads=4"
partyHint: ieu-foo-001
failOnAppVersionMismatch: true
database:
port: 5432
pwdField: password
schema: validator
secretName: database-validator-dev-foo
userField: user
participant:
nodeIdentifier: IEUDevFoo001
customAuth: true
imageRepo: ghcr.io/digital-asset/decentralized-canton-sync/docker
imageTag: 0.4.16
migrationId: "0"
migrationMigrating: false
onboardingSecretName: cn-app-validator-dev-foo-onboarding-validator
storageSize: 20GiKey notes when creating a validator:
The onboarding secret is one-time use.
The validator name, participant identifier, and party hint should be changed when deploying a new validator.
Secrets (names and fields) are referenced inside the Validator definition itself — keep them in-sync.
Some data is provided as part of the reference itself (e.g.,
port,schema), not as a secret field.
Validator Operations
Migration
The following fields are used in migration:
spec:
migrationId: "2"
migrationMigrating: falseTo migrate, set the values as follows:
Once the migration is complete, set migrationMigrating back to false.
Recovery from Identity Dump
To recover Canton Coin balances using an Identities Backup, create a Kubernetes secret in the following format:
Then create a validator (removing the old one if on the same cluster) with the following fields added to spec:
The participant should have the same node identifier as the newParticipantIdentifier field, which must differ from the previous validator.
Configuring the Validator
Environment Variable Overrides
To add extra environment variables:
These overrides will override any variables generated by the spec.config. In older versions, environment variables were defined directly in application.spec.envVars, applicationWallet.spec.envVars, etc. On upgrade to v1.10, a script generates the spec.config fields from these. The <app>.spec.envVars format will be removed in a future release.
Resource Customization
Other Configuration Examples
KMS
KMS is set at creation via spec.enableKms plus fields on the participant spec. It cannot be toggled on or off after creation.
AWS / GCP
Azure
The secret named by kmsAzureVaultSecretName must contain: tenant-id, client-id, client-secret.
API-to-CRD field mapping
The REST API nests these under clusterParticipantConfig:
enableKms
spec.enableKms
kmsValue
spec.participant.spec.kmsValue
kmsServiceAccount
spec.participant.spec.serviceAccount
kmsAzureVaultSecretName
spec.participant.spec.kmsAzureVaultSecretName
overrideImage
spec.participant.spec.overrideImage
participant.resources.imagePullSecret
spec.participant.spec.resources.imagePullSecret
Last updated
Was this helpful?