Skip to content

Configuration Reference

All configuration lives in group_vars/all.yml. Role defaults provide sensible starting points; see each role's defaults/main.yml for the full list of available variables.

Versions are not listed on this page. They are pinned in the defaults/main.yml of each role and kept up to date by Renovate.

Global

Variable Default Description
yake_install_method docker How tools are installed: docker runs them as containers, binary downloads static binaries to .local/.
proxy_env {} Proxy environment variables passed to all components. Set http_proxy, https_proxy, and no_proxy as needed.

Tool Versions

The kubectl_install, helm_install, and clusterctl_install roles provide the CLI tools. With yake_install_method: docker they run as the container images ghcr.io/yakecloud/<tool>; with binary the matching static binaries are downloaded to .local/.

Variable Default Description
kubectl_install_version see defaults kubectl version.
helm_install_version see defaults Helm version.
clusterctl_install_version see defaults clusterctl version.

Each role also exposes <role>_container_registry (default ghcr.io) and <role>_container_image (yakecloud/kubectl, yakecloud/helm, yakecloud/clusterctl) to pull the images from a different registry.

clusterapi_install_capi_version (v1.14.4, core, kubeadm bootstrap and control plane) and clusterapi_install_capo_version (v0.15.1, OpenStack) pin the Cluster API providers for clusterctl init and clusterctl upgrade apply. CAPO must match the vendored ORC manifest. The two pins are used independently by clusterctl init: an empty pin lets only that provider float to the latest version. With both pins set, clusterctl upgrade apply only runs if an installed provider differs from its pin. If either pin is empty, it runs on every playbook run and upgrades all providers to the latest versions of clusterapi_install_contract (default v1beta2).

With the binary method the downloads of kubectl, Helm and kind are verified against the published sha256 files. clusterctl, gardenctl and gardenlogin publish none and are not verified. Binaries are kept per version (.local/<tool>-<version>), so a version change takes effect.

The optional gardenctl_install role (tag gardenctl) is disabled by default. Set gardenctl_install_enabled: true to install gardenctl. The container image ghcr.io/yakecloud/gardenctl contains gardenctl, gardenlogin, and kubectl; with binary gardenctl and gardenlogin are downloaded to .local/.

Variable Default Description
gardenctl_install_enabled false Install gardenctl.
gardenctl_install_version see defaults gardenctl version (container image tag).
gardenctl_install_garden_name garden Identity of the garden in gardenctl-v2.yaml.
gardenctl_install_garden_kubeconfig /var/lib/yake/gardener-operator/kubeconfig.vgarden Kubeconfig of the virtual garden. It grants admin access.

The default gardenctl-v2.yaml is only written if it does not exist yet, so manual changes are kept.

Management Cluster

Configured via the management_cluster role.

Variable Default Description
management_cluster_engine kind Cluster engine: kind or k3s.
management_cluster_name clusterapi Name of the management cluster and prefix for its kubeconfig.
management_cluster_kind_version see defaults Version of the kind tool (ghcr.io/yakecloud/kind).
management_cluster_kind_cluster_version see defaults Kubernetes version for the kind node image (kindest/node).
management_cluster_kind_upgrade false Opt-in: replace a kind cluster running an older Kubernetes version than management_cluster_kind_cluster_version (see Upgrading the kind Management Cluster).
management_cluster_kind_upgrade_namespace default Namespace of the Cluster API objects that are backed up and restored.
management_cluster_kind_upgrade_backup_dir /var/lib/yake/backup Directory for the backups.
management_cluster_kind_cluster_api_server_address 127.0.0.1 Address the kind API server listens on.
management_cluster_k3s_version see defaults k3s version when using the k3s engine, with or without a leading v. +k3s1 is appended unless the value contains a +k3s<n> suffix. k3s is installed with Traefik and ServiceLB disabled (a management cluster does not need them). An existing k3s installation keeps its service arguments until its version changes, then they are applied by the reinstall.
management_cluster_kubeconfig /var/lib/yake/kubeconfig.<name> Path of the kubeconfig file.

The kubeconfig is written to management_cluster_kubeconfig, by default /var/lib/yake/kubeconfig.<management_cluster_name>.

Garden Cluster

The garden cluster is provisioned by the clusterapi_cluster role on OpenStack.

OpenStack Credentials

Variable Default Description
clusterapi_cluster_openstack_auth_url "" Keystone authentication URL.
clusterapi_cluster_openstack_application_credential_id "" Application credential ID.
clusterapi_cluster_openstack_application_credential_secret "" Application credential secret.
clusterapi_cluster_openstack_domain_name "" OpenStack domain name.
clusterapi_cluster_openstack_region_name "" OpenStack region.
clusterapi_cluster_openstack_cacert "" PEM-encoded CA certificate for TLS verification.
clusterapi_cluster_openstack_external_network public Name of the external (floating IP) network.
clusterapi_cluster_openstack_ssh_key_name <cluster name> Name of the OpenStack key pair for the nodes.
clusterapi_cluster_openstack_loadbalancer_provider ovn Octavia provider for the API server load balancer. Load balancers of LoadBalancer services are configured with clusterapi_cluster_lb_provider.
clusterapi_cluster_openstack_loadbalancer_allowed_cidrs [] Source CIDRs allowed to reach the API server load balancer (allowedCIDRs). Empty allows all. If set, it must include the addresses the cluster is reached from: the management cluster and the Ansible host, and the garden cluster nodes, otherwise Cluster API and the playbook lose access to the API server.

Machines

Variable Default Description
clusterapi_cluster_name garden Name of the garden cluster.
clusterapi_cluster_kubernetes_version see defaults Kubernetes version for the garden cluster.
clusterapi_cluster_openstack_image_id "" Glance image UUID for cluster nodes.
clusterapi_cluster_openstack_image_name "" Expected name of the image. Strongly recommended: it is used to verify that the image ID is correct.
clusterapi_cluster_ntp_servers [] NTP servers for the cluster nodes (chrony). Empty keeps the image defaults.
clusterapi_cluster_lb_provider "" Octavia provider (lb-provider) the cloud controller uses for new LoadBalancer services, for example amphora or ovn. We recommend ovn. Empty keeps the cloud controller default (amphora) and writes no [LoadBalancer] section. Only applies to load balancers created afterward; the cloud controller must be restarted to pick up a changed value. The provider has to exist on the platform. With ovn, manage-security-groups=true is set as well, so the cloud controller manages the Neutron security groups per LoadBalancer service; without it the load balancer is not reachable from outside. Existing load balancers keep their provider and have to be recreated (delete the Service) as part of a switch; the cloud controller applies the new method to their pools, which the old provider may reject. When switching away from ovn, delete the LoadBalancer services first: without manage-security-groups the cloud controller removes the security groups of the existing OVN load balancers and they lose external connectivity.
clusterapi_cluster_lb_method "" Load balancing algorithm (lb-method). Empty keeps the cloud controller default (ROUND_ROBIN), or SOURCE_IP_PORT for ovn, because the ovn provider rejects ROUND_ROBIN on some platforms. Set it to override. Validated against the provider (amphora if empty).
clusterapi_cluster_control_plane_machine_count 3 Number of control plane nodes.
clusterapi_cluster_control_plane_machine_flavor SCS-2V-4 OpenStack flavor for control plane nodes.
clusterapi_cluster_worker_machine_flavor SCS-4V-8 OpenStack flavor for worker nodes.
clusterapi_cluster_root_volume_enabled true Create a Cinder root volume. Set to false for flavors with local storage (for example local NVMe); the flavor's ephemeral disk is used then.
clusterapi_cluster_control_plane_root_volume_size 20 Root volume size of control plane nodes in GiB.
clusterapi_cluster_worker_root_volume_size 20 Root volume size of worker nodes in GiB.
clusterapi_cluster_root_volume_type __DEFAULT__ Cinder volume type.
clusterapi_cluster_root_volume_availability_zone first availability zone Availability zone of the root volumes.
clusterapi_cluster_openstack_availability_zones [nova] List of availability zones for control plane nodes.
clusterapi_cluster_csi_snapshotter_enabled false Deploy the CSI snapshotter. Requires VolumeSnapshot CRDs and a SnapshotClass to be installed separately.

Control plane and worker nodes are placed in OpenStack server groups with a soft-anti-affinity policy. This is controlled by clusterapi_cluster_control_plane_server_group_enabled, clusterapi_cluster_worker_server_group_enabled and the matching ..._server_group_policy variables.

Control plane machine health checks are enabled by default (clusterapi_cluster_control_plane_machine_health_check_enabled). Unhealthy nodes are remediated after 300s, with up to 3 retries (clusterapi_cluster_control_plane_remediation_max_retry).

Worker machine health checks are enabled by default as well, one per machine deployment (clusterapi_cluster_worker_machine_health_check_enabled). A worker is replaced after 300s with Ready Unknown or False, or when its Node has not registered after 20m (clusterapi_cluster_worker_machine_health_check_node_startup_timeout); remediation pauses while more than 40% of a deployment's workers are unhealthy (clusterapi_cluster_worker_machine_health_check_max_unhealthy). Deleting a worker spends at most 600s draining its Node and 600s waiting for its volumes to detach (clusterapi_cluster_worker_node_drain_timeout_seconds, clusterapi_cluster_worker_node_volume_detach_timeout_seconds), so a remediation of an unreachable worker cannot hang.

Worker machine deployments support multiple pools and failure domains:

clusterapi_cluster_worker_machine_deployments:
  - name: md-0
    replicas: 3
    failure_domain: nova
    image_id: "{{ clusterapi_cluster_openstack_image_id }}"

To specify different failure domains for machines and their volumes use:

clusterapi_cluster_worker_machine_deployments:
  - name: md-0
    replicas: 3
    failure_domain: nova
    root_volume_failure_domain: cinder
    image_id: "{{ clusterapi_cluster_openstack_image_id }}"

Make sure to also specify clusterapi_cluster_openstack_ignore_volume_az: true (default: false), so that the cinder-csi does not expose it on the PV, causing an AZ mismatch.

Networking

By default, CAPO creates a new network and subnet for the garden cluster. The subnet CIDR is set via clusterapi_cluster_openstack_managed_subnets (default: 172.28.0.0/24 with DNS nameserver 1.1.1.1):

clusterapi_cluster_openstack_managed_subnets:
  - cidr: "192.168.0.0/24"
    dns_nameservers:
      - "1.1.1.1"

The pod network is set via clusterapi_cluster_pod_cidr_blocks (default: [10.244.0.0/16]).

To use an existing subnet instead (for example, one allocated from an OpenStack subnet pool), set clusterapi_cluster_openstack_subnets. This is mutually exclusive with managed_subnets. DNS nameservers are configured on the subnet in OpenStack directly, not here.

clusterapi_cluster_openstack_subnets:
  - id: "existing-subnet-uuid"

CNI

Variable Default Description
clusterapi_cluster_network cilium CNI plugin: cilium or calico.
clusterapi_cluster_cilium_version see defaults Cilium chart version.
clusterapi_cluster_cilium_helm_values see defaults/main.yml Helm values for Cilium.
clusterapi_cluster_calico_version see defaults Calico chart version (tigera-operator).
clusterapi_cluster_calico_helm_values {} Helm values for Calico.
clusterapi_cluster_metrics_server_version see defaults metrics-server chart version.
clusterapi_cluster_metrics_server_helm_values see defaults/main.yml Helm values for metrics-server (2 replicas, --kubelet-insecure-tls).

Registry Caches and Host Entries

The nodes pull images through the registry caches at https://registry.osism.cloud/v2/<name>. The registry provides caches for dockerhub, pkg, gcr, ghcr, quay and k8s. The mirrors need a valid TLS certificate (no skip_verify). An empty URL disables a mirror. The URLs are set per upstream registry through clusterapi_cluster_container_registry_cache_dockerhub, ..._pkg, ..._gcr, ..._ghcr, ..._quay and ..._k8s.

To make additional hostnames resolvable on the nodes (for example for a private registry or Keystone), use clusterapi_cluster_hosts_entries:

clusterapi_cluster_hosts_entries:
  - ip: "12.34.56.54"
    hostname: "harbor.example.com"

Secrets Encryption

clusterapi_cluster_secrets_encryption_enabled (default false, enabled in group_vars/all.yml.example) encrypts Secrets at rest in the etcd of the garden cluster with secretbox. Without it, all Gardener credentials (OpenStack, DNS, CA key, kubeconfigs) are stored in plain text in etcd and in its backups or snapshots. It is recommended, but opt-in, because it cannot simply be disabled again.

Back up the key

Back up /var/lib/yake/encryption-key.<name>. Without it, you cannot read the encrypted Secrets any more.

The key is generated once and kept in the Secret <name>-encryption-config in the management cluster (moved along on kind upgrades) and in /var/lib/yake/encryption-key.<name> (mode 0600). An existing key is never replaced, rotation is a manual task. Once a cluster stores its Secrets encrypted, the role refuses to run with the variable set to false, because the API server could no longer read them. To turn encryption off on purpose, decrypt the stored Secrets first (see "Decrypt all data" in the Kubernetes documentation) and delete the config Secret.

On an existing cluster, enabling it rolls the control plane machines once. After the rollout, the role rewrites all Secrets one time so that they are stored encrypted, and records this with the annotation yake.cloud/secrets-encrypted on the config Secret.

Gardener Operator

The gardener_operator role deploys the Gardener Operator and configures the entire Gardener control plane.

Core Settings

Variable Default Description
gardener_operator_version see defaults Gardener Operator Helm chart version.
gardener_operator_kubernetes_version see defaults Kubernetes version for the internal seed shoot.
gardener_operator_cluster_name prod-garden Name of the garden cluster.
gardener_operator_login_check_enabled true Check after the virtual garden is ready that the dashboard login reaches Dex (https://dashboard.<garden_url>/auth must redirect to https://identity.<garden_url>/). The dashboard backend fetches the OIDC discovery for this, so it covers DNS, network and TLS from inside the cluster. Disable it if the Ansible host cannot reach the dashboard.
gardener_operator_login_check_validate_certs true Verify the TLS certificate of the dashboard during the login check. Set it to false for ACME staging or a generated CA, which the Ansible host does not trust.
gardener_operator_virtual_garden_high_availability false Run the virtual garden control plane highly available: 3 replicas each for etcd main and events (instead of 1), the virtual kube-apiserver and the gardener-apiserver (instead of 2), spread over the garden cluster nodes (and zones, if the runtime cluster has several). Use at least 3 worker nodes, so that each replica gets its own node. Cannot be disabled again once enabled. Switching an existing installation makes the Gardener API unavailable for a few minutes, see operations.
gardener_operator_garden_url example.com Base domain for the Gardener installation. Must be changed, the run fails with example.com.
gardener_operator_nodes_cidr "" Nodes CIDR of the garden cluster. Empty detects it from the first node's InternalIP (as /24). Set it if the nodes do not share that /24.
gardener_operator_ops_toolbelt_version see defaults Image tag of the ops-toolbelt for dashboard terminals.
gardener_operator_garden_cluster_admin_email admin@example.com Email address for the Gardener dashboard admin.
gardener_operator_networking_type cilium Default CNI for shoots: cilium or calico.
gardener_operator_image_registry europe-docker.pkg.dev Registry the Gardener component images are pulled from.
gardener_operator_gardenlet_image_vector_overwrite "" Image vector overwrite for all gardenlets, for example to pull images from a private registry.
gardener_operator_garden_dashboard_frontend_config {} Frontend configuration of the Gardener dashboard, for example externalTools links on every shoot. Replaces the whole frontend block, see the dashboard values.
gardener_operator_gardenlet_feature_gates {} Feature gates for all gardenlets (internal seed and managed seeds). The gardener-apiserver gate InPlaceNodeUpdates (Alpha) is set by the role in the Garden; gardenlets do not have this gate.
gardener_operator_seed_block_cidrs [169.254.169.254/32] CIDRs blocked in all shoot clusters via NetworkPolicy.
gardener_operator_proxy_host / gardener_operator_proxy_port "" / 3128 HTTP proxy for the managed seeds; also allowed through a NetworkPolicy.
gardener_operator_ntp_servers [] NTP servers for all shoot nodes. Injected as a systemd-timesyncd drop-in into the OperatingSystemConfigs via Kyverno (no package installation, works with the read-only Garden Linux root). Empty keeps the OS defaults, which are public NTP pools.

Dex and Kyverno

Dex provides OIDC login for the dashboard. It is configured through gardener_operator_dex:

gardener_operator_dex:
  dashboard_secret: "..."
  theme: dark              # optional, "light" or "dark"; empty keeps the Dex default (light)
  static_passwords:
    - email: "admin@example.com"
      username: "admin"
      hash: "$2a$10$..."   # bcrypt hash
  connectors: []           # see https://dexidp.io/docs/connectors/
Variable Default Description
gardener_operator_dex_version see defaults Dex Helm chart version.
gardener_operator_kyverno_version see defaults Kyverno Helm chart version.
gardener_operator_helm_values {} Additional Helm values for the Gardener Operator chart.

Projects

Additional Gardener projects are created from gardener_operator_projects (default: []). The project seeds that hosts the managed seeds is configured with gardener_operator_managed_seeds_project; its members default to the admin email above.

OpenStack Credentials

Used for the Gardener control plane, DNS, and backup integration.

Variable Default Description
gardener_operator_openstack_auth_url https://keystone.example.com Keystone URL.
gardener_operator_openstack_project_name example OpenStack project.
gardener_operator_openstack_domain_name example OpenStack domain.
gardener_operator_openstack_region_name RegionOne OpenStack region.
gardener_operator_openstack_application_credential_id "" Application credential ID.
gardener_operator_openstack_application_credential_name example-creds Application credential name.
gardener_operator_openstack_application_credential_secret "" Application credential secret.
gardener_operator_openstack_cacert "" PEM-encoded CA certificate.
gardener_operator_openstack_zones [zone1] Available availability zones.

DNS Provider

Gardener manages DNS records for shoots and internal domains. The provider is selected by gardener_operator_dns_provider_type.

Type Description
openstack-designate OpenStack Designate. Set gardener_operator_dns_credentials: {} to reuse the OpenStack credentials above.
aws-route53 AWS Route53. Provide AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and region in gardener_operator_dns_credentials.
azure-dns Azure DNS. Provide subscriptionID, tenantID, clientID, and clientSecret.
google-clouddns Google Cloud DNS. Provide the service account JSON as serviceaccount.json.

Provider Extensions

Extension versions are managed by Renovate and follow their respective upstream releases.

Variable Default Description
gardener_operator_provider_openstack_version see defaults OpenStack provider extension version.
gardener_operator_provider_aws_version see defaults AWS provider extension version (deployed only when DNS type is aws-route53).
gardener_operator_provider_azure_version see defaults Azure provider extension version (deployed only when DNS type is azure-dns).
gardener_operator_provider_gcp_version see defaults GCP provider extension version (deployed only when DNS type is google-clouddns).
gardener_operator_networking_cilium_version see defaults Cilium networking extension version.
gardener_operator_networking_calico_version see defaults Calico networking extension version.
gardener_operator_os_gardenlinux_version see defaults GardenLinux OS extension version.
gardener_operator_os_ubuntu_version see defaults Ubuntu OS extension version.
gardener_operator_shoot_cert_service_version see defaults Shoot certificate service version.
gardener_operator_shoot_dns_service_version see defaults Shoot DNS service version.
gardener_operator_extension_registry_cache_version see defaults Registry cache extension version (deployed only when registry caches or mirrors are configured).
gardener_operator_shoot_oidc_service_version see defaults Shoot OIDC service extension version (deployed only when gardener_operator_shoot_oidc_service_enabled is true, default false).
gardener_operator_backup_s3_version see defaults S3 backup extension version (deployed only when a backup provider is set to S3).

The storage class that the OpenStack provider extension creates for shoot control planes is set with gardener_operator_provider_openstack_storageclass_name (default: default), ..._storageclass_type and ..._storageclass_zone (default: nova). Raw Helm values for the extension can be passed with gardener_operator_provider_openstack_helm_values.

OS types to deploy are controlled by gardener_operator_os_types (default: [gardenlinux]). Add ubuntu to also support Ubuntu-based worker nodes.

Certificate Issuance

The shoot certificate service supports ACME (Let's Encrypt or your own ACME endpoint) and a CA. With a CA, no ACME endpoint or DNS challenge is needed (for example in air-gapped setups).

# ACME (default)
gardener_operator_shoot_cert_service_issuer_type: acme
gardener_operator_shoot_cert_service_acme_email: "certs@example.com"
gardener_operator_shoot_cert_service_acme_server: "https://acme-v02.api.letsencrypt.org/directory"
# Staging: https://acme-staging-v02.api.letsencrypt.org/directory

# Custom CA
gardener_operator_shoot_cert_service_issuer_type: ca
gardener_operator_shoot_cert_service_ca_certificate: |
  -----BEGIN CERTIFICATE-----
  ...
gardener_operator_shoot_cert_service_ca_key: |
  -----BEGIN RSA PRIVATE KEY-----
  ...

# Generated CA: issuer_type ca without certificate and key
gardener_operator_shoot_cert_service_issuer_type: ca

If issuer_type is ca and neither certificate nor key is set, the role generates a self-signed root CA once in gardener_operator_generated_ca_dir (default /var/lib/yake/ca) and reuses it. Its subject and validity are set with gardener_operator_generated_ca_common_name (default Gardener CA) and gardener_operator_generated_ca_days (default 3650). The validity must exceed the lifetime of the certificates it signs (Gardener requests about 180 days) and is not changed for an existing CA: delete the directory to apply a new value. Import ca.crt into your clients. The CA key is stored unencrypted on the Ansible host and in the cluster, so use your own (intermediate) CA for production. See the role README for details.

The nameservers used for the DNS precheck of the ACME challenge are set with gardener_operator_shoot_cert_service_precheck_nameservers (default: 1.1.1.1,1.0.0.1). They and gardener_operator_shoot_cert_service_ca_certificates only apply to ACME.

Monitoring

Shoot Prometheus metrics of all seeds can be forwarded to a central endpoint via remote write. It is enabled when remote_write.url is non-empty:

gardener_operator_monitoring:
  remote_write:
    url: "https://prometheus.example.com/api/v1/write"
    keep: []          # metric names to forward; empty forwards all
  basic_auth:
    username: ""
    password: ""

Cloud Profiles

Cloud profiles define the infrastructure options available to shoot clusters. Multiple profiles can be configured for different OpenStack environments.

gardener_operator_cloudprofiles:
  - name: openstack-a
    storageclasses:
      - name: ssd
        default: "true"
        type: ssd
        availability: nova
    floating_pools:
      - name: public
    loadbalancer_providers:
      - name: ovn
    keystone_urls:
      - region: region-a
        url: "https://keystone.example.com:5000"
    machine_images:
      - name: gardenlinux
        versions:
          - version: 2150.15.0
            image: "Garden Linux 2150.15"
            regions:
              - name: region-a
                id: "6ed7d8aa-e770-4061-a8d7-461a83e41c31"
    kubernetes_versions:
      - version: 1.37.2
        classification: supported
    machinetypes:
      - name: SCS-4V-8
        cpu: "4"
        gpu: "0"
        memory: 8Gi
    # Optional: flavor/image for `gardenctl ssh` bastions (must exist in this profile)
    bastion:
      machine_type: SCS-4V-8
      machine_image: gardenlinux
      machine_image_version: 2150.15.0  # optional
    regions:
      - name: region-a
        zones:
          - nova

Different compute and volume availability zones

If the Nova and Cinder availability zones are named differently (e.g. compute in AZ1, volumes in nova), set both fields on the cloud profile. Then shoots and managed seeds can run with compute and volumes in different zones. This also works with root disks of the OpenStack default volume type __DEFAULT__:

gardener_operator_cloudprofiles:
  - name: openstack-a
    ignore_volume_az: true               # PVs (e.g. etcd) via cinder-csi
    root_disk_availability_zone: nova    # root volumes of workers

root_disk_availability_zone requires provider-openstack 1.59.0 or later. See the role README for details.

Managed Seeds

Each entry in gardener_operator_managed_seeds creates a shoot cluster and registers it as a Gardener seed.

Field Required Description
name Yes Shoot and seed name.
cloudprofile_name Yes Name of the cloud profile to use.
networking_type Yes CNI: cilium or calico.
kubernetes_version Yes Kubernetes version for the seed shoot.
floating_pool_name Yes OpenStack floating pool for the seed's load balancer.
loadbalancer_provider No Load balancer provider (default: amphora). We recommend ovn. Alternatives: haproxy. It has to be listed in the loadbalancer_providers of the cloud profile.
serialize_image_pulls No Whether the kubelets of the seed nodes pull images one at a time (Gardener default: true). false lets the pulls run in parallel, so that one slow image does not block all other pods of a node.
internal_domain No Internal domain of the seed (default: internal.<gardener_operator_garden_url>).
workers_cidr No Worker subnet CIDR (default: 100.96.0.0/16). Mutually exclusive with subnet_pool.
subnet_pool No Allocate the worker subnet from an OpenStack subnet pool instead of using an explicit CIDR.
openstack Yes OpenStack credentials for this seed (see below).
workers Yes List of worker pool configurations (see below).
settings Yes Seed settings (see below).

Subnet pool allocation:

When a subnet pool is configured, the OpenStack provider allocates the CIDR automatically. This is mutually exclusive with workers_cidr.

subnet_pool:
  id: "subnet-pool-uuid"
  prefix_length: 24  # optional, controls the allocated subnet size

OpenStack credentials per seed:

openstack:
  auth_url: "https://keystone.example.com:5000"
  project_name: "seed-project"
  domain_name: "my-domain"
  region_name: "region-a"
  application_credential_id: "..."
  application_credential_name: "yake-seed-a"
  application_credential_secret: "..."
  # cacert: |  # optional, for custom CA
  #   -----BEGIN CERTIFICATE-----

Worker pool configuration:

workers:
  - name: worker-4v16
    machinetype: SCS-4V-16
    image_name: gardenlinux
    image_version: 2150.15.0
    minimum: 3
    maximum: 15
    volume_type: ssd       # optional
    volume_size: 50Gi
    zones:
      - nova

Seed settings:

settings:
  excess_capacity_reservation: true  # reserve capacity for shoot control planes
  backup:                             # optional, enables etcd backups for shoots on this seed
    provider: openstack
    region: region-a
    credentials:
      authURL: "..."
      tenantName: "..."
      domainName: "..."
      regionName: "..."
      applicationCredentialID: "..."
      applicationCredentialName: "..."
      applicationCredentialSecret: "..."

Backups

Garden etcd backup (enabled when gardener_operator_garden_backup_credentials is non-empty):

gardener_operator_garden_backup_provider: openstack
gardener_operator_garden_backup_region: "region-a"
gardener_operator_garden_backup_bucket_name: gardener-etcd
gardener_operator_garden_backup_credentials: |
  authURL: "..."
  tenantName: "..."
  ...

Internal seed etcd backup (enabled when gardener_operator_internal_seed_backup_credentials is non-empty):

gardener_operator_internal_seed_backup_provider: openstack
gardener_operator_internal_seed_backup_region: "region-a"
gardener_operator_internal_seed_backup_credentials: |
  authURL: "..."
  ...

An empty gardener_operator_garden_backup_bucket_name lets gardener-operator create and own the bucket garden-<Garden UID> and delete it with the Garden; the name cannot be changed once the Garden has a backup. A seed's bucket is always named after the seed's UID, so seeds take no bucket name.

A Garden that is rebuilt after its runtime cluster was lost gets a new UID and therefore a new, empty bucket. To restore the virtual garden from the old snapshots instead, set gardener_operator_garden_backup_bucket_name to the old name garden-<old Garden UID> before the new Garden is created; the snapshots keep the same prefix, so its etcd restores from them. Record the generated name while the landscape runs, for example with kubectl get backupbuckets.extensions.gardener.cloud in the runtime cluster. The bucket only survives when the Garden is not deleted, because gardener-operator deletes the bucket it owns together with the Garden.

The internal seed's excess_capacity_reservation is controlled by gardener_operator_internal_seed_excess_capacity_reservation (default: "false"). Only enable it on hosts with more than 16Gi of RAM.

S3-compatible storage is also supported by setting the provider to S3 and configuring the corresponding credentials.

Registry Mirrors

Registry caches (gardener_operator_managed_seeds_registry_caches, default []) run a pull-through cache inside the seed for each listed upstream, with an optional volume_size. To proxy container image pulls through a private registry instead, configure gardener_operator_managed_seeds_registry_mirrors. The registry cache extension is deployed automatically when this list is non-empty.

gardener_operator_managed_seeds_registry_mirrors:
  - upstream: docker.io
    host: "https://harbor.example.com/docker.io"
  - upstream: registry.k8s.io
    host: "https://harbor.example.com/registry.k8s.io"
  - upstream: europe-docker.pkg.dev
    host: "https://harbor.example.com/europe-docker.pkg.dev"
    ca: true  # set to true if the mirror uses a custom CA certificate

When ca: true is set for any mirror, provide the CA bundle:

gardener_operator_managed_seeds_registry_mirrors_ca: |
  -----BEGIN CERTIFICATE-----
  ...
  -----END CERTIFICATE-----