Cloud Providers

Teabar provisions infrastructure across multiple cloud providers. Each provider offers different tradeoffs in terms of pricing, performance, compliance, and geographic availability.

Supported Providers

Provider Comparison

Pricing

Provider2 vCPU / 4GB VM4 vCPU / 16GB VMManaged K8s
Hetzner~$0.01/hr~$0.03/hrN/A (self-managed)
AWS~$0.05/hr~$0.17/hr$0.10/hr + nodes
Azure~$0.05/hr~$0.17/hrFree + nodes

Locations

ProviderRegions
HetznerGermany (Falkenstein, Nuremberg), Finland (Helsinki), US (Ashburn, Hillsboro)
AWS30+ regions worldwide
Azure60+ regions worldwide

Provisioning Speed

ProviderSingle VM3-node ClusterFull Environment
Hetzner~90 sec~4 min~8 min
AWS~2-3 min~8 min~15 min
Azure~2-3 min~8 min~15 min

Kubernetes Options

ProviderDistributionsManaged Service
HetznerTalos, K3s, KubeadmNo
AWSTalos, K3s, EKSEKS
AzureTalos, K3s, AKSAKS

Compliance & Certifications

ProviderCertifications
HetznerISO 27001, SOC 1
AWSSOC 1/2/3, ISO 27001, HIPAA, PCI DSS, FedRAMP
AzureSOC 1/2/3, ISO 27001, HIPAA, PCI DSS, FedRAMP

Choosing a Provider

Use Hetzner When

  • Cost is a priority - Best price-performance for compute
  • EU data residency - German and Finnish locations
  • Training environments - Maximize participants per dollar
  • Self-managed Kubernetes - Talos or K3s clusters

Use AWS When

  • Compliance requirements - HIPAA, PCI DSS, FedRAMP
  • Global presence needed - 30+ regions worldwide
  • AWS service integration - Using RDS, S3, Lambda, etc.
  • Managed Kubernetes - EKS with AWS integrations

Use Azure When

  • Microsoft ecosystem - Active Directory, Office 365 integration
  • Azure service integration - Using Azure SQL, Blob Storage, etc.
  • Enterprise agreements - Existing Azure commitments
  • Managed Kubernetes - AKS with Azure integrations

Provider Configuration

Organization-Level Setup

Configure provider credentials for your organization:

# Hetzner Cloud
teactl org provider set hetzner 
  --token <HCLOUD_TOKEN>

# AWS
teactl org provider set aws 
  --access-key <AWS_ACCESS_KEY_ID> 
  --secret-key <AWS_SECRET_ACCESS_KEY> 
  --region us-east-1

# Azure
teactl org provider set azure 
  --subscription <AZURE_SUBSCRIPTION_ID> 
  --tenant <AZURE_TENANT_ID> 
  --client-id <AZURE_CLIENT_ID> 
  --client-secret <AZURE_CLIENT_SECRET>

Default Provider

Set a default provider for new environments:

teactl org provider default hetzner

Multiple Providers

You can configure multiple providers and select per-environment:

# blueprint.yaml
spec:
  infrastructure:
    provider: aws  # Override default provider
    region: us-west-2

Multi-Region Environments

Teabar supports environments that span multiple regions within a single provider. This enables:

  • Geo-distributed deployments - Resources close to participants worldwide
  • Disaster recovery - Cross-region redundancy
  • Compliance - Data residency in specific regions

Multi-Region Configuration

spec:
  infrastructure:
    provider: hetzner
    
    # Primary region
    primaryRegion: fsn1
    
    # Additional regions
    regions:
      - location: nbg1
        role: secondary
      - location: hel1
        role: participant-resources
    
    # Cross-region networking
    networking:
      type: wireguard        # wireguard | vpc-peering
      meshEnabled: true      # Full mesh between regions

Regional Resource Placement

Place specific resources in specific regions:

resources:
  clusters:
    - name: control-plane
      region: fsn1           # Primary region
      
    - name: eu-workers
      region: nbg1           # Germany
      
    - name: us-workers
      region: ash            # US East (Ashburn)

  vms:
    - name: participant-{{ .Index }}
      # Auto-place near participants based on their location
      region: auto

Cross-Region Networking

Same Hetzner LocationDifferent Locations
Native private networkWireGuard mesh VPN
Low latency (<1ms)Higher latency (10-100ms)
No additional costMinimal overhead

Multi-Region DNS

Teabar automatically configures GeoDNS for multi-region environments:

gitlab.workshop.teabar.dev
├── EU users → fsn1 cluster
├── US users → ash cluster
└── Asia users → nearest available

Blueprint Provider Selection

Specify the provider in your blueprint:

apiVersion: teabar.dev/v1
kind: Blueprint
metadata:
  name: my-workshop
spec:
  infrastructure:
    provider: hetzner
    location: fsn1

  resources:
    - name: participant-vm
      type: vm
      spec:
        size: cx21
        image: ubuntu-22.04

Or allow the environment creator to choose:

spec:
  parameters:
    - name: provider
      type: string
      default: hetzner
      enum: [hetzner, aws, azure]
      description: Cloud provider

  infrastructure:
    provider: "{{ .Parameters.provider }}"

Resource Mapping

Teabar maps abstract resource definitions to provider-specific resources:

VM Sizes

Teabar SizeHetznerAWSAzure
smallcx11 (1 vCPU, 2GB)t3.microB1s
mediumcx21 (2 vCPU, 4GB)t3.smallB2s
largecx31 (2 vCPU, 8GB)t3.mediumB2ms
xlargecx41 (4 vCPU, 16GB)t3.largeB4ms

Or specify provider-native sizes directly:

resources:
  - name: participant-vm
    type: vm
    spec:
      size: cx21  # Hetzner-specific
      # or
      size: t3.medium  # AWS-specific

Images

Teabar ImageHetznerAWSAzure
ubuntu-22.04ubuntu-22.04ami-xxxCanonical:…
debian-12debian-12ami-xxxDebian:…
talosCustom snapshotCustom AMICustom image

Terraform Backend

Teabar stores Terraform state in PostgreSQL, isolated per environment:

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   Environment   │     │   Terraform     │     │   PostgreSQL    │
│   Blueprint     │────►│   Generator     │────►│   State Store   │
└─────────────────┘     └─────────────────┘     └─────────────────┘


                        ┌─────────────────┐
                        │ Cloud Provider  │
                        │      API        │
                        └─────────────────┘

This ensures:

  • State isolation - Each environment’s state is separate
  • Locking - Prevents concurrent modifications
  • Auditability - Full history of infrastructure changes

Next Steps

ende