agentsclimarketplace

Yb k8s operator

Skill yugabyte/yugabytedb-skills/skills/yb-k8s-operator

Use when provisioning, managing, or troubleshooting YugabyteDB universes on Kubernetes via the YugabyteDB Kubernetes Operator and YugabyteDB Anywhere CRDs (YBUniverse, YBProvider, Release, Backup, StorageConfig, PitrRestore, DrConfig, etc.). Triggers on kubectl apply, Helm install of yugaware, operator CRDs, or any mention of YugabyteDB with Kubernetes.From its SKILL.md

Install
npx -y skills add yugabyte/yugabytedb-skills --skill yb-k8s-operator

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 7 stars7 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

29.8 KB, as published. Nobody here has run it

YugabyteDB Kubernetes Operator

This skill includes:

  • references/crd-examples.md — complete YAML examples for every CRD
  • references/workflows.md — end-to-end provisioning, upgrade, backup, and DR workflows
  • references/kubeconfig-secrets.md — create and rotate kubeconfig secrets for multi-cluster providers. Always follow this guidance; do not create generic kubeconfig secrets.
  • references/multi-cluster-service-mesh.md — Helm overrides and pod address templates for Istio and Cilium

Note: This skill covers the YBA Kubernetes Operator (commercial). It does not fully apply to the YugabyteDB OSS Kubernetes Operator, which has fewer CRDs and features.

The operator manages YBA universes declaratively via Kubernetes CRs alongside YBA, watching a configured namespace for changes.

CRD source: https://raw.github.com/yugabyte/charts/<version>/crds/concatenated_crd.yaml Documentation: https://docs.yugabyte.com/stable/yugabyte-platform/anywhere-automation/yb-kubernetes-operator/

Prerequisites

Before creating any CRs:

  • kubectl config current-context points to the cluster running the operator.
  • You are targeting the namespace from yugaware.kubernetesOperatorNamespace (empty string = all namespaces).
  • CRDs applied at the same version as the Helm chart (helm ls -A | grep yugaware).
  • If RBAC is namespace-scoped (RoleBinding only, no ClusterRoleBinding), a YBProvider CR must be created explicitly — the operator cannot auto-discover node/zone topology.
  • For multi-cluster universes, kubeconfig secrets exist for each remote cluster.

Auto-created vs explicit YBProvider: The operator auto-creates a provider only when the universe targets the same cluster as the operator AND YBA has a ClusterRoleBinding. Create a YBProvider CR explicitly when targeting a different cluster, when RBAC is namespace-scoped, or when you need per-zone control (storage class, namespace, overrides, kubeconfig, cert-manager).

CRD upgrades: Apply CRDs before helm upgrade — mismatched CRDs cause silent field drops or validation errors:

kubectl apply -f https://raw.github.com/yugabyte/charts/<new-version>/crds/concatenated_crd.yaml
helm upgrade yba yugabytedb/yugaware --version <new-version> ...

CRD Dependency Order

Create resources in this order; each must be Ready before dependents are created.

1. Release       — register DB software version
2. YBProvider    — define cloud/regions/zones (optional if auto-provider is available)
3. YBCertificate — (optional) TLS certificates
4. YBUniverse    — database cluster
5. StorageConfig — backup storage destination
6. Backup / BackupSchedule / RestoreJob — backup operations
7. PitrConfig    — point-in-time recovery config
8. PitrRestore   — PITR restore operation [v2026.1+]
9. DrConfig      — disaster recovery replication
10. SupportBundle — diagnostic log collection

CRD Quick Reference

All CRDs use apiVersion: operator.yugabyte.io/v1alpha1.

Release

Registers a YugabyteDB software version. Must reach status.success: true before a universe can reference it.

The CRD validation (v2026.1+) requires exactly one helmChart path and exactly one x86_64 path across the combination of http, s3, and gcs — they can come from different sources (e.g. http for the Helm chart and s3 for the tarball). In pre-2026.1 CRDs, x86_64 was optional.

Helm chart URL format: The chart filename uses the 3-part chart version, not the full DB version string — https://charts.yugabyte.com/yugabyte-<major>.<minor>.<patch>.tgz. For example, DB version 2025.2.3.0-b149 uses chart version 2025.2.3, so helmChart: "https://charts.yugabyte.com/yugabyte-2025.2.3.tgz". Confirm chart existence with helm search repo yugabytedb/yugabyte --versions before authoring the CR.

kubernetesOperatorNamespace: "" bug: When the operator watches all namespaces (empty string), ReleaseReconciler.onAdd throws namespace not specified when patching the CR status. The exception fires between YBA registration and the download trigger, so:

  • The release appears in YBA metadata but packages are never downloaded — the release shows as incomplete in YBA and cannot be used to upgrade a universe.
  • Subsequent reconcile loops log no changes found and do not retry the download.
  • Releases that fail YBA registration (bad URL, non-existent version) are re-processed via the update path, which does write status correctly.

Workaround: Set kubernetesOperatorNamespace to the specific namespace where universes run instead of "". With a namespace set, the onAdd status patch succeeds and the download is triggered normally.

FieldTypeRequiredNotes
spec.config.versionstringyese.g. "2025.2.3.0-b149"
spec.config.downloadConfig.http.paths.helmChartstringyes (v2026.1+)URL to Helm chart .tgz — uses 3-part chart version, not full DB version
spec.config.downloadConfig.http.paths.x86_64stringyes (v2026.1+)URL to DB tarball
spec.config.downloadConfig.s3.accessKeyIdstringnoS3 access key
spec.config.downloadConfig.s3.secretAccessKeySecretobjectno{name, namespace} — preferred over inline secret
spec.config.downloadConfig.gcs.credentialsJsonSecretobjectno{name, namespace} — preferred over inline credentials

YBProvider

Defines a Kubernetes cloud provider. Universes reference this by metadata.name.

FieldTypeRequiredImmutableNotes
spec.cloudInfo.kubernetesProviderstring enumnoyesgke, eks, aks, openshift, custom
spec.cloudInfo.kubernetesImageRegistrystringnonoe.g. quay.io/yugabyte/yugabyte
spec.cloudInfo.kubeConfigSecretobjectnono{name, namespace} — global kubeconfig secret
spec.regions[].codestringyesnoRegion code, e.g. us-west1
spec.regions[].zones[].codestringyesnoZone code, e.g. us-west1-a
spec.regions[].zones[].cloudInfo.kubeNamespacestringnonoNamespace for DB pods in this zone
spec.regions[].zones[].cloudInfo.kubernetesStorageClassstringnonoStorageClass — confirm it exists and allows volume expansion
spec.regions[].zones[].cloudInfo.kubeDomainstringnonoCluster domain name [v2026.1+]
spec.regions[].zones[].cloudInfo.kubePodAddressTemplatestringnonoFQDN template for multi-cluster
spec.regions[].zones[].cloudInfo.certManagerIssuerNamestringnonoRequires certManagerIssuerKind
spec.regions[].zones[].cloudInfo.certManagerIssuerGroupstringnonoIssuer group for cert-manager
spec.regions[].zones[].cloudInfo.kubeConfigSecretobjectnonoPer-zone kubeconfig override
spec.regions[].zones[].cloudInfo.overridesobjectnonoFree-form Helm overrides per zone

Status: status.state, status.message.

Kubeconfig secrets must contain a single key kubeconfig with complete kubeconfig YAML. Use long-lived service account tokens — YBA does not support short-lived token plugins. See references/kubeconfig-secrets.md for the full procedure.

For multi-cluster service mesh (Istio / Cilium), see references/multi-cluster-service-mesh.md.

YBCertificate

FieldTypeRequiredNotes
spec.certTypestring enumyesSELF_SIGNED or K8S_CERT_MANAGER
spec.certificateSecretRef.namestringyesSecret name (SELF_SIGNED needs ca.crt + ca.key; K8S_CERT_MANAGER needs ca.crt only)
spec.certificateSecretRef.namespacestringnoDefaults to CR namespace

YBUniverse

The primary CRD. Creates and manages a YugabyteDB database cluster.

Core fields:

FieldTypeRequiredImmutableDefaultNotes
spec.universeNamestringnoyes—Display name in YBA UI
spec.numNodesintegeryesno—Total tserver count; must be ≥ replicationFactor
spec.replicationFactorintegeryesyes—Typically 3
spec.ybSoftwareVersionstringyesno—Must match a registered Release
spec.providerNamestringnoyes—YBProvider CR name
spec.zoneFilterstring arraynoyes—Filter zones used by auto-provider (only when providerName unset) [v2026.1+]
spec.enableYSQLboolnoyestrueYSQL (PostgreSQL-compatible)
spec.enableYCQLboolnoyesfalseYCQL (Cassandra-compatible)
spec.enableYSQLAuthboolnoyesfalseRequires ysqlPassword.secretName
spec.enableYCQLAuthboolnoyesfalseRequires ycqlPassword.secretName
spec.enableNodeToNodeEncryptboolnoyestrueTLS between nodes
spec.enableClientToNodeEncryptboolnoyestrueTLS for client connections
spec.rootCAstringnoyes—YBCertificate CR name
spec.enableLoadBalancerboolnoyesfalseCreates Type:LoadBalancer services
spec.enableIPV6boolnoyesfalse—
spec.pausedboolnonofalseScales pods to 0
spec.useYbdbInbuiltYbcboolnonofalseYBC runs from the DB container image rather than installed at runtime [v2026.1+]

Password secrets: create a Kubernetes Secret with key ysqlPassword or ycqlPassword (≥12 chars, mixed case, numbers, special chars) in the same namespace as the YBUniverse, then reference via spec.ysqlPassword.secretName / spec.ycqlPassword.secretName. Both fields are immutable once set.

Placement (v2025.2+):

FieldTypeNotes
spec.placementInfo.defaultRegionstringImmutable once set. Location of masters; omit to spread masters across all regions.
spec.placementInfo.regions[].codestringRegion code from provider
spec.placementInfo.regions[].zones[].codestringZone code from provider
spec.placementInfo.regions[].zones[].numNodesintegerNodes in this zone
spec.placementInfo.regions[].zones[].preferredboolDefault true

Storage — v2026.1+: tserverVolume / masterVolume (preferred):

Replaces deviceInfo/masterDeviceInfo; the two sets are mutually exclusive. numVolumes and storageClass are mutable when running DB ≥ 2026.1.0. Provider-level storage class takes precedence over storageClass here — leave the provider value empty to use this field. Once set, tserverVolume/masterVolume cannot be removed; perAZ within them cannot be removed once set.

FieldTypeDefaultNotes
spec.tserverVolume.volumeSizeinteger100GiB per volume
spec.tserverVolume.numVolumesinteger2Mutable with DB ≥ 2026.1.0
spec.tserverVolume.storageClassstring—Mutable with DB ≥ 2026.1.0
spec.tserverVolume.perAZmap[string]object—Per-AZ overrides: volumeSize, numVolumes, storageClass
spec.masterVolume.volumeSizeinteger50GiB per volume
spec.masterVolume.numVolumesinteger1Mutable with DB ≥ 2026.1.0
spec.masterVolume.storageClassstring—Mutable with DB ≥ 2026.1.0
spec.masterVolume.perAZmap[string]object—Per-AZ overrides

Storage — legacy: deviceInfo / masterDeviceInfo (deprecated v2026.1+):

FieldTypeImmutableDefault
spec.deviceInfo.volumeSizeintegerno100
spec.deviceInfo.numVolumesintegeryes1
spec.deviceInfo.storageClassstringyes—
spec.masterDeviceInfo.volumeSizeintegerno50
spec.masterDeviceInfo.numVolumesintegeryes1
spec.masterDeviceInfo.storageClassstringyes—

Resource Spec (v2026.1+): Simple CPU/memory sizing as an alternative to kubernetesOverrides.resource. Values are integers (cores / GiB, min 1 each). When kubernetesOverrides.resource is already set on an existing universe, adding these fields is accepted by Kubernetes but the operator reconciles as NO_OP — no YBA update is triggered and sizing does not change. These fields only take effect on universes created without kubernetesOverrides.resource.

FieldNotes
spec.tserverResourceSpec.cpu / .memoryCPU cores / GiB for tserver pods
spec.masterResourceSpec.cpu / .memoryCPU cores / GiB for master pods

YBC Throttle Parameters (v2026.1+): Tune backup/restore throughput when backups consume too many resources. maxConcurrentUploads and maxConcurrentDownloads have a hard maximum of 3 — values above this cause Error Updating at reconcile time (the admission webhook does not validate them).

FieldNotes
spec.ybcThrottleParameters.maxConcurrentUploads / maxConcurrentDownloadsParallel uploads/downloads per node
spec.ybcThrottleParameters.perUploadNumObjects / perDownloadNumObjectsBuffers per upload/download per node
spec.ybcThrottleParameters.diskReadBytesPerSec / diskWriteBytesPerSecDisk I/O rate limits during backup/restore

GFlags:

FieldNotes
spec.gFlags.tserverGFlagsmap[string]string
spec.gFlags.masterGFlagsmap[string]string
spec.gFlags.perAZmap[string]object with tserverGFlags/masterGFlags

Kubernetes overrides (spec.kubernetesOverrides): free-form object passed to the Helm chart.

PathNotes
resource.master.requests.cpu / .memorye.g. 4, "8Gi"
resource.master.limits.cpu / .memory—
resource.tserver.requests.* / limits.*Same shape as master
master.affinity / tserver.affinityPod/node affinity
master.tolerations / tserver.tolerationsNode tolerations
master.podAnnotations / .podLabels—
tserver.podAnnotations / .podLabels—
master.extraEnv / tserver.extraEnv[{name, value}]
master.secretEnv / tserver.secretEnv[{name, secretKeyRef: {name, key}}] [v2026.1+]
master.extraVolumes / tserver.extraVolumes[{name, persistentVolumeClaim: {claimName}}] [v2026.1+]
master.extraVolumeMounts / tserver.extraVolumeMounts[{name, mountPath}] [v2026.1+]
tserver.serviceAccountKSA for IAM-based backup access
serviceEndpointsCustom service definitions
nodeSelectormap[string]string

Read Replica (spec.readReplica):

FieldRequiredNotes
numNodesyes—
replicationFactoryes—
tserverVolumenov2026.1+ preferred; same shape as primary. Cannot be removed once set.
tserverResourceSpecno{cpu, memory} [v2026.1+]
deviceInfonoDeprecated v2026.1+; mutually exclusive with tserverVolume
placementInfonoSame shape as primary placementInfo

Status: status.universeState (Ready, Creating, Editing, Deleting), status.sqlEndpoints, status.cqlEndpoints, status.resourceUUID. status.actions (v2026.1+): array of {action_type, message, taskUUID, status} where status is queued, running, or failed.

StorageConfig

Defines a backup storage destination. Referenced by Backup, BackupSchedule, and DrConfig.

FieldTypeRequiredImmutableNotes
spec.config_typestring enumyesyesSTORAGE_S3, STORAGE_GCS, STORAGE_AZ, STORAGE_NFS
spec.namestringnoyesDisplay name
spec.data.BACKUP_LOCATIONstringyesyese.g. s3://bucket/path
spec.data.AWS_ACCESS_KEY_IDstringnonoS3
spec.data.USE_IAMboolnonoIAM access for S3/GCS/AZ
spec.data.AWS_HOST_BASEstringnonoS3-compatible endpoint
spec.data.PATH_STYLE_ACCESSboolnonoS3-compatible path-style
spec.data.SIGNING_REGIONstringnonoFor private S3 endpoints
spec.awsSecretAccessKeySecretobjectnono{name, namespace} — preferred over data.AWS_SECRET_ACCESS_KEY. Secret key: awsSecretAccessKey. Secret must exist before applying the CR — if absent, the CR is created with empty resourceUUID and all subsequent updates fail with "Invalid UUID string" until the CR is deleted and recreated.
spec.gcsCredentialsJsonSecretobjectnono{name, namespace} — preferred over data.GCS_CREDENTIALS_JSON. Secret key: gcsCredentialsJson. Same pre-existence requirement.
spec.azureStorageSasTokenSecretobjectnono{name, namespace} — preferred over data.AZURE_STORAGE_SAS_TOKEN. Secret key: azureStorageSasToken. Same pre-existence requirement.

Backup

FieldTypeRequiredNotes
spec.backupTypestring enumyesPGSQL_TABLE_TYPE (YSQL) or YQL_TABLE_TYPE (YCQL)
spec.universestringyesYBUniverse CR name
spec.storageConfigstringyesStorageConfig CR name
spec.keyspacestringyesDatabase/keyspace name
spec.timeBeforeDeleteintegernoAuto-delete after N ms
spec.tableByTableBackupboolno—
spec.sseboolnoServer-side encryption
spec.incrementalBackupBasestringnoBase Backup CR name for incremental

BackupSchedule

Must set either schedulingFrequency or cronExpression.

FieldTypeRequiredImmutableNotes
spec.backupTypestring enumyesyesPGSQL_TABLE_TYPE or YQL_TABLE_TYPE
spec.universestringyesyesYBUniverse CR name
spec.storageConfigstringyesyesStorageConfig CR name
spec.keyspacestringyesyesDatabase/keyspace name
spec.namestringnoyesDisplay name
spec.schedulingFrequencyintegerconditionalnoms between full backups (min 3600000)
spec.cronExpressionstringconditionalnoCron schedule for full backups
spec.incrementalBackupFrequencyintegernonoms between incremental backups
spec.timeBeforeDeleteintegernoyesAuto-delete after N ms
spec.tableByTableBackupboolnoyes—
spec.enablePointInTimeRestoreboolnoyesDefault false

Auto-deletes when owning universe is deleted.

RestoreJob

FieldTypeRequiredNotes
spec.actionTypestring enumyesMust be RESTORE
spec.universestringyesTarget YBUniverse CR name
spec.backupstringyesSource Backup CR name
spec.keyspacestringnoKeyspace override

PitrConfig

kubernetesOperatorNamespace: "" bug: PitrConfigReconciler passes an empty namespace when looking up the referenced YBUniverse, causing a permanent Unable to fetch YBUniverse loop. PitrConfig will never be created when the operator watches all namespaces. Set kubernetesOperatorNamespace to a specific namespace to work around this.

FieldTypeRequiredImmutableDefaultNotes
spec.universestringyesyes—YBUniverse CR name
spec.namestringyesno—Display name
spec.tableTypestring enumyesno—YSQL or YCQL
spec.databasestringyesno—Database/keyspace name
spec.intervalInSecondsintegernono86400Snapshot interval
spec.retentionPeriodInSecondsintegernono604800Must be > intervalInSeconds

PitrRestore (v2026.1+)

All fields are required and immutable. To restore to a different time, create a new CR.

FieldTypeNotes
spec.universestringYBUniverse CR name
spec.pitrConfigstringPitrConfig CR name
spec.restoreTimestring (date-time)ISO 8601, e.g. "2024-02-09T15:30:00Z". Must be within the retention window.

Status: status.message, status.taskUUID.

DrConfig

FieldTypeRequiredNotes
spec.namestringyesDisplay name
spec.sourceUniversestringyesSource YBUniverse CR name
spec.targetUniversestringyesTarget YBUniverse CR name; set to "" to trigger failover
spec.databases[]string arrayyes (min 1)Database names to replicate
spec.storageConfigstringyesStorageConfig CR name
spec.pausedboolnoDefault false — pause/resume replication [v2026.1+]

sourceUniverse / targetUniverse mutations (v2026.1+): The webhook allows only these change patterns; any other combination is rejected:

  • Switchover — swap source and target.
  • Failover — source ← old target, target ← "".
  • Restart/change replica — source unchanged, target ← new universe name.

Pre-2026.1: both fields were fully immutable.

SupportBundle

Plural resource name is support-bundles (hyphenated) — kubectl get support-bundles -A, not kubectl get supportbundle.

FieldTypeRequiredNotes
spec.universeNamestringyesYBUniverse CR name
spec.collectionTimerange.startDatestring (date-time)yesISO 8601
spec.collectionTimerange.endDatestring (date-time)noDefaults to now
spec.components[]string enum arraynoUniverseLogs, ApplicationLogs, OutputFiles, ErrorFiles, CoreFiles, GFlags, Instance, ConsensusMeta, TabletMeta, YbcLogs, K8sInfo

Status: status.status (generating, ready, failed), status.access (download URL).

Immutable Fields

Attempting to change an immutable field is rejected by the admission webhook — delete and recreate the CR (data loss for YBUniverse).

  • YBUniverse: universeName, replicationFactor, providerName, zoneFilter, enableYSQL, enableYCQL, enableYSQLAuth, ysqlPassword, enableYCQLAuth, ycqlPassword, enableNodeToNodeEncrypt, enableClientToNodeEncrypt, rootCA, enableLoadBalancer, enableIPV6, deviceInfo.numVolumes, deviceInfo.storageClass, masterDeviceInfo.numVolumes, masterDeviceInfo.storageClass. tserverVolume/masterVolume cannot be removed once set; perAZ within them cannot be removed once set; numVolumes/storageClass within them are mutable with DB ≥ 2026.1.0.
  • YBProvider: cloudInfo.kubernetesProvider
  • StorageConfig: config_type, name, data.BACKUP_LOCATION
  • DrConfig (pre-2026.1): sourceUniverse, targetUniverse fully immutable. See DrConfig section for v2026.1+ rules.
  • PitrConfig: universe
  • PitrRestore (v2026.1+): universe, pitrConfig, restoreTime — all immutable.
  • BackupSchedule: backupType, universe, storageConfig, keyspace, name, tableByTableBackup, timeBeforeDelete, enablePointInTimeRestore

What Can Be Changed After Creation

  • Scale: spec.numNodes and placementInfo zone counts.
  • Upgrade: spec.ybSoftwareVersion (register the new Release first).
  • GFlags: spec.gFlags.tserverGFlags / masterGFlags.
  • Volume size: Increase volumeSize on any volume field (never decrease).
  • Volume count / storage class (v2026.1+, DB ≥ 2026.1.0): tserverVolume.numVolumes, storageClass, per-AZ overrides.
  • Resource spec (v2026.1+): tserverResourceSpec, masterResourceSpec.
  • YBC throttle (v2026.1+): ybcThrottleParameters.
  • Kubernetes overrides: Resource requests/limits, affinity, tolerations, annotations, labels, secretEnv, extraVolumes.
  • Pause/resume: spec.paused on YBUniverse; spec.paused on DrConfig (v2026.1+).
  • DR switchover / failover (v2026.1+): See DrConfig mutation rules.
  • Backup schedule frequency: schedulingFrequency, cronExpression, incrementalBackupFrequency.

Anti-Patterns

Anti-PatternConsequenceDo Instead
Creating CRs in a namespace the operator is not watchingCRs silently ignoredCheck yugaware.kubernetesOperatorNamespace in Helm values
CRD version doesn't match operator versionFields silently dropped or validation errorsApply CRDs from same version as Helm chart before upgrading
Omitting a YBProvider when RBAC is namespace-scopedUniverse creation failsCheck for ClusterRoleBinding; if only RoleBindings exist, create an explicit YBProvider
Creating a YBUniverse before its Release is success: trueCreation fails or hangsWait for kubectl get release <version> to show Downloaded: true
Putting credentials inline in StorageConfig spec.dataSecrets visible in CR YAMLUse awsSecretAccessKeySecret / gcsCredentialsJsonSecret / azureStorageSasTokenSecret
Deleting an incremental backup individuallyBreaks the backup chainDelete the base full backup (cascades to all incrementals)
Mixing tserverVolume and deviceInfo (or masterVolume and masterDeviceInfo)Rejected by validationUse one set; they are mutually exclusive
ybcThrottleParameters.maxConcurrentUploads or maxConcurrentDownloads > 3Error Updating at reconcile time — admission webhook does not validate thisKeep both values ≤ 3
Applying awsSecretAccessKeySecret / gcsCredentialsJsonSecret / azureStorageSasTokenSecret before the referenced secret existsStorageConfig CR created with empty resourceUUID; all subsequent updates fail with "Invalid UUID string" until CR is deleted and recreatedCreate the secret first, then apply the StorageConfig CR
kubernetesOperatorNamespace: "" with Release or PitrConfig CRsRelease: packages never downloaded (namespace error interrupts onAdd between YBA registration and download trigger); PitrConfig: universe lookup fails permanently — config never createdSet kubernetesOperatorNamespace to the specific namespace where universes run
Changing DrConfig source/target in an unsupported pattern (v2026.1+)Rejected by validationOnly switchover (swap), failover (target → ""), or restart (source unchanged, new target)
PitrRestore restoreTime outside the retention windowTask failsVerify the timestamp is within the PitrConfig retention period
Using short-lived tokens in kubeconfig secretsToken expires silentlyUse long-lived service account tokens (kubernetes.io/service-account-token Secret)
Kubeconfig secret missing the kubeconfig keyProvider fails to connectSecret must contain exactly one key named kubeconfig

Installation

kubectl apply -f https://raw.github.com/yugabyte/charts/<version>/crds/concatenated_crd.yaml

helm install yba yugabytedb/yugaware \
  --version <version> --namespace yb-platform \
  --set yugaware.kubernetesOperatorEnabled=true \
  --set yugaware.kubernetesOperatorNamespace='<operator-namespace>' \
  --set yugaware.defaultUser.enabled=true \
  --set yugaware.defaultUser.username='<username>' \
  --set yugaware.defaultUser.email='<email>' \
  --set yugaware.defaultUser.password='<password>'

Upgrade (enable operator, watch all namespaces):

kubectl apply -f https://raw.github.com/yugabyte/charts/<version>/crds/concatenated_crd.yaml
helm upgrade yba yugabytedb/yugaware --version <version> --namespace yb-platform \
  --reset-then-reuse-values \
  --set yugaware.kubernetesOperatorEnabled=true \
  --set yugaware.kubernetesOperatorNamespace=''

Current Limitations

  • No multi-cluster universes.
  • No software upgrade rollback.
  • No xCluster replication (use DrConfig for DR).
  • Read Replica defined in CRD but not fully supported via the operator.
  • No encryption-at-rest.
  • TLS config is immutable after creation; only self-signed supported.
  • PitrRestore CR requires v2026.1+. Earlier versions must use the YBA UI or API for PITR restore.

Workflow Summaries

Detailed step-by-step workflows with full YAML: see references/workflows.md Complete YAML examples for every CRD: see references/crd-examples.md

Provision a Universe

  1. Install YBA with operator enabled; apply CRDs.
  2. Create Release CR → wait for status.success: true.
  3. Create YBProvider CR (if needed).
  4. Optionally create YBCertificate.
  5. Create YBUniverse → monitor with kubectl get ybuniverse -w until Ready.

Upgrade DB Software

  1. Create new Release CR → wait for status.success: true.
  2. Edit spec.ybSoftwareVersion on the YBUniverse → monitor rolling upgrade.

Backups

  • One-time: StorageConfig → Backup
  • Scheduled: StorageConfig → BackupSchedule (set schedulingFrequency or cronExpression)
  • Incremental: set incrementalBackupFrequency on schedule, or incrementalBackupBase on a Backup
  • Restore from backup: RestoreJob with actionType: RESTORE

PITR Restore (v2026.1+)

  1. Ensure PitrConfig exists for the target database.
  2. Create PitrRestore CR with universe, pitrConfig, and restoreTime.
  3. To restore to a different time, create a new PitrRestore CR.

Disaster Recovery

  • Setup: Create StorageConfig → DrConfig with source/target universes and database list.
  • Pause/resume: Toggle spec.paused on the DrConfig (v2026.1+).
  • Switchover: Swap sourceUniverse/targetUniverse.
  • Failover: Set sourceUniverse ← old target, targetUniverse ← "".
  • Restart replication: Keep sourceUniverse unchanged, set targetUniverse to new universe.

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.