Workflow Examples

Web Hosting Infrastructure

Build infrastructure with database and web servers.

Start Server

export KUBEBUDDY_ADMIN_API_KEY=secure-key
kubebuddy server --db ~/kubebuddy.db --create-admin-key

Create Components

# CPU
CPU_ID=$(kubebuddy component create \
  --name "Intel Xeon E5-2680v4" \
  --type cpu \
  --manufacturer Intel \
  --model "E5-2680v4" \
  --specs '{"threads":28}' | jq -r .id)

# RAM
RAM_ID=$(kubebuddy component create \
  --name "32GB DDR4" \
  --type ram \
  --manufacturer Samsung \
  --model "M393A4K40CB2" \
  --specs '{"capacity_gb":32}' | jq -r .id)

# Storage
NVME_ID=$(kubebuddy component create \
  --name "960GB NVMe" \
  --type storage \
  --manufacturer Samsung \
  --model "PM983" \
  --specs '{"capacity_gb":960}' | jq -r .id)

Create Database Server

# Create compute with tags (use separate tags for multiple roles)
DB_SERVER=$(kubebuddy compute create \
  --name "db-prod-01" \
  --type baremetal \
  --provider ovh \
  --region us-east \
  --tags "env=prod,role-database=true,role-logs=true" \
  --monthly-cost 299.99 \
  --contract-end 2026-06-30 | jq -r .id)

# Assign hardware
kubebuddy component assign --compute $DB_SERVER --component $CPU_ID --quantity 2
kubebuddy component assign --compute $DB_SERVER --component $RAM_ID --quantity 8
kubebuddy component assign --compute $DB_SERVER --component $NVME_ID --quantity 2 \
  --raid raid1 --raid-group db-storage

Create Web Server

# Create compute with tags
WEB_SERVER=$(kubebuddy compute create \
  --name "web-prod-01" \
  --type baremetal \
  --provider ovh \
  --region us-east \
  --tags "env=prod,role-web=true" | jq -r .id)

# Assign hardware
kubebuddy component assign --compute $WEB_SERVER --component $CPU_ID --quantity 1
kubebuddy component assign --compute $WEB_SERVER --component $RAM_ID --quantity 4
kubebuddy component assign --compute $WEB_SERVER --component $NVME_ID --quantity 1

Define Services

# Database service with affinity for database role (using MatchExpressions)
kubebuddy service create \
  --name "postgres-db" \
  --min-spec '{"cores":4,"memory":8192,"nvme":100}' \
  --max-spec '{"cores":8,"memory":16384,"nvme":200}' \
  --placement '{"affinity":[{"matchExpressions":[{"key":"role-database","operator":"Exists"}]}]}'

# Web service with affinity for web role
kubebuddy service create \
  --name "nginx-web" \
  --min-spec '{"cores":2,"memory":2048,"nvme":50}' \
  --max-spec '{"cores":4,"memory":4096,"nvme":100}' \
  --placement '{"affinity":[{"matchExpressions":[{"key":"role-web","operator":"Exists"}]}]}'

# Log aggregator service with affinity for logs role
kubebuddy service create \
  --name "loki-logs" \
  --min-spec '{"cores":2,"memory":4096,"nvme":50}' \
  --max-spec '{"cores":4,"memory":8192,"nvme":100}' \
  --placement '{"affinity":[{"matchExpressions":[{"key":"role-logs","operator":"Exists"}]}]}'

Plan and Assign

# Plan and assign automatically
kubebuddy plan postgres-db --assign
kubebuddy plan nginx-web --assign

Add Journal Entries

kubebuddy journal add \
  --compute $DB_SERVER \
  --category deployment \
  --content "Deployed PostgreSQL 15.2 with RAID1 storage"

Generate Reports

# All computes with journal details
kubebuddy report compute --journal

# Specific compute
kubebuddy report compute $DB_SERVER --journal

Planning Workflow

Find Candidates

kubebuddy plan postgres-db

Output:

Service: postgres-db

✓ Feasible on 1 compute(s)

Candidates:
1. db-prod-01 (score: 95.5)
   - Type: baremetal
   - Provider: ovh
   - Region: us-east
   - Utilization: 65%
   - Available: cores=48, memory=245760, nvme=860

Plan for Specific Compute

kubebuddy plan postgres-db --compute $DB_SERVER

Auto-Assign to Best Candidate

kubebuddy plan postgres-db --assign

Force Assignment

kubebuddy plan postgres-db --compute $DB_SERVER --assign --force

Component Management

Create and Assign GPU

# Create GPU component
GPU_ID=$(kubebuddy component create \
  --name "NVIDIA RTX 4090" \
  --type gpu \
  --manufacturer NVIDIA \
  --model "RTX 4090" \
  --specs '{"vram_gb":24,"cuda_cores":16384}' | jq -r .id)

# Assign to compute
kubebuddy component assign \
  --compute $ML_SERVER \
  --component $GPU_ID \
  --quantity 4 \
  --slot "PCIE1,PCIE2,PCIE3,PCIE4"

Storage with RAID5

# Create storage component
SSD_ID=$(kubebuddy component create \
  --name "Samsung 2TB SSD" \
  --type storage \
  --manufacturer Samsung \
  --model "870 EVO" \
  --specs '{"capacity_gb":2000}' | jq -r .id)

# Assign 4 drives in RAID5
kubebuddy component assign \
  --compute $SERVER \
  --component $SSD_ID \
  --quantity 4 \
  --raid raid5 \
  --raid-group storage-array-1

# Effective capacity: (4-1) * 2000 = 6000 GB

Service with Placement Rules

Affinity with MatchLabels (Must Match Exact Values)

kubebuddy service create \
  --name "prod-api" \
  --min-spec '{"cores":2,"memory":4096}' \
  --max-spec '{"cores":4,"memory":8192}' \
  --placement '{"affinity":[{"matchLabels":{"env":"prod"}}]}'

Affinity with MatchExpressions (Operator-Based Matching)

# Match computes that have role-database tag (any value)
kubebuddy service create \
  --name "database-service" \
  --min-spec '{"cores":4,"memory":8192}' \
  --max-spec '{"cores":8,"memory":16384}' \
  --placement '{"affinity":[{"matchExpressions":[{"key":"role-database","operator":"Exists"}]}]}'

# Match computes in specific regions using In operator
kubebuddy service create \
  --name "regional-service" \
  --min-spec '{"cores":2,"memory":4096}' \
  --max-spec '{"cores":4,"memory":8192}' \
  --placement '{"affinity":[{"matchExpressions":[{"key":"region","operator":"In","values":["us-east","us-west"]}]}]}'

Anti-Affinity (Must NOT Match)

kubebuddy service create \
  --name "critical-service" \
  --min-spec '{"cores":2,"memory":4096}' \
  --max-spec '{"cores":4,"memory":8192}' \
  --placement '{"antiAffinity":[{"matchLabels":{"env":"dev"}}]}'

Spread Constraint

kubebuddy service create \
  --name "redis-cache" \
  --min-spec '{"cores":2,"memory":8192}' \
  --max-spec '{"cores":4,"memory":16384}' \
  --placement '{"spreadMax":1}'

Only one instance per compute for high availability.