Gardener Architecture
Our managed Kubernetes service is built on Gardener — an open-source Kubernetes-as-a-Service platform that lets us run Kubernetes clusters at scale. This page explains the architecture so you understand what happens behind the scenes when you create a cluster in the Cloud Services Portal.
What is Gardener?
Gardener is an open-source project that provides Kubernetes clusters as a service. Instead of managing each cluster's control plane individually on dedicated master nodes, Gardener consolidates control planes onto a shared management cluster. This makes it possible to operate dozens of clusters efficiently with centralised updates, monitoring, and backups.
Seed and Shoot
Gardener uses two key concepts:
| Concept | What it is | Who manages it |
|---|---|---|
| Seed | A Kubernetes cluster that hosts the control planes of all shoot clusters | We do |
| Shoot | A user-created Kubernetes cluster — your cluster | You do (worker nodes & workloads) |
How it works
- You create a cluster in the Cloud Services Portal.
- The portal calls the Gardener API on the Seed cluster.
- Gardener provisions a control plane (API server, etcd, scheduler, controller-manager) for your shoot as a set of pods in a dedicated namespace on the Seed.
- Gardener provisions worker nodes as OpenStack VMs in the region you selected.
- Your shoot cluster is ready — you connect with
kubectlusing the kubeconfig from the portal.
The key insight: your cluster's control plane runs on the Seed, not on your worker nodes. The worker nodes only run your workloads (pods). This separation is what makes the service "managed" — we handle control plane updates, HA, and etcd backups; you handle your applications.
%%{init: {'themeVariables': {'textColor': '#333333', 'edgeLabelBackground': '#ffffff', 'clusterBkg': 'transparent', 'clusterBorder': '#999999'}}}%%
flowchart TD
Portal["Cloud Services Portal"]
subgraph Seed ["Gardener Seed Cluster (managed)"]
CP1["Shoot A · Control Plane<br>API server · etcd · scheduler"]
CP2["Shoot B · Control Plane<br>API server · etcd · scheduler"]
end
subgraph ZH ["OpenStack · ch-zh1 · Zurich"]
W1["Worker Node"]
W2["Worker Node"]
end
subgraph GE ["OpenStack · ch-ge1 · Geneva"]
W3["Worker Node"]
W4["Worker Node"]
end
Portal -->|"Gardener API"| CP1
Portal -->|"Gardener API"| CP2
CP1 -->|"manages"| W1
CP1 -->|"manages"| W2
CP2 -->|"manages"| W3
CP2 -->|"manages"| W4
classDef portal fill:#e3f2fd,stroke:#1565c0,color:#0d47a1;
classDef cp fill:#e8f5e9,stroke:#2e7d32,color:#1b5e20;
classDef worker fill:#fff3e0,stroke:#e65100,color:#bf360c;
class Portal portal;
class CP1,CP2 cp;
class W1,W2,W3,W4 worker;
linkStyle 0,1 stroke:#1565c0,stroke-width:2px;
linkStyle 2,3,4,5 stroke:#2e7d32,stroke-width:2px;
%%{init: {'themeVariables': {'textColor': '#e0e0e0', 'edgeLabelBackground': '#2a2a2a', 'clusterBkg': 'transparent', 'clusterBorder': '#666666'}}}%%
flowchart TD
Portal["Cloud Services Portal"]
subgraph Seed ["Gardener Seed Cluster (managed)"]
CP1["Shoot A · Control Plane<br>API server · etcd · scheduler"]
CP2["Shoot B · Control Plane<br>API server · etcd · scheduler"]
end
subgraph ZH ["OpenStack · ch-zh1 · Zurich"]
W1["Worker Node"]
W2["Worker Node"]
end
subgraph GE ["OpenStack · ch-ge1 · Geneva"]
W3["Worker Node"]
W4["Worker Node"]
end
Portal -->|"Gardener API"| CP1
Portal -->|"Gardener API"| CP2
CP1 -->|"manages"| W1
CP1 -->|"manages"| W2
CP2 -->|"manages"| W3
CP2 -->|"manages"| W4
classDef portal fill:#1a3a5c,stroke:#64b5f6,color:#e3f2fd;
classDef cp fill:#1b3a2a,stroke:#66bb6a,color:#c8e6c9;
classDef worker fill:#3e2723,stroke:#ff9800,color:#ffe0b2;
class Portal portal;
class CP1,CP2 cp;
class W1,W2,W3,W4 worker;
linkStyle 0,1 stroke:#64b5f6,stroke-width:2px;
linkStyle 2,3,4,5 stroke:#66bb6a,stroke-width:2px;
Multi-Region Shoots
The platform operates in two Swiss regions:
| Region | Location | Identifier |
|---|---|---|
| Region 1 | Zurich | ch-zh1 |
| Region 2 | Geneva | ch-ge1 |
When you create a shoot, you choose which region the worker nodes run in. The control plane always runs on the Seed cluster, regardless of the worker region. You can create shoots in both regions — for example, a production cluster in Zurich and a disaster-recovery cluster in Geneva.
Note
Worker nodes in different regions are not on the same network. There is no stretched Layer 2 between Zurich and Geneva. Cross-region communication requires floating IPs, a VPN, or a dedicated interconnect. See Regions and Availability Zones.
API Endpoint
Each shoot cluster gets a unique API endpoint following this pattern:
https://api.<cluster-name>.<project>.gardener.ewcs.ch
This endpoint is publicly reachable and is what kubectl connects to. It is backed by the control plane running on the Seed.
Control Plane vs Data Plane
| Control Plane | Data Plane | |
|---|---|---|
| Runs on | Seed cluster (managed by us) | Worker nodes in OpenStack (your project) |
| Components | API server, etcd, scheduler, controller-manager, cloud-controller-manager | Your pods, kubelet, kube-proxy |
| Updates | We handle Kubernetes version upgrades | You manage your workloads |
| HA | Production shoots get HA control plane | Worker node HA depends on your replica count |
| Billing | Included in the managed service | Worker nodes consume your OpenStack quota |
Benefits
- No control plane management — we handle etcd backups, API server updates, and controller health.
- Multi-region — deploy shoots in Zurich, Geneva, or both.
- Automatic updates — upgrade Kubernetes versions with a click in the portal.
- HA for production — production-purpose shoots get a highly available control plane.
- OpenStack integration — worker nodes use OpenStack Cinder for persistent storage, Octavia for load balancers, and Neutron for networking.
- Resource efficiency — the seed-and-shoot model means control planes are lightweight and don't require dedicated master nodes per cluster.
Next step
Now that you understand the architecture, learn how to create and manage clusters or how LoadBalancer services integrate with Octavia.