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.

Flow: NodePool, NodeClass, Workload → Pod Pending → CloudBroker → Provision VM → Node Ready → Pod Scheduled
Azure provisioning flow: apply manifests → pod pending → CloudBroker recommends → controller provisions VM → node joins → pod schedules.

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

↑ Back to examples