Provider example
Azure — NodePool, NodeClass & Workload
Full manifests and kubectl commands for Microsoft Azure.
Replace placeholders
<HOST_TAILSCALE_IP>→ Kind control-plane Tailscale IP- Azure fields → subscription, resource group, subnet, service principal credentials
Ensure secret exists: tailscale-auth, azure-credentials.
1. Create secrets
# Tailscale auth key (required by NodeClass)
kubectl create secret generic tailscale-auth --from-literal=authkey="<YOUR_TAILSCALE_AUTHKEY>" -n default
# Azure credentials (Service Principal: tenant ID, client ID, client secret)
kubectl create secret generic azure-credentials \
--from-literal=AZURE_TENANT_ID="<YOUR_TENANT_ID>" \
--from-literal=AZURE_CLIENT_ID="<YOUR_CLIENT_ID>" \
--from-literal=AZURE_CLIENT_SECRET="<YOUR_CLIENT_SECRET>" \
-n default
2. NodePool
apiVersion: cloudburst.io/v1alpha1
kind: NodePool
metadata:
name: azure-nodepool
namespace: default
spec:
requirements:
regionConstraint: "ANY"
arch: ["x86_64"]
maxPriceEurPerHour: 0.15
allowedProviders: ["azure"]
limits:
maxNodes: 3
minNodes: 0
template:
labels:
cloudburst.io/nodepool: "azure-nodepool"
cloudburst.io/provider: "azure"
disruption:
ttlSecondsAfterEmpty: 60
ttlSecondsUntilExpired: 3600
weight: 1
3. NodeClass
apiVersion: cloudburst.io/v1alpha1
kind: NodeClass
metadata:
name: azure-nodeclass
namespace: default
spec:
azure:
subscriptionID: "your-subscription-id"
resourceGroup: "your-resource-group"
location: "westeurope"
subnetID: "/subscriptions/.../resourceGroups/.../providers/Microsoft.Network/virtualNetworks/.../subnets/default"
tenantIDSecretRef:
name: azure-credentials
key: AZURE_TENANT_ID
clientIDSecretRef:
name: azure-credentials
key: AZURE_CLIENT_ID
clientSecretSecretRef:
name: azure-credentials
key: AZURE_CLIENT_SECRET
join:
hostApiServer: "https://<HOST_TAILSCALE_IP>:6443"
kindClusterName: "cloudburst"
tokenTtlMinutes: 60
tailscale:
authKeySecretRef:
name: tailscale-auth
key: authkey
bootstrap:
kubernetesVersion: "1.34.3"
4. Workload (triggers burst; targets Azure nodes)
apiVersion: v1
kind: Pod
metadata:
name: azure-workload
namespace: default
spec:
containers:
- name: workload
image: busybox:1.36
command: ["sleep", "infinity"]
resources:
requests:
cpu: "1500m"
memory: "2Gi"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: cloudburst.io/provider
operator: In
values: ["azure"]
5. Apply and verify
# Save the manifests above to azure-example.yaml, then:
kubectl apply -f azure-example.yaml
# Watch NodeClaim creation
kubectl get nodeclaims -w
# Once node is Ready, verify pod
kubectl get pods -o wide
kubectl get nodes -l cloudburst.io/provider=azure