Cluster Management

Create, inspect, and manage Kubernetes clusters on OpenStack (CAPO) and AWS (EKS) from the Frontier CLI.

Overview

The Frontier CLI supports creating Kubernetes clusters on two providers:

Provider Distribution CAPI Provider Command
OpenStack (VitroAI) RKE2 CAPO (Cluster API Provider OpenStack) frontier create cluster capo
AWS EKS CAPA (Cluster API Provider AWS) frontier create cluster eks

All cluster operations flow through the GitOps pipeline: CLI → Trailboss API → Gitea (manifests) → ArgoCD → CAPI on FMC → infrastructure provisioning.

Create an OpenStack Cluster (CAPO)

frontier create cluster capo \
  --name my-cluster \
  --workers 3 \
  --control-planes 1 \
  --flavor-cp m8.20 \
  --flavor-worker m2.4 \
  --image rke2-node-v1.28-20260324

CAPO Flags

Flag Default Description
--name (required) Cluster name
--namespace cluster-{name} Kubernetes namespace (auto-derived)
--k8s-version v1.32.2+rke2r1 RKE2 Kubernetes version
--control-planes 1 Control plane node count (must be odd)
--workers 3 Worker node count
--flavor-cp m8.20 OpenStack flavor for control plane VMs
--flavor-worker m2.4 OpenStack flavor for worker VMs
--image rke2-node-v1.28-20260324 Pre-baked Packer VM image in Glance
--network (auto-created) OpenStack network name
--ssh-key (none) SSH keypair name
--external-net 45799c9a-... External network ID for floating IPs
--fips false Enable FIPS 140-2 mode

How It Works

  1. CLI sends cluster spec to POST /api/v1/cluster-templates/2/render (template 2 = capo-rke2-default)
  2. Trailboss renders CAPI manifests from the template + user values
  3. Rendered manifests are pushed to Gitea (admin/federal-frontier-platform)
  4. ArgoCD syncs the manifests to the FMC
  5. CAPO provisions VMs in OpenStack, installs RKE2, bootstraps the cluster
$ frontier create cluster capo --name edge-01 --workers 2 --fips
Cluster creation initiated!
  Name:     edge-01
  Provider: OpenStack (CAPO)
  K8s:      v1.32.2+rke2r1
  CP:       1 x m8.20
  Workers:  2 x m2.4
  Image:    rke2-node-v1.28-20260324
  FIPS:     Enabled

Manifests pushed to Gitea. ArgoCD will sync to FMC.
Track progress: frontier get cluster edge-01

Create an EKS Cluster (AWS)

frontier create cluster eks \
  --name satellite-prod \
  --region us-east-1 \
  --workers 3 \
  --instance-type m5.xlarge

EKS Flags

Flag Default Description
--name (required) Cluster name
--namespace (auto-derived) Kubernetes namespace
--k8s-version v1.28.0 EKS Kubernetes version
--region (required) AWS region
--workers 3 Worker node count
--instance-type m5.xlarge EC2 instance type for workers
--vpc-id (creates new) Existing VPC ID
--subnet-ids (auto-selected) Comma-separated subnet IDs

Get Cluster Information

List All Clusters

frontier get cluster all

Returns: name, namespace, provider, machine count, Kubernetes version, UUID, status.

Get a Specific Cluster

frontier get cluster my-cluster

Get Cluster Status

frontier get status my-cluster --project-name my-project

Get Kubeconfig

# Print to stdout
frontier get kubeconfig my-cluster --project-name my-project

# Save to file
frontier get kubeconfig my-cluster --project-name my-project --file-name kubeconfig.yaml

Get Machines

# All machines
frontier get machine all

# Specific machine
frontier get machine my-machine-0

Returns: name, cluster, namespace, role, CPU, memory, OS, IP, MAC address, status.

Get Cluster Add-ons

frontier get addons satellite-test2

Returns: installed add-ons with name, namespace, Helm chart, and description.

Get Cluster Costs

frontier get costs my-cluster

Returns: cumulative cost breakdown (CPU, memory, GPU, network, disk).

Delete a Cluster

frontier delete cluster my-cluster --project-name my-project

Batch Cluster Creation

Create multiple clusters in parallel from a YAML manifest:

frontier batch --file clusters.yaml --concurrency 5

Example clusters.yaml

project: fedstryke
awsRegion: us-east-1
defaults:
  kubeVersion: "1.32"
  replicas: 2
  cpu: 2
  memory: 4096
  capacityType: spot
  amiType: AL2_x86_64
  cni: vpccni
  csi: gp2
  vpcId: vpc-xxxxxx
  privateSubnetIds:
    - subnet-aaaa
    - subnet-bbbb
clusters:
  - name: cluster-001
  - name: cluster-002
  - name: cluster-003
Flag Default Description
--file clusters.yaml Path to manifest
--concurrency 5 Parallel creation limit
--log-dir logs/ Per-cluster log directory

Each cluster inherits defaults and can override any value individually. Tokens are silently refreshed during long-running batch operations.