Skip to content

cloudscale-ch/cluster-api-provider-cloudscale

Repository files navigation

Cluster API Provider for cloudscale.ch

Tests Release

Kubernetes Cluster API infrastructure provider for cloudscale.ch.

Features

  • CloudscaleCluster: Network, Subnet, Load Balancer management
  • CloudscaleMachine: Server provisioning with cloud-init
  • CloudscaleMachineTemplate: Immutable machine templates for KubeadmControlPlane/MachineDeployment

Prerequisites

Quickstart

Initialize the management cluster

export CLOUDSCALE_API_TOKEN=<your-api-token>

clusterctl init --infrastructure cloudscale

Generate and apply a workload cluster

Set the required environment variables, then generate and apply the cluster manifest:

clusterctl generate cluster my-cluster \
  --kubernetes-version v1.32.0 \
  --control-plane-machine-count 1 \
  --worker-machine-count 2 \
  | kubectl apply -f -

Watch the cluster come up:

clusterctl describe cluster my-cluster

Environment Variables

Variable Description Example
CLOUDSCALE_API_TOKEN cloudscale.ch API token abc123...
CLOUDSCALE_SSH_PUBLIC_KEY SSH public key added to nodes ssh-ed25519 AAAA...
CLOUDSCALE_REGION cloudscale.ch region lpg or rma
CLOUDSCALE_MACHINE_IMAGE Server image for nodes custom:ubuntu-2404-kube-v1.xx.x
CLOUDSCALE_CONTROL_PLANE_MACHINE_FLAVOR Flavor for control plane nodes flex-4-2
CLOUDSCALE_WORKER_MACHINE_FLAVOR Flavor for worker nodes flex-4-2
CLOUDSCALE_ROOT_VOLUME_SIZE Root volume size in GB 50

Development

This is a kubebuilder-scaffolded project. For new APIs, Webhooks, etc. kubebuilder commands should be used.

# Run tests
make test

# Generate manifests
make manifests

# Generate code
make generate

# Run E2E tests (requires CLOUDSCALE_API_TOKEN)
make test-e2e

E2E Tests

E2E tests are built on the CAPI e2e test framework (Ginkgo-based) and provision real clusters on cloudscale.ch. Tests use Ginkgo labels for filtering and are split into suites of increasing cost, scheduled accordingly:

Suite Label Description ~Duration Schedule Make target
Lifecycle lifecycle 1 CP + 1 worker: create, validate cloudscale resources, delete < 5 min Nightly test-e2e-lifecycle
HA lifecycle ha 3 CP + 2 workers with anti-affinity server groups < 10 min Weekly test-e2e-ha
Cluster upgrade upgrade Rolling K8s version upgrade (v1.34 → v1.35) < 10 min Weekly test-e2e-upgrade
Self-hosted self-hosted clusterctl move (pivot) to workload cluster. Requires container image in public registry < 15 min Weekly test-e2e-self-hosted
MD remediation md-remediation MachineHealthCheck auto-replacement of unhealthy workers < 10 min Weekly test-e2e-md-remediation
Conformance (fast) conformance K8s conformance, skip Serial tests < 60 min Weekly test-e2e-conformance-fast
Conformance (full) conformance Full K8s conformance including Serial tests < 120 min Biweekly test-e2e-conformance

Durations are approximate from a real CI run; conformance varies with cluster size.

Why this split? The single-CP lifecycle test is the cheapest smoke test and runs nightly to catch regressions early. HA, upgrade, self-hosted, and remediation tests are more resource-intensive and run weekly. Full K8s conformance is the most expensive and runs biweekly (1st + 15th of month). All suites can be triggered manually via the test-e2e.yml workflow dispatch. E2E tests share a concurrency group so only one suite runs at a time.

Any run involving the self-hosted spec requires the container image to be published to our registry. The self-hosted spec moves the management cluster to the first workload cluster. That workload cluster doesn't have access to the locally built images and therefore needs a published container image.

For PRs, no e2e test is automatically run. It is advised to run them locally before submitting, as well as for a reviewer to run them locally and/or manually triggering the workflow after reviewing the code is safe.

Tilt

The easiest way to work on this provider is by using the Tilt setup of Cluster-API.

Refer to the linked documentation on how to set up your local tilt. This requires cloning Cluster-API core to your host. The necessary commands need to be executed in the Cluster-API core repository (not in this repository).

An example tilt-settings.yaml, which should also be placed in the Cluster-API core repository, is provided here:

default_registry: "" # change if you use a remote image registry
provider_repos:
  # This refers to your provider directory and loads settings
  # from `tilt-provider.yaml`
  - path/to/local/clone/cluster-api-provider-cloudscale
enable_providers:
  - cloudscale
  - kubeadm-bootstrap
  - kubeadm-control-plane
deploy_cert_manager: true
kustomize_substitutions:
  CLOUDSCALE_API_TOKEN: "INSERT_TOKEN_HERE"
  CLOUDSCALE_SSH_PUBLIC_KEY: "INSERT_SSH_PUBLIC_KEY_HERE"
  CLOUDSCALE_REGION: "lpg"
  CLOUDSCALE_CONTROL_PLANE_MACHINE_FLAVOR: "flex-4-2"
  CLOUDSCALE_WORKER_MACHINE_FLAVOR: "flex-4-2"
  CLOUDSCALE_MACHINE_IMAGE: "IMAGE_NAME"
  CLOUDSCALE_ROOT_VOLUME_SIZE: "50"
extra_args:
  cloudscale:
    - "--zap-log-level=5"
template_dirs:
  docker:
    - ./test/infrastructure/docker/templates
  cloudscale:
    - path/to/local/clone/cluster-api-provider-cloudscale/templates

License

Apache License 2.0

About

Cluster API implementation for cloudscale.ch

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors