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.goConfig 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.goConfigMetadata.

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.goMetaConfig.

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.goClusterConfig.

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.goKubernetesConfig.

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.goKubernetesSecurityConfig.

opencenter.infrastructure

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

YAML PathTypeRequiredDescription
opencenter.infrastructure.providerstringyesProvider type: openstack, vmware, kind, baremetal, with compatibility values including vsphere, aws, gcp, and azure
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.goInfrastructureConfig.

Planned Providers

aws, gcp, and azure are planned compatibility values and not part of the documented GA provider set. Currently documented GA providers: openstack, vmware, kind, baremetal.

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
opencenter.infrastructure.cloud.awsobjectAWS-specific settings (region, vpc_id, subnet_ids, ami_id)
opencenter.infrastructure.cloud.gcpobjectGCP-specific settings (project, region, network, subnetwork)
opencenter.infrastructure.cloud.azureobjectAzure-specific settings (subscription_id, resource_group, location)

Source: internal/config/v2/infrastructure.goCloudConfig.

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.goServiceMap, 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.goGitOpsConfig.

secrets

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

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

Source: internal/config/v2/config.goSecretsConfig.

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.aws_access_keystringnoAWS access key ID
secrets.global.aws_secret_keystringnoAWS secret access key
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.goOpenTofuConfig.

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