Skip to main content

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:

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:

AWS Prerequisites

aws ec2 create-key-pair \
--key-name kubeaid-demo \
--query 'KeyMaterial' --output text --region <aws-region> > ./<cluster-name>.pem

AWS Setup

# Generate configuration (interactive prompt; select aws when asked for a provider)
kubeaid-cli config generate

# Edit ~/.config/kubeaid-cli/<cluster>/configs/general.yaml and secrets.yaml

# Bootstrap the cluster
kubeaid-cli cluster bootstrap --cluster-name <cluster>

# Access the cluster
export KUBECONFIG=~/.config/kubeaid-cli/<cluster>/kubeconfigs/main.yaml
kubectl cluster-info

AWS EKS (managed control plane)

Set cloud.aws.eks: true to get an AWS-managed (EKS) control plane instead of the self-managed CAPA one. cluster bootstrap and cluster delete work as above; cluster upgrade refuses on EKS clusters - bump global.kubernetes.version in the kubeaid-config repo's values-capi-cluster.yaml instead and let ArgoCD/CAPA roll the control plane and node-groups. cluster recover isn't supported yet for EKS. See Pre-Configuration for the full field list.

AWS Cleanup

kubeaid-cli cluster delete main --cluster-name <cluster>
kubeaid-cli cluster delete management --cluster-name <cluster>

Azure

Provisions a KubeAid-managed Kubernetes cluster in Azure with:

Azure Prerequisites

  • Linux or MacOS with at least 16GB RAM (8GB may cause OOM issues)

  • Register a Service Principal in Microsoft Entra ID

  • 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 2048
    openssl rsa -in jwt-signing-key.pem -pubout -out jwt-signing-pub.pem

Azure Setup

# Generate configuration (interactive prompt; select azure when asked for a provider)
kubeaid-cli config generate

# Edit ~/.config/kubeaid-cli/<cluster>/configs/general.yaml and secrets.yaml

# Bootstrap the cluster
kubeaid-cli cluster bootstrap --cluster-name <cluster>

# Access the cluster
export KUBECONFIG=~/.config/kubeaid-cli/<cluster>/kubeconfigs/main.yaml
kubectl cluster-info

Azure AKS (managed control plane)

Set cloud.azure.aks: true to get an Azure-managed (AKS) control plane instead of the self-managed CAPZ one. cluster bootstrap and cluster delete work as above; cluster upgrade refuses on AKS clusters - bump global.kubernetes.version in the kubeaid-config repo's values-capi-cluster.yaml instead and let ArgoCD/CAPZ roll the control plane and agent pools. cluster recover isn't supported yet for AKS. See Pre-Configuration for the full field list.

Azure Upgrade

There are no --new-k8s-version / --new-image-offer flags. Edit cluster.k8sVersion (and the machine image fields) in general.yaml, then run:

kubeaid-cli cluster upgrade --cluster-name <cluster>
# --skip-pr-workflow pushes changes directly instead of opening a PR

Azure Cleanup

kubeaid-cli cluster delete main --cluster-name <cluster>
kubeaid-cli cluster delete management --cluster-name <cluster>

Hetzner

Hetzner supports three deployment modes:

ModeControl PlaneWorkersAutoscaling
HCloudHCloud VMsHCloud VMs✅ Scale to/from 0
Bare MetalBare MetalBare Metal
HybridHCloud VMsHCloud + Bare Metal✅ (HCloud only)

All modes include:

HCloud Mode

HCloud Prerequisites

HCloud Setup

# Interactive prompt; select hetzner, then hcloud, when asked
kubeaid-cli config generate
# Edit ~/.config/kubeaid-cli/<cluster>/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap --cluster-name <cluster>

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 vg0 with 10G root volume

Configure further via installImage.vg0.{size,rootVolumeSize} and wipeDisks. 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 the capi.syself.com/use-hrobot-provider-id-for-baremetal annotation on the HetznerCluster). This aligns CAPH's Machine providerID with the upstream Hetzner CCM robot provider.

Bare Metal Setup

# Interactive prompt; select hetzner, then bare-metal, when asked
kubeaid-cli config generate
# Edit ~/.config/kubeaid-cli/<cluster>/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap --cluster-name <cluster>

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 InstancePurposeScope
ccm-hcloudNetworking (HCLOUD_NETWORK), InternalIP assignment, LoadBalancers, routesHCloud nodes only
ccm-hetznerRobot provider-ID (hrobot://), node lifecycleBare-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

# Interactive prompt; select hetzner, then hybrid, when asked
kubeaid-cli config generate
# Edit ~/.config/kubeaid-cli/<cluster>/configs/general.yaml and secrets.yaml
kubeaid-cli cluster bootstrap --cluster-name <cluster>

Hetzner Cleanup

All modes:

kubeaid-cli cluster delete main --cluster-name <cluster>
kubeaid-cli cluster delete management --cluster-name <cluster>

Common Operations

Access Cluster

export KUBECONFIG=~/.config/kubeaid-cli/<cluster>/kubeconfigs/main.yaml
kubectl cluster-info

Logs are saved in ~/.config/kubeaid-cli/<cluster>/logs. Access the ArgoCD and Grafana dashboards for monitoring.

See Also