OpenClaw EnterpriseDOCSGitHub

Kubernetes Configuration storage

Use this reference to configure tenant placement and Kubernetes permissions for Configuration resources and immutable revision snapshots.

Kubernetes placement and RBAC

KubernetesConfigurationDriver creates exactly one ConfigMap per Configuration in the managed control-plane namespace for its exact logical Namespace. The Compute Driver creates this target separately from the Harness namespace, including when existingNamespace selects an operator-owned data-plane target. Wait for Namespace readiness and grant API ConfigMap access in the CP target before creating Configuration resources. The ConfigMap remains OCC-owned. See namespace requirements. Its data contains exactly one entry:

json
{  "data": {    "openclaw.json": "<JSON-serialized values document>"  }}

The driver validates and parses that document when reading it; malformed JSON, extra data entries, excessive size, or incorrect ownership fail closed. It cannot select another tenant namespace, share tenant objects, read Kubernetes Secrets, create Pods, or store Installation settings. ConfigMap updates are not watched or automatically reloaded into admitted AgentRevisions. The serialized values must be smaller than 1 MiB; Kubernetes may also reject an object that exceeds its total object limit. Reads reject invalid kind or generation and binary ConfigMap data. Updates require a resource version and a generation difference of exactly one; the reverse direction is reserved for OCC rollback. Deletion checks ownership and uses the observed UID as a precondition when available. Missing objects, conflicts, or unavailable access fail without adopting another object.

PostgreSQL stores only server-owned Configuration metadata: its identifier, owning Namespace, immutable kind, current generation, and creation time. The ConfigMap in the tenant namespace carries matching kind and generation annotations and stores only the live native configuration document in openclaw.json; values are not duplicated in Configuration metadata. Deployment separately persists its immutable revision snapshot.

When Kubernetes Compute prepares an admitted AgentRevision, it creates a separate, immutable, Agent-owned snapshot ConfigMap containing the revision's native configuration with Driver-owned proxy trust rendered from the Installation. This rendering does not rewrite the stored Configuration or AgentRevision. The Agent gateway mounts this snapshot read-only at /etc/openclaw/openclaw.json; its environment contains only the file path in OPENCLAW_CONFIG_PATH. It never mounts the mutable Configuration Driver ConfigMap or copies raw configuration into Pod environment. A new admitted generation receives a different immutable snapshot and rolls the same Agent gateway. Old snapshots remain until Namespace deletion; safe earlier garbage collection is not implemented.

Startup validates the selected Configuration Driver's closed schema and authentication options but does not probe tenant ConfigMaps or their RBAC: such a preflight would require a known object or broader access. OCC validates native Configuration semantics before calling the Driver; Drivers enforce their backing-storage ownership and identity checks. Kubernetes namespace existence and exact ConfigMap authorization are checked lazily on the first requested CRUD operation. An authorized Configuration request can return 503 while a driver-managed provisioning Namespace's Kubernetes namespace or API RoleBinding does not yet exist; retry after provisioning and its exact grants are ready. An explicitly selected existing Namespace instead rejects creation with 409 until it is ready; after readiness, a missing API RoleBinding returns 503.

Use the existing cluster-scoped namespace-observer get/list grant to discover the exact tenant namespace. Provision tenant-data access through namespaced ConfigMap CRUD only. Kubernetes cannot restrict create by resourceNames; keep it in a separate namespaced rule. Scope the remaining verbs to exact object names when those names are known:

yaml
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:  name: occ-configuration  namespace: <tenant-control-plane-namespace>rules:  - apiGroups: [""]    resources: ["configmaps"]    verbs: ["create"]  - apiGroups: [""]    resources: ["configmaps"]    resourceNames: ["cfg-123e4567-e89b-42d3-a456-426614174000-0123456789ab"]    verbs: ["get", "update", "delete"]

The object name is illustrative; use the exact name generated by the selected implementation. Bind this Role only to its intended bootstrap identity in the same tenant namespace. OCC still verifies exact Namespace placement, object naming, and ownership before every mutation. Never add ConfigMap list/watch, cluster-wide tenant-resource access, Secret access, or Pod-creation privileges; the existing Namespace-only observer grant does not permit any of them.

The separately selected Kubernetes Compute Driver also requires tenant-local ConfigMap get, create, and patch to prepare its immutable Agent-owned revision snapshots. Those Compute permissions and snapshots are independent of the Configuration Driver's cfg-* object allowlist and CRUD identity. Keep Compute create in its own namespaced rule because Kubernetes cannot scope creation by resourceNames; restrict get and patch to known exact Agent-owned snapshot names when practical. These Configuration and snapshot operations do not require Kubernetes Secret access. Secret CRUD and delivery validation use the separately selected SecretDriver and the API's tenant-local Secret RBAC. The separately authorized provider-managed service-account credential path uses exact account-owned Secrets through Compute; see service accounts.

Search documentation