Cloud Providers
KubeAid provisions Kubernetes clusters on cloud providers using API-managed hosts. The cloud APIs automatically create, configure, and manage your infrastructure lifecycle.
Common Prerequisites
All cloud providers require:
- Fork the KubeAid Config repository
- Git provider credentials (e.g., GitHub PAT with write access)
- Docker running locally
Install KubeAid CLI
KUBEAID_CLI_VERSION=$(curl -s "https://api.github.com/repos/Obmondo/kubeaid-cli/releases/latest" | jq -r .tag_name)
OS=$([ "$(uname -s)" = "Linux" ] && echo "linux" || echo "darwin")
CPU_ARCHITECTURE=$([ "$(uname -m)" = "x86_64" ] && echo "amd64" || echo "arm64")
wget "https://github.com/Obmondo/kubeaid-cli/releases/download/${KUBEAID_CLI_VERSION}/kubeaid-cli-${KUBEAID_CLI_VERSION}-${OS}-${CPU_ARCHITECTURE}"
sudo mv kubeaid-cli-${KUBEAID_CLI_VERSION}-${OS}-${CPU_ARCHITECTURE} /usr/local/bin/kubeaid-cli
sudo chmod +x /usr/local/bin/kubeaid-cli
AWS
Provisions a KubeAid-managed Kubernetes cluster in AWS with:
- Cilium CNI in kube-proxyless mode
- Kube2IAM for dynamic IAM credentials
- Autoscalable node-groups (scale to/from 0)
- GitOps with ArgoCD, Sealed Secrets, ClusterAPI
- Monitoring with KubePrometheus
- Disaster Recovery with Velero
AWS Prerequisites
- Create an AWS SSH KeyPair in your target region:
aws ec2 create-key-pair \
--key-name kubeaid-demo \
--query 'KeyMaterial' --output text --region <aws-region> > ./outputs/<cluster-name>.pem
AWS Setup
# Generate configuration
kubeaid-cli config generate aws
# Edit outputs/configs/general.yaml and secrets.yaml
# Bootstrap the cluster
kubeaid-cli cluster bootstrap
# Access the cluster
export KUBECONFIG=./outputs/kubeconfigs/main.yaml
kubectl cluster-info
AWS Cleanup
kubeaid-cli cluster delete main
kubeaid-cli cluster delete management
Azure
Provisions a KubeAid-managed Kubernetes cluster in Azure with:
- Cilium CNI in kube-proxyless mode
- Azure Workload Identity
- Autoscalable node-groups (scale to/from 0)
- GitOps with ArgoCD, Sealed Secrets, ClusterAPI, CrossPlane
- Monitoring with KubePrometheus
- Disaster Recovery with Velero
Azure Prerequisites
-
Linux or MacOS with at least 16GB RAM (8GB may cause OOM issues)
-
OpenSSH keypair for VM access:
ssh-keygen -t rsa -b 4096 -f azure-ssh-key -
RSA key pair in PEM format for Azure Workload Identity:
openssl genrsa -out jwt-signing-key.pem 2048openssl rsa -in jwt-signing-key.pem -pubout -out jwt-signing-pub.pem
Azure Setup
# Generate configuration
kubeaid-cli config generate azure
# Edit outputs/configs/general.yaml and secrets.yaml
# Bootstrap the cluster
kubeaid-cli cluster bootstrap
# Access the cluster
export KUBECONFIG=./outputs/kubeconfigs/main.yaml
kubectl cluster-info
Azure Upgrade
kubeaid-cli cluster upgrade --new-k8s-version v1.32.0
# Add --new-image-offer for OS upgrade
Azure Cleanup
kubeaid-cli cluster delete main
kubeaid-cli cluster delete management
Hetzner
Hetzner supports three deployment modes:
| Mode | Control Plane | Workers | Autoscaling |
|---|---|---|---|
| HCloud | HCloud VMs | HCloud VMs | ✅ Scale to/from 0 |
| Bare Metal | Bare Metal | Bare Metal | ❌ |
| Hybrid | HCloud VMs | HCloud + Bare Metal | ✅ (HCloud only) |
All modes include:
- Cilium CNI in kube-proxyless mode with VXLAN tunnel routing (pod traffic is encapsulated over the node network - no routes programmed in HCloud)
- CAPH v1.1.7 with default OS image Ubuntu 26.04
- GitOps with ArgoCD, Sealed Secrets, ClusterAPI
- Monitoring with KubePrometheus
HCloud Mode
HCloud Prerequisites
- Create an HCloud SSH KeyPair
No 2 HCloud SSH KeyPairs can have the same public key
HCloud Setup
kubeaid-cli config generate hetzner hcloud
# Edit outputs/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap
Bare Metal Mode
Bare Metal Prerequisites
-
Create SSH KeyPair at https://robot.hetzner.com/key/index
No 2 Hetzner Bare Metal SSH KeyPairs can have the same public key
-
If setting
cloud.hetzner.bareMetal.wipeDisks: True, remove pre-existing RAID:wipefs -fa <partition-name> # For each partition
Bare Metal Disk Layout
For each server:
- Level 1 SWRAID across specified disk WWNs
- 25G LVG named
vg0with 10G root volume
Configure further via diskLayoutSetupCommands. Recommendations:
- Allocate HDDs/SSDs to Ceph
- Allocate NVMes to a ZPool (mirror mode) for ContainerD, logs, and OpenEBS ZFS LocalPV
Provider IDs: Bare-metal nodes use the canonical
hrobot://<server-id>provider-ID format (enabled via thecapi.syself.com/use-hrobot-provider-id-for-baremetalannotation on the HetznerCluster). This aligns CAPH's Machine providerID with the upstream Hetzner CCM robot provider.
Bare Metal Setup
kubeaid-cli config generate hetzner bare-metal
# Edit outputs/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap
Hybrid Mode
Combines HCloud control plane with mixed HCloud + Bare Metal workers.
Hybrid Cloud Controller Manager (CCM) Architecture
Hybrid clusters run two CCM instances from the same upstream chart, because the Hetzner CCM cannot enable its route controller (networking) and Robot bare-metal support at the same time:
| CCM Instance | Purpose | Scope |
|---|---|---|
ccm-hcloud | Networking (HCLOUD_NETWORK), InternalIP assignment, LoadBalancers, routes | HCloud nodes only |
ccm-hetzner | Robot provider-ID (hrobot://), node lifecycle | Bare-metal nodes only (controllers: cloud-node, cloud-node-lifecycle) |
The HCloud CCM provides the InternalIP for the private-only control-plane nodes - without it, the
apiserver cannot reach the kubelet and control-plane scale-up stalls on etcd health checks. The robot
CCM is scoped to cloud-node + cloud-node-lifecycle only so it does not fight ccm-hcloud over
LoadBalancers.
Pure HCloud or pure Bare Metal clusters use a single CCM instance.
Floating IPs on Control-Plane Nodes
Control-plane nodes can bind HCloud Floating IPs via netplan for a stable public endpoint. The hcloud-fip-controller chart handles IP failover across nodes (leader-elected, ~15 s failover). The node-side IP binding (cloud-init/netplan) is the operator's responsibility.
Hybrid Prerequisites
- Both HCloud and Bare Metal SSH KeyPairs (see above)
- Same disk wipe requirements as Bare Metal mode
Hybrid Setup
kubeaid-cli config generate hetzner hybrid
# Edit outputs/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap
Hetzner Cleanup
All modes:
kubeaid-cli cluster delete main
kubeaid-cli cluster delete management
Common Operations
Access Cluster
export KUBECONFIG=./outputs/kubeconfigs/main.yaml
kubectl cluster-info
Logs are saved in outputs/.log. Access the ArgoCD and Grafana dashboards for monitoring.
See Also
- Bare Metal (On-Prem) - SSH-based multi-node without cloud APIs
- Single Host K8s - Local K3D for development
- Hybrid Setup - Cilium Cluster Mesh for multi-cloud connectivity