Credential, an McpServer, or one of the other supported kinds — to a cluster
running the operator described in
Configuration clusters. The
operator reconciles what you declare through the KAOP API and writes the result back onto the
resource’s own status, so the manifest is the source of truth without a separate API call of your
own.
How a declaration maps to KAOP
- Every kind is in the
agentops.komodor.io/v1alpha1API group, and every resource is namespaced. - The namespace binds the resource to one account: the cluster install running in that namespace is tied to a single KAOP account.
spec.nameis the resource’s name in KAOP and defaults tometadata.name. Changingspec.namedoes not rename anything — it points the declaration at a different name, so the old resource is left behind.- A field you set in
specis reapplied on every resync (operator.resyncInterval, default5m), so an out-of-band change to it is corrected back. A field you leave unset stays under KAOP’s own control. - KAOP remains the validator. A spec the CRD’s schema accepts can still be rejected — the reason
appears on the resource’s
Syncedcondition.
Supported kinds
Every kind shares the same
spec/status contract above. For the full set of fields a kind
accepts, run kubectl explain <kind>.spec against a cluster that has the CRDs installed — each
field carries its own description.
Annotated example
ACredential resolves its value from a Kubernetes Secret in its own namespace rather than
holding it inline:
McpServer then references that credential by name, alongside the fields that reach the
upstream server itself:
SYNCED is a default-visible column; RESOURCE needs
-o wide:
References between resources
A field ending inRef — credentialRef, agentRef, mcpGroupRef, and the rest — resolves by
the KAOP name of the resource it points at, not by the Kubernetes object name.
- A reference naming something that does not exist yet reports
WaitingForDependencyon theSyncedcondition, and is retried on every resync rather than treated as a standing error. - A reference naming something that already exists but that this cluster does not declare reports
Conflict. The existing resource is never taken over.
Secrets
Values are read from Secrets in the same namespace as the resource that references them, and the value never appears in the spec a cluster can read, nor in status. Rotation is detected throughstatus.secretHashes — a per-field fingerprint of the last value
pushed, so an unrotated Secret is a no-op resync rather than a repeated write.
Reading status
TheSynced condition reports whether KAOP matches the declared spec, with one of eight reasons:
status.resourceId is the KAOP id of the managed resource. For the control plane’s own wording on
a failure, read the condition’s message with kubectl describe on the resource.
Deleting a declaration
Operator scope and lifecycle
- The operator watches only the namespace it is released into. Covering a second namespace means
installing the chart again there with
crds.install=false, since the CRDs are cluster-scoped and already belong to the first release. - Its permissions are namespace-scoped and narrow: no
createordeleteon the custom resources it reconciles, andgetonly on Secrets. helm uninstallleaves the CRDs and your declared resources in place rather than deleting them.- A control plane behind an internal certificate authority needs
caBundle.existingConfigMappointed at a ConfigMap of PEM certificates, or the operator never becomes ready. - To check which build is running, read the image tag on the operator’s pod — it is distroless, so there is no shell to exec into instead.
Next steps
Configuration clusters
Connect a cluster and read its sync status.
Credentials & secrets
Manage credentials declared through this interface alongside the ones created in KAOP.
MCP Gateway
Configure governed access to the MCP servers a cluster can declare.