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