Skip to content

Installation

This guide walks through the installation, configuration, and first deployment of the yake-ansible platform. Check the requirements first.

Install the Dependencies

Create a Python virtual environment and install the required dependencies:

python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
ansible-galaxy install -f -r requirements.yml

Configuration

Copy the example configuration and open it for editing:

cp group_vars/all.yml.example group_vars/all.yml
$EDITOR group_vars/all.yml

The following sections are required for a minimal working deployment.

OpenStack Credentials

These credentials are used for the garden cluster and the Gardener control plane. Application credentials are recommended over username and password.

gardener_operator_openstack_auth_url: "https://keystone.example.com:5000"
gardener_operator_openstack_project_name: "my-project"
gardener_operator_openstack_domain_name: "my-domain"
gardener_operator_openstack_region_name: "RegionOne"
gardener_operator_openstack_application_credential_id: "..."
gardener_operator_openstack_application_credential_name: "yake"
gardener_operator_openstack_application_credential_secret: "..."

If your OpenStack uses a custom CA certificate, set it as a multiline string:

gardener_operator_openstack_cacert: |
  -----BEGIN CERTIFICATE-----
  ...
  -----END CERTIFICATE-----

Garden URL

The base domain for the Gardener installation. A wildcard DNS entry for this domain must point to the garden cluster's ingress load balancer IP.

gardener_operator_garden_url: "gardener.example.com"

DNS Provider

The DNS provider used by Gardener for shoot DNS records and internal domain management. OpenStack Designate is the default:

gardener_operator_dns_provider_type: "openstack-designate"
gardener_operator_dns_credentials: {}  # reuses OpenStack credentials above

For other providers (AWS Route53, Azure DNS, Google Cloud DNS), set the type and provide the corresponding credentials. See configuration.md for examples.

Cloud Profile

A cloud profile defines the available machine types, images, regions, and storage classes for a particular OpenStack environment. At least one cloud profile is required.

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
    regions:
      - name: region-a
        zones:
          - nova

Managed Seed

A managed seed is a Gardener shoot that is also registered as a Gardener seed. It provides capacity for hosting shoot cluster control planes.

gardener_operator_managed_seeds:
  - name: seed-a
    cloudprofile_name: openstack-a
    networking_type: cilium
    kubernetes_version: 1.37.2
    floating_pool_name: "public"
    loadbalancer_provider: ovn
    openstack:
      auth_url: "https://keystone.example.com:5000"
      project_name: "my-project"
      domain_name: "my-domain"
      region_name: "region-a"
      application_credential_id: "..."
      application_credential_name: "yake-seed"
      application_credential_secret: "..."
    workers:
      - name: worker-4v16
        machinetype: SCS-4V-16
        image_name: gardenlinux
        image_version: 2150.15.0
        minimum: 3
        maximum: 15
        volume_type: ssd
        volume_size: 50Gi
        zones:
          - nova
    settings:
      excess_capacity_reservation: true

Garden Cluster

The garden cluster is created by Cluster API. Configure the OpenStack credentials and machine sizes for it:

clusterapi_cluster_openstack_auth_url: "https://keystone.example.com:5000"
clusterapi_cluster_openstack_application_credential_id: "..."
clusterapi_cluster_openstack_application_credential_secret: "..."
clusterapi_cluster_openstack_domain_name: "my-domain"
clusterapi_cluster_openstack_region_name: "RegionOne"
clusterapi_cluster_openstack_image_id: "your-image-uuid"
clusterapi_cluster_openstack_image_name: "expected-image-name"  # recommended, verifies the image ID

Machine Images

Machine images must be uploaded to your OpenStack Glance before running the playbook. GardenLinux is the recommended OS. See scripts/README.md for tools that automate this step.

Running the Playbook

Once the configuration is complete, run the full setup:

ansible-playbook -i localhost, -c local site.yml

Sudo with a password

On hosts where sudo requires a password, add --ask-become-pass.

Individual steps can be run with tags: kubectl, helm, clusterctl, management-cluster, clusterapi, garden-cluster and gardener. See How it works for the full list.

The playbook takes approximately 15 to 30 minutes to complete, depending on OpenStack provisioning speed. You can follow the progress in the output of each play.

Validating the Deployment

After the playbook completes, verify each layer:

# Management cluster
export KUBECONFIG=/var/lib/yake/kubeconfig.clusterapi
./.local/yake-kubectl get nodes

# Garden cluster
export KUBECONFIG=/var/lib/yake/kubeconfig.garden
./.local/yake-kubectl get nodes
./.local/yake-kubectl get pods -n garden

# Virtual Garden
export KUBECONFIG=/var/lib/yake/kubeconfig.garden
kubectl get secret gardener -n garden -o jsonpath='{.data.kubeconfig}' \
  | base64 -d > /var/lib/yake/gardener-operator/kubeconfig.vgarden
export KUBECONFIG=/var/lib/yake/gardener-operator/kubeconfig.vgarden
./.local/yake-kubectl get seeds
./.local/yake-kubectl get cloudprofiles

All seeds should show Ready status. Cloud profiles should list the machines, images, and regions you configured.

Next, create your first shoot cluster.