Skip to main content

Configuration Schema Reference

Purpose: For platform engineers, provides field-by-field reference for cluster YAML configuration files, with paths matching the Go struct tags in the CLI codebase.

File Location​

Configuration files live at:

~/.config/opencenter/clusters/<org>/<cluster>/.<cluster>-config.yaml

Example: ~/.config/opencenter/clusters/myorg/prod/.prod-config.yaml

The CLI generates v2 configuration only (schema_version: "2.0").

Top-Level Structure​

The root configuration has six top-level keys. The opencenter and secrets sections are required.

schema_version: "2.0"
metadata: { ... }
opencenter:
meta: { ... }
cluster: { ... }
infrastructure: { ... }
services: { ... }
managed_services: { ... }
gitops: { ... }
deployment: { ... }
opentofu: { ... }
secrets: { ... }

Source: internal/config/v2/config.go → Config struct.

metadata​

System-managed metadata. Not typically edited by users.

YAML PathTypeRequiredDescription
metadata.created_atstringnoCreation timestamp
metadata.updated_atstringnoLast update timestamp
metadata.versionstringnoConfig version
metadata.labelsmapnoKey-value labels
metadata.annotationsmapnoKey-value annotations

Source: internal/config/v2/config.go → ConfigMetadata.

opencenter.meta​

Cluster identity and organizational context.

YAML PathTypeRequiredDescription
opencenter.meta.namestringyesCluster name (DNS-1123 compliant)
opencenter.meta.organizationstringyesOrganization identifier
opencenter.meta.envstringyesEnvironment: dev, staging, production
opencenter.meta.regionstringyesDeployment region
opencenter.meta.statusstringnoCluster status

Source: internal/config/v2/config.go → MetaConfig.

opencenter.cluster​

Kubernetes cluster identity and configuration. Contains a nested kubernetes object for version, networking, security, and plugin settings.

YAML PathTypeRequiredDescription
opencenter.cluster.cluster_namestringyesCluster name (DNS-1123 compliant)
opencenter.cluster.base_domainstringyesBase domain (e.g., k8s.opencenter.cloud)
opencenter.cluster.cluster_fqdnstringyesFully qualified domain name
opencenter.cluster.admin_emailstringyesAdministrator email for certificates and notifications
opencenter.cluster.kubernetesobjectyesKubernetes configuration (see below)

Source: internal/config/v2/cluster.go → ClusterConfig.

opencenter.cluster.kubernetes​

Kubernetes version, networking, and security settings. This is where version (Kubernetes version), network plugin, and storage plugin are configured.

YAML PathTypeRequiredDescription
opencenter.cluster.kubernetes.versionstringyesKubernetes version (semver, e.g., v1.29.0)
opencenter.cluster.kubernetes.api_portintegeryesAPI server port (1–65535)
opencenter.cluster.kubernetes.kube_vip_enabledboolnoEnable KubeVIP for control plane HA
opencenter.cluster.kubernetes.subnet_podsstringyesPod network CIDR (e.g., 10.233.64.0/18)
opencenter.cluster.kubernetes.subnet_servicesstringyesService network CIDR (e.g., 10.233.0.0/18)
opencenter.cluster.kubernetes.network_pluginobjectyesCNI plugin configuration (see below)
opencenter.cluster.kubernetes.storage_pluginobjectnoCSI plugin configuration
opencenter.cluster.kubernetes.securityobjectnoKubernetes security settings
opencenter.cluster.kubernetes.oidcobjectnoOIDC authentication configuration

Source: internal/config/v2/cluster.go → KubernetesConfig.

CNI Plugin Configuration

The CNI plugin is configured under opencenter.cluster.kubernetes.network_plugin, not as a flat cni_plugin string. Enable exactly one of calico, cilium, or kube-ovn.

opencenter.cluster.kubernetes.network_plugin​

Enable exactly one CNI plugin by setting its enabled field to true.

YAML PathTypeRequiredDescription
opencenter.cluster.kubernetes.network_plugin.calicoobjectnoCalico CNI configuration
opencenter.cluster.kubernetes.network_plugin.ciliumobjectnoCilium CNI configuration
opencenter.cluster.kubernetes.network_plugin.kube-ovnobjectnoKube-OVN CNI configuration

Each plugin object supports enabled (bool) and version (string). Calico additionally supports ipip_mode, vxlan_mode, and network_policy.

Example:

opencenter:
cluster:
kubernetes:
version: "v1.29.0"
network_plugin:
calico:
enabled: true
network_policy: true

opencenter.cluster.kubernetes.security​

YAML PathTypeRequiredDescription
opencenter.cluster.kubernetes.security.pod_security_policyboolnoEnable Pod Security Policy
opencenter.cluster.kubernetes.security.pod_security_standardsstringnoPSA level: privileged, baseline, restricted
opencenter.cluster.kubernetes.security.audit_loggingboolnoEnable API server audit logging
opencenter.cluster.kubernetes.security.encryption_at_restboolnoEnable etcd encryption at rest
opencenter.cluster.kubernetes.security.admission_controllerslistnoAdditional admission controllers

Source: internal/config/v2/cluster.go → KubernetesSecurityConfig.

opencenter.infrastructure​

Provider-agnostic infrastructure configuration with provider-specific extensions under cloud.

YAML PathTypeRequiredDescription
opencenter.infrastructure.providerstringyesProvider type: openstack, vmware, kind, baremetal (with vsphere accepted as a compatibility alias for vmware)
opencenter.infrastructure.sshobjectyesSSH configuration
opencenter.infrastructure.os_versionstringyesOperating system version
opencenter.infrastructure.server_group_affinitylistnoServer group affinity policies
opencenter.infrastructure.k8s_api_ipstringnoKubernetes API IP (IPv4)
opencenter.infrastructure.node_namingobjectnoNode naming prefix/suffix
opencenter.infrastructure.bastionobjectnoBastion host configuration
opencenter.infrastructure.networkingobjectyesNetwork topology and DNS
opencenter.infrastructure.computeobjectyesCompute resources (flavors, node counts)
opencenter.infrastructure.storageobjectyesStorage configuration (volumes, block devices)
opencenter.infrastructure.cloudobjectyesProvider-specific configuration

Source: internal/config/v2/infrastructure.go → InfrastructureConfig.

opencenter.infrastructure.ssh​

YAML PathTypeRequiredDescription
opencenter.infrastructure.ssh.authorized_keyslistyesSSH public keys (minimum 1)
opencenter.infrastructure.ssh.usernamestringnoSSH username

opencenter.infrastructure.networking​

YAML PathTypeRequiredDescription
opencenter.infrastructure.networking.subnet_nodesstringyesNode subnet CIDR (IPv4)
opencenter.infrastructure.networking.allocation_pool_startstringyesDHCP pool start IP
opencenter.infrastructure.networking.allocation_pool_endstringyesDHCP pool end IP
opencenter.infrastructure.networking.gatewaystringnoGateway IP
opencenter.infrastructure.networking.vrrp_ipstringconditionalVRRP virtual IP (required when vrrp_enabled: true)
opencenter.infrastructure.networking.vrrp_enabledboolnoEnable VRRP for HA
opencenter.infrastructure.networking.loadbalancer_providerstringyesLB provider: ovn, octavia, metallb, cloud-native
opencenter.infrastructure.networking.use_designateboolnoUse OpenStack Designate DNS
opencenter.infrastructure.networking.dns_zone_namestringyesDNS zone name (FQDN)
opencenter.infrastructure.networking.dns_nameserverslistyesDNS nameserver IPs (minimum 1)
opencenter.infrastructure.networking.ntp_serverslistyesNTP server addresses (minimum 1)

opencenter.infrastructure.compute​

YAML PathTypeRequiredDescription
opencenter.infrastructure.compute.flavor_bastionstringnoBastion VM flavor
opencenter.infrastructure.compute.flavor_masterstringnoControl plane VM flavor
opencenter.infrastructure.compute.flavor_workerstringnoWorker VM flavor
opencenter.infrastructure.compute.flavor_worker_windowsstringnoWindows worker VM flavor
opencenter.infrastructure.compute.master_countintegernoNumber of control plane nodes
opencenter.infrastructure.compute.worker_countintegernoNumber of worker nodes
opencenter.infrastructure.compute.worker_count_windowsintegernoNumber of Windows worker nodes
opencenter.infrastructure.compute.additional_server_pools_workerlistnoAdditional worker pools

opencenter.infrastructure.cloud​

Provider-specific configuration. Populate the sub-object matching your provider value.

YAML PathTypeDescription
opencenter.infrastructure.cloud.openstackobjectOpenStack-specific settings (auth_url, region, project_id, image_id, network_id, etc.)
opencenter.infrastructure.cloud.vmwareobjectVMware-specific settings (vcenter_server, datacenter, datastore, network, template)
opencenter.infrastructure.cloud.kindobjectLocal Kind runtime settings where applicable

Source: internal/config/v2/infrastructure.go → CloudConfig.

opencenter.services​

A polymorphic map of platform service configurations. Each key is a service name, and the value is decoded using the service registry.

Common fields shared by all services (via BaseServiceConfig):

FieldTypeRequiredDescription
enabledboolnoWhether the service is deployed
namespacestringnoTarget namespace
hostnamestringnoService hostname
image_repositorystringnoOverride image repository
image_tagstringnoOverride image tag
releasestringnoHelm release name

Example:

opencenter:
services:
cert-manager:
enabled: true
namespace: cert-manager
kyverno:
enabled: true
harbor:
enabled: false

Source: internal/config/v2/services.go → ServiceMap, BaseServiceConfig.

opencenter.gitops​

GitOps repository configuration for FluxCD.

YAML PathTypeRequiredDescription
opencenter.gitops.git_urlstringyesGit repository URL
opencenter.gitops.git_branchstringnoGit branch
opencenter.gitops.git_pathstringnoPath within the repository
opencenter.gitops.base_repo_urlstringnoopenCenter-gitops-base repository URL
opencenter.gitops.base_repo_releasestringnoBase repository release tag
opencenter.gitops.flux_intervalstringnoFluxCD reconciliation interval
opencenter.gitops.flux_pruneboolnoEnable FluxCD pruning

Source: internal/config/v2/config.go → GitOpsConfig.

secrets​

Top-level secrets configuration. In v2, this is a peer of opencenter, not nested inside it.

YAML PathTypeRequiredDescription
secrets.globalobjectnoInfrastructure-wide credentials (OpenStack credentials)
secrets.service_secretsmapnoPer-service secret values
secrets.sopsobjectnoSOPS encryption configuration

Source: internal/config/v2/config.go → SecretsConfig.

Secrets Backend (v1 path)

In v1 configurations, the secrets backend is configured at opencenter.secrets.backend (values: sops, barbican, file). In v2, SOPS configuration moved to secrets.sops at the top level. If you see references to secrets.backend in older documentation, the correct v2 path is secrets.sops.enabled and related fields.

secrets.sops​

YAML PathTypeRequiredDescription
secrets.sops.enabledboolnoEnable SOPS encryption
secrets.sops.age_key_filestringconditionalPath to Age key file (required when enabled: true)
secrets.sops.encrypted_regexstringnoRegex pattern for fields to encrypt

secrets.global​

YAML PathTypeRequiredDescription
secrets.global.openstack_auth_urlstringnoOpenStack auth URL
secrets.global.openstack_usernamestringnoOpenStack username
secrets.global.openstack_passwordstringnoOpenStack password
secrets.global.openstack_project_idstringnoOpenStack project ID

opentofu​

OpenTofu/Terraform backend configuration.

YAML PathTypeRequiredDescription
opentofu.backend.typestringyesBackend type: s3, local, remote
opentofu.backend.local.pathstringconditionalLocal state file path (required for local type)
opentofu.backend.s3.bucketstringconditionalS3 bucket name (required for s3 type)
opentofu.backend.s3.keystringconditionalS3 state key (required for s3 type)
opentofu.backend.s3.regionstringconditionalS3 region (required for s3 type)

Source: internal/config/v2/config.go → OpenTofuConfig.

deployment​

Deployment behavior configuration.

YAML PathTypeRequiredDescription
deploymentobjectnoDeployment settings (auto-deploy, etc.)

Source: internal/config/v2/deployment.go.

Complete Example​

schema_version: "2.0"
metadata:
labels:
team: platform
opencenter:
meta:
name: prod-cluster
organization: my-org
env: production
region: us-east-1
cluster:
cluster_name: prod-cluster
base_domain: k8s.example.com
cluster_fqdn: prod.k8s.example.com
admin_email: admin@example.com
kubernetes:
version: "v1.29.0"
api_port: 6443
subnet_pods: "10.233.64.0/18"
subnet_services: "10.233.0.0/18"
network_plugin:
calico:
enabled: true
network_policy: true
security:
audit_logging: true
encryption_at_rest: true
pod_security_standards: baseline
infrastructure:
provider: openstack
os_version: "22.04"
ssh:
authorized_keys:
- "ssh-ed25519 AAAA..."
networking:
subnet_nodes: "192.168.1.0/24"
allocation_pool_start: "192.168.1.100"
allocation_pool_end: "192.168.1.200"
dns_zone_name: k8s.example.com
dns_nameservers:
- "8.8.8.8"
ntp_servers:
- "pool.ntp.org"
loadbalancer_provider: octavia
compute:
master_count: 3
worker_count: 3
flavor_master: m1.large
flavor_worker: m1.xlarge
storage:
default_storage_class: csi-cinder-sc-delete
worker_volume_size: 100
worker_volume_destination_type: volume
worker_volume_source_type: image
worker_volume_type: HA-Standard
cloud:
openstack:
auth_url: "https://identity.example.com/v3"
region: us-east-1
project_id: "abc123"
image_id: "img-456"
network_id: "net-789"
services:
cert-manager:
enabled: true
kyverno:
enabled: true
harbor:
enabled: false
gitops:
git_url: "ssh://git@github.com/my-org/my-cluster.git"
git_branch: main
secrets:
sops:
enabled: true
age_key_file: "/path/to/age.key"
global:
openstack_auth_url: "https://identity.example.com/v3"
openstack_project_id: "abc123"

Schema Validation​

Run opencenter cluster validate to check a configuration against the schema. The --json flag outputs machine-readable results for CI/CD pipelines.

opencenter cluster validate my-cluster
opencenter cluster validate my-cluster --json