This directory contains YAML templates for creating clusters using the Harvester Cluster API provider. Each template can be used to generate cluster manifests using clusterctl generate yaml that can be applied to a CAPI management cluster.
Creates a cluster using kubeadm bootstrap provider.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-kubeadm.yaml \
CLUSTER_NAME=my-cluster \
KUBERNETES_VERSION=v1.32.1 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=ubuntu-20.04 \
SSH_KEYPAIR=default/my-keypair \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlCreates a cluster using RKE2 bootstrap provider.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-rke2.yaml \
CLUSTER_NAME=my-rke2-cluster \
KUBERNETES_VERSION=v1.32.1+rke2r1 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=ubuntu-20.04 \
SSH_KEYPAIR=default/my-keypair \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlCreates an RKE2 cluster with DHCP-based load balancer configuration.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-rke2-dhcp.yaml \
CLUSTER_NAME=my-rke2-dhcp-cluster \
KUBERNETES_VERSION=v1.32.1+rke2r1 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=ubuntu-20.04 \
SSH_KEYPAIR=default/my-keypair \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlCreates an RKE2 cluster with cloud provider interface generation.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-rke2-generateCPI.yaml \
CLUSTER_NAME=my-rke2-cpi-cluster \
KUBERNETES_VERSION=v1.32.1+rke2r1 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=ubuntu-20.04 \
SSH_KEYPAIR=default/my-keypair \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlCreates a cluster using Talos Linux with Cilium CNI and Harvester cloud provider.
Usage:
# For DHCP mode:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-talos.yaml \
CLUSTER_NAME=my-talos-cluster \
KUBERNETES_VERSION=v1.32.1 \
TALOS_VERSION=v1.5.0 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=talos-v1.5.0 \
SSH_KEYPAIR=default/my-keypair \
IPAM_TYPE=dhcp \
IP_POOL_CONFIG="" \
> cluster-manifest.yaml
# For IP pool mode:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/cluster-template-talos.yaml \
CLUSTER_NAME=my-talos-cluster \
KUBERNETES_VERSION=v1.32.1 \
TALOS_VERSION=v1.5.0 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=talos-v1.5.0 \
SSH_KEYPAIR=default/my-keypair \
IPAM_TYPE=pool \
IP_POOL_NAME=my-ip-pool \
IP_POOL_CONFIG="
ipPoolRef: \${IP_POOL_NAME}
ipPool:
subnet: 192.168.1.0/24
gateway: 192.168.1.1
vmNetwork: default/vm-network
rangeStart: 192.168.1.100
rangeEnd: 192.168.1.200" \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlDefines a ClusterClass for RKE2 clusters that can be reused.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/clusterclass/rke2/clusterclass-harvester-rke2-example.yaml \
CLUSTER_CLASS_NAME=harvester-rke2 \
> clusterclass.yaml
kubectl apply -f clusterclass.yamlCreates a cluster using the RKE2 ClusterClass with CPI generation.
Usage:
clusterctl generate yaml \
--from https://github.com/rancher-sandbox/cluster-api-provider-harvester/blob/main/templates/clusterclass/rke2/cluster-template-rke2-clusterclass-generateCPI.yaml \
CLUSTER_NAME=my-clusterclass-cluster \
CLUSTER_CLASS_NAME=harvester-rke2 \
KUBERNETES_VERSION=v1.32.1+rke2r1 \
HARVESTER_ENDPOINT=https://harvester.example.com \
HARVESTER_KUBECONFIG_B64=$(base64 -w 0 -i /path/to/harvester-kubeconfig.yaml) \
TARGET_HARVESTER_NAMESPACE=default \
VM_NETWORK=default/vm-network \
VM_IMAGE_NAME=ubuntu-20.04 \
SSH_KEYPAIR=default/my-keypair \
> cluster-manifest.yaml
kubectl apply -f cluster-manifest.yamlCLUSTER_NAME: Name of the clusterKUBERNETES_VERSION: Kubernetes version to useHARVESTER_ENDPOINT: Harvester cluster endpoint URLHARVESTER_KUBECONFIG_B64: Base64-encoded kubeconfig for Harvester clusterTARGET_HARVESTER_NAMESPACE: Namespace in Harvester where VMs will be createdVM_NETWORK: Network configuration for VMs (format: namespace/network-name)VM_IMAGE_NAME: VM image to use for cluster nodesSSH_KEYPAIR: SSH key pair for VM access (format: namespace/keypair-name)CONTROL_PLANE_MACHINE_COUNT: Number of control plane nodes (default: 3)WORKER_MACHINE_COUNT: Number of worker nodes (default: 2)IPAM_TYPE: IP address management type (dhcp or pool)IP_POOL_CONFIG: IP pool configuration (for non-DHCP mode)
Before using these templates, ensure you have:
- A running CAPI management cluster
- Harvester Cluster API provider installed on the management cluster
- Appropriate bootstrap providers (kubeadm, RKE2, or Talos)
- A Harvester cluster with necessary resources (images, networks, SSH keys)
- Valid kubeconfig for the Harvester cluster
clusterctlCLI tool installed
After generating the manifest using clusterctl generate yaml, apply it to your CAPI management cluster:
kubectl apply -f cluster-manifest.yamlMonitor the cluster creation:
kubectl get clusters
kubectl get harvesterclusters
kubectl get machines