Skip to main content

Kubernetes on Leafcloud

Kubernetes Your Way, On Truly Green Cloud

Run Kubernetes with complete control on OpenStack infrastructure based in Amsterdam. Deploy using your preferred tools like Rancher, Kubeadm, or Terraform. No cluster management fees, just pay for the sustainable infrastructure you use. Need managed instead? Our Gardener platform handles everything for you. Either way, you get Green and EU-sovereign infrastructure.

Decorative illustration

No Cluster Fees

Pay only for VMs

OpenStack Platform

Full API access

Amsterdam, NL

EU data residency

Multiple Tools

Rancher, Kubeadm, RKE2

When to Choose Self-Managed

For Teams with Kubernetes Expertise

Self-managed Kubernetes on Leafcloud OpenStack is ideal for teams who need complete control over cluster configuration, want to use specific K8s distributions or tools, have existing Kubernetes expertise, or prefer to avoid recurring cluster management fees. You handle the operations, we provide the sustainable infrastructure.

Carbon Reducing

Calculate Your Yearly Emissions Reduction

Our compute heavy machines are housed in apartment complexes and care homes. That means your workload reduces emissions for heating shower water by replacing natural gas use. With the heat from your workload people get a hot shower! Find out by how much you can reduce emissions

Setup Options

Deploy Your Way

Rancher

UI-based cluster management with visual workflows. Perfect for teams who want a dashboard interface. Full documentation available.

Talos Linux

Immutable, minimal Kubernetes OS. API-driven management, secure by default. Fully supported on Leafcloud OpenStack.

RKE2

Security-focused Kubernetes from Rancher. Government-grade security with FIPS 140-2 compliance ready.

Terraform

Infrastructure-as-code with OpenStack provider. Full cluster automation, version control, and reproducible deployments.

Kubeadm

Manual cluster bootstrapping for complete control. Standard Kubernetes tooling for hands-on management.

Cluster API

Declarative cluster lifecycle management. Kubernetes-native cluster provisioning and scaling.

Technical Implementation

OpenStack-Powered Kubernetes

Deploy control plane and worker nodes on Leafcloud VMs. Full OpenStack API access for automation—no hidden layers between you and the infrastructure.

Cinder Persistent Volumes

OpenStack Cinder automatically provisions block storage for PVCs. Network-attached volumes with snapshots and backups.

Octavia Load Balancers

LoadBalancer services create OpenStack Octavia LBs automatically. External IPs, SSL termination, health checks.

Neutron Networking

Full SDN control with security groups, floating IPs, and private networks. Standard Kubernetes CNI plugins supported.

No Cluster Fees

Pay Only for Infrastructure

Unlike managed Kubernetes, self-managed clusters have no monthly cluster fee. You pay only for the compute resources (VMs, storage, networking) you consume. Perfect for cost-conscious teams with existing Kubernetes expertise who want maximum control and minimum recurring costs.

Managed vs Self-Managed

Which Option is Right for You?

feature Managed (Gardener) Self-Managed
Cluster Management Fully automated by Gardener You manage (Rancher, Kubeadm, RKE2)
Cluster Fee/month €84.50 (includes SLA) €0 (no cluster fee)
Control Plane Managed by Gardener You provision & maintain
Upgrades Automated with rolling updates Manual planning & execution
OpenStack Integration ✓ Automatic (Cinder, Octavia, Neutron) ✓ Requires cloud-controller-manager setup
GPU Support ✓ A30, H100, RTX 6000 Blackwell ✓ A30, H100, RTX 6000 Blackwell
Kubernetes Distribution Upstream Kubernetes (Gardener) Your choice (RKE2, K3s, vanilla, etc.)
Monitoring & Alerts Built-in Gardener monitoring Bring your own (Prometheus, etc.)
Backup & DR Built-in etcd backups You configure (Velero, etc.)
Multi-Cluster Management Gardener dashboard Rancher or custom tooling
Best For Teams wanting operational simplicity Teams with K8s expertise & full control needs
Both options use the same OpenStack infrastructure in AmsterdamVM costs (compute resources) billed separately for both optionsSelf-managed requires Kubernetes operational expertise

EU-Sovereign Kubernetes

Amsterdam Infrastructure with Full Data Control

Dutch-owned infrastructure in Amsterdam. Your Kubernetes workloads and data stay under EU jurisdiction with full GDPR compliance.

EU-Sovereign Kubernetes Amsterdam Infrastructure with Full Data Control

No US CLOUD Act

Unlike AWS EKS or Azure AKS—not subject to US data access laws.

GDPR Compliant

ISO 27001 & SOC2 certified. All data stays in Netherlands.

OpenStack Open Source

No proprietary lock-in. Standard APIs. Migrate workloads freely.

Getting Started

Deploy Kubernetes on Leafcloud

Ready to deploy your own Kubernetes cluster? Start with our Rancher tutorial, explore Terraform examples, or contact our team for guidance on your specific K8s setup.

About Leafcloud

Helping Forward Thinkers Succeed

We empower businesses to grow sustainably, stay secure, and maintain control. Whether your focus is on the environment, avoiding vendor lock-in, or data sovereignty, we’re here to help you succeed.

Sustainable Innovation

We transform existing buildings into energy-efficient Leaf sites, reusing residual heat to warm urban buildings and provide free hot showers. No new data centers, no carbon credits—just real impact. Lower costs for you, less waste for the planet.

European Standards

We prioritize your data privacy with GDPR compliance, ISO 27001, and SOC2 certifications. Your data stays protected and sovereign—right where it belongs.

Open-Source Freedom

Built on OpenStack open-source technology, we provide flexible APIs and industry standards. Enjoy seamless multi-cloud integration without the risk of vendor lock-in, so you stay in control.

Any Questions?

Yes. Leafcloud supports Infrastructure as Code (IaC) for both managed and self-managed Kubernetes deployments. Your approach depends on whether you want Gardener-managed clusters or full DIY control.

Managed Kubernetes with Terraform:

For Gardener-managed clusters, use the official Gardener Terraform provider. Define cluster specifications including:

  • Kubernetes version and worker pools
  • Machine types and networking configuration
  • Extensions as Terraform resources

The provider handles the entire cluster lifecycle—terraform apply creates the cluster, terraform destroy removes it. State management works identically to other Terraform providers. Example configurations are available in Leafcloud documentation showing multi-worker-pool setups, GPU node pools, and hibernation schedules.

Self-Managed Kubernetes with Terraform:

For self-managed clusters, use the OpenStack Terraform provider to provision the underlying infrastructure:

  • Create VMs for control plane and worker nodes
  • Configure networking with Neutron
  • Provision Cinder volumes for etcd storage
  • Set up security groups

Then bootstrap Kubernetes using your preferred method (Rancher, Kubeadm, RKE2) via cloud-init scripts or Terraform provisioners. This approach gives you complete control over every layer of the stack.

Rancher with Terraform:

Rancher provides its own Terraform provider (rancher2) that can provision RKE or RKE2 clusters on Leafcloud infrastructure. First use OpenStack provider to create VMs, then use Rancher provider to install and configure Kubernetes. This combines infrastructure automation with Rancher's cluster management features.

Other IaC Tools:

Beyond Terraform, Leafcloud supports:

  • Ansible: OpenStack modules + kubespray
  • Pulumi: OpenStack provider
  • Direct OpenStack APIs: Custom tooling
  • Gardener CLI: gardenctl with YAML definitions—perfect for GitOps workflows with ArgoCD or Flux

Best Practice:

Start with Gardener-managed Kubernetes via Terraform if you want operational simplicity. Switch to self-managed when you need specific distributions, custom control plane configurations, or want to eliminate the €84.50/month cluster management fee. Both approaches integrate seamlessly with CI/CD pipelines and GitOps practices.

Need help? Our Amsterdam team provides IaC examples and migration guidance. Email hello@leaf.cloud or schedule a call.

Gardener has its own command-line tool called gardenctl. You can use gardenctl to connect to your cluster and manage your garden.

  • Install Gardenctl: Follow the installation instructions provided in the Leafcloud documentation.
  • Connect to Your Cluster: Use gardenctl commands to access and manage your Kubernetes cluster efficiently. For detailed steps, refer to the Leafcloud Gardenctl Documentation.

You can manage and create Kubernetes clusters (shoots) using Gardener in two main ways:

  • Declaratively with YAML:
    • Define cluster configurations in YAML files.
    • Use gardenctl to apply these configurations, creating or updating clusters as specified.
  • Via the Gardener UI:
    • Access the Gardener dashboard at dashboard.gardener.leaf.cloud.
    • Use the intuitive interface to manage and create clusters. Both methods offer flexible and efficient cluster management. For detailed instructions, visit the Leafcloud Gardenctl Documentation.

The Kubernetes setup consists of several parts:

  • Control Plane: Managed by Leafcloud, it oversees the Kubernetes cluster.
  • Worker Nodes: Created in the customer's OpenStack project to run applications and workloads.
  • Networking: Configured in the customer's OpenStack project to connect worker nodes and resources.
  • Security Groups: Enhance security and control network access in the customer's OpenStack project.

The upgrade process includes:

  • Node Replacement: Nodes are replaced one by one when changing the Kubernetes version.
  • Workload Migration: Workloads from old nodes are automatically migrated to the new nodes.
  • Seamless Transition: Ensures minimal downtime, maintaining consistency and smooth operation.

When you create a Kubernetes Service with type: LoadBalancer, Leafcloud automatically provisions an OpenStack Octavia load balancer and assigns it an external IP address. This integration works identically for both Gardener-managed and self-managed Kubernetes clusters.

Automatic Provisioning:

The Kubernetes cloud-controller-manager detects the LoadBalancer service and calls the OpenStack Octavia API to create a load balancer resource. Within 30-60 seconds, Octavia provisions the LB infrastructure, allocates a floating IP from your project's IP pool, and updates the Kubernetes service with the EXTERNAL-IP field.

Your application becomes accessible from the internet immediately.

Load Balancer Configuration:

Octavia creates a Layer 4 TCP/UDP load balancer by default. The LB monitors backend health via TCP connection checks to the NodePort on each worker node.

Traffic flows: External IP → Octavia LB → NodePort on worker nodes → kube-proxy → application pods.

This architecture provides high availability—if a worker node fails, Octavia automatically routes traffic to healthy nodes.

Advanced Options:

Use service annotations to customize LB behavior:

  • Set loadbalancer.openstack.org/floating-network-id to specify which external network to use for the floating IP
  • Configure loadbalancer.openstack.org/timeout-client-data for connection timeouts (useful for WebSocket or long-polling applications)
  • Enable proxy protocol with loadbalancer.openstack.org/proxy-protocol: "true" to preserve client IP addresses

SSL/TLS Termination:

For HTTPS, two approaches work:

  1. Use an Ingress controller (NGINX, Traefik) behind a LoadBalancer service—the Ingress handles TLS termination and routes to multiple backend services
  2. Configure Octavia LB with TLS certificates directly via OpenStack annotations

The first approach is more common for Kubernetes workloads.

Cost and Cleanup:

Each LoadBalancer service creates one Octavia LB instance in your OpenStack project. Pricing is based on the load balancer resource (check pricing page for current rates).

When you delete the Kubernetes service with kubectl delete, the cloud-controller-manager automatically deletes the corresponding Octavia LB and releases the floating IP. No manual cleanup required.

Self-Managed Clusters:

For self-managed Kubernetes, ensure your cluster has the OpenStack cloud-controller-manager installed and configured with proper credentials (clouds.yaml).

Without this component, LoadBalancer services will remain in <pending> state indefinitely. Rancher and most OpenStack-aware Kubernetes installers configure this automatically, but DIY setups with Kubeadm require manual cloud-controller-manager deployment.

Monitoring:

View load balancer status in the OpenStack Horizon dashboard under Network → Load Balancers. Check health monitor status, active connections, and traffic statistics.

Kubernetes events (kubectl describe service <name>) show provisioning progress and any errors during LB creation.

When you create a PersistentVolumeClaim (PVC) in Kubernetes, the OpenStack Cinder CSI driver automatically provisions a block storage volume in your OpenStack project. This dynamic provisioning works for both Gardener-managed and self-managed Kubernetes clusters on Leafcloud infrastructure.

Automatic Volume Provisioning:

The Kubernetes CSI controller watches for new PVC resources. When detected, it calls the OpenStack Cinder API to create a volume with the requested size and storage class.

Cinder provisions the volume from available storage pools (typically network-attached SSD or HDD storage). The CSI driver then creates a PersistentVolume (PV) resource in Kubernetes that references the Cinder volume ID.

The PV and PVC bind automatically, and the volume becomes available for pod mounting.

Storage Classes:

Leafcloud provides multiple StorageClass options:

  • Default class: Standard SSD storage with reasonable IOPS for general workloads
  • High-performance classes: Faster NVMe-backed volumes for databases and I/O-intensive applications
  • Parameters: Control volume type, replication factor, and encryption settings

Check available storage classes with kubectl get storageclass.

Volume Attachment:

When a pod uses a PVC, the Cinder CSI node plugin attaches the volume to the worker node running the pod. For Cinder volumes, this creates an iSCSI or RBD connection from the worker node to the storage backend.

The volume appears as a block device on the node, which Kubernetes then formats (first use only) and mounts to the pod's filesystem at the specified mountPath.

Multiple pods can share a PVC if the StorageClass supports ReadWriteMany access mode, though most Cinder volumes use ReadWriteOnce (single writer).

Volume Features:

Snapshots: Cinder volumes support snapshots via VolumeSnapshot resources. Create point-in-time backups of data without stopping applications. Snapshots can restore to new PVCs for testing, disaster recovery, or cloning environments.

Volume expansion: Works dynamically—edit the PVC to request a larger size, and the CSI driver expands the underlying Cinder volume without pod restarts (filesystem must support online resize, like ext4 or XFS).

Data Persistence:

Unlike ephemeral pod storage, PVC data persists after pod deletion. The PVC and underlying Cinder volume remain intact until you explicitly delete the PVC resource.

Set reclaimPolicy: Retain on StorageClass to preserve Cinder volumes even after PVC deletion (useful for forensic analysis or data recovery). Default policy is Delete, which removes the Cinder volume when the PVC is deleted.

Performance Considerations:

Network-attached Cinder volumes have higher latency than local NVMe storage (typically 1-5ms vs <1ms).

For latency-sensitive workloads like databases:

  • Use storage classes backed by fast SSD storage
  • Consider local volumes if data persistence isn't critical
  • Check volume IOPS limits in your storage class—some classes enforce QoS limits to ensure fair resource sharing across tenants

Self-Managed Clusters:

For self-managed Kubernetes, ensure the Cinder CSI driver is installed and configured with OpenStack credentials.

Rancher and OpenStack-aware Kubernetes distributions include this by default. DIY Kubeadm clusters require manual CSI driver deployment using Helm charts or manifests from the cloud-provider-openstack project.

Configure the CSI driver with your clouds.yaml credentials file.

Monitoring and Troubleshooting:

View Cinder volumes in the OpenStack Horizon dashboard under Volumes → Volumes. Check volume status, attachment state, and size.

For PVC issues, inspect events with kubectl describe pvc <name>.

Common problems include:

  • Quota exhaustion (too many volumes)
  • Insufficient storage capacity in the Cinder pool
  • Misconfigured CSI driver credentials

Cost Management:

Cinder volumes are billed based on provisioned size (GB/month), not actual usage. A 100GB PVC costs the same whether empty or full.

Cost optimization tips:

  • Delete unused PVCs to reduce costs
  • Use volume snapshots sparingly—snapshots also incur storage costs
  • Check the Leafcloud pricing page for current Cinder volume rates

Our Gardener Managed Kubernetes service is available here. For self-managed Kubernetes on OpenStack, see this guide.

You can find documentation related to Leafcloud Kubernetes here.

Leafcloud supports both Calico and Cilium network types.

Leafcloud offers Kubernetes 1.32 (stable) and Kubernetes 1.33 (preview).

Version 1.32 (Stable): Current production-ready release. Fully tested and validated. Recommended for all production workloads. Includes latest stable features, security patches, and bug fixes.

Version 1.33 (Preview): Early access to upcoming release. Test new features before general availability. Suitable for development/staging environments. Helps prepare for future upgrades.

Update policy: Leafcloud stays within 1-2 versions of the latest upstream Kubernetes release. When a new version reaches stable status, we add it within 4-6 weeks. Older versions remain available for 6 months after deprecation to allow migration time.

Standard Kubernetes API: All Gardener-managed clusters use the standard Kubernetes API, ensuring compatibility with standard tooling (kubectl, Helm, Terraform, ArgoCD, etc.). You can migrate workloads to/from any standard Kubernetes cluster without code changes.

Zero-downtime updates: Upgrade clusters via Gardener dashboard with rolling updates. Worker nodes update sequentially, maintaining workload availability. Schedule maintenance windows or enable auto-update for hands-free management.

Need Help Getting Started?

Our Amsterdam-based team is here to help. Whether you need guidance on Kubernetes setup, OpenStack configuration, or just want to discuss your infrastructure needs—reach us via email or plan a call.