Skip to content

Crossplane

This chapter describes how consumers (platform teams, tenants) can use CobaltCore as a platform via Crossplane.

Note: Crossplane is not part of CobaltCore itself. This document describes how consumers can use CobaltCore via Crossplane -- similar to Terraform or a CLI working against the C5C3 interfaces.

Repository: github.com/crossplane/crossplaneRuns in: Consumer clusters (e.g., user's Management Cluster) Status: CNCF Incubating Project

Crossplane is a framework for building cloud-native control planes. In the CobaltCore context, Crossplane enables consumers to perform self-service provisioning of:

  1. Kubernetes clusters with Gardener (Control Plane Cluster, Hypervisor Cluster Pools, Storage Cluster Pools)
  2. OpenStack clusters in the Control Plane Cluster (via c5c3-operator) - consume Hypervisor and Storage clusters

Chapter contents:

  • Cluster Provisioning -- XRDs and Compositions for Control Plane, Hypervisor, and Storage cluster pools
  • OpenStack Provisioning -- XOpenStackCluster XRD, Ceph resource management, and Compositions
  • Operations -- Claims, FluxCD integration, multi-tenancy, and provisioning flow

Resource Model

text
┌─────────────────────────────────────────────────────────────────────────────┐
│                      CobaltCore Resource Model                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  CONTROL PLANE CLUSTER (1x per region)                                      │
│  ══════════════════════════════════════                                     │
│  Hosts all OpenStack Control Planes for a region                            │
│                                                                             │
│  ┌─────────────────────────────────────────────────────────────────────┐    │
│  │                    OpenStack Control Planes                         │    │
│  │                                                                     │    │
│  │  ┌───────────────┐  ┌───────────────┐  ┌───────────────┐            │    │
│  │  │ ControlPlane  │  │ ControlPlane  │  │ ControlPlane  │            │    │
│  │  │ "customer-a"  │  │ "customer-b"  │  │ "internal"    │            │    │
│  │  │               │  │               │  │               │            │    │
│  │  │ Nova API      │  │ Nova API      │  │ Nova API      │            │    │
│  │  │ Neutron API   │  │ Neutron API   │  │ Neutron API   │            │    │
│  │  │ Keystone      │  │ Keystone      │  │ Keystone      │            │    │
│  │  │ ...           │  │ ...           │  │ ...           │            │    │
│  │  └───────┬───────┘  └───────┬───────┘  └───────┬───────┘            │    │
│  │          │                  │                  │                    │    │
│  └──────────┼──────────────────┼──────────────────┼────────────────────┘    │
│             │                  │                  │                         │
│             │ consumes         │ consumes         │ consumes                │
│             ▼                  ▼                  ▼                         │
│                                                                             │
│  HYPERVISOR CLUSTER POOLS                    STORAGE CLUSTER POOLS          │
│  ════════════════════════                    ═════════════════════          │
│                                                                             │
│  ┌─────────────┐ ┌─────────────┐            ┌─────────────┐ ┌─────────────┐ │
│  │ Hypervisor  │ │ Hypervisor  │            │  Storage    │ │  Storage    │ │
│  │ Cluster 1   │ │ Cluster 2   │            │  Cluster 1  │ │  Cluster 2  │ │
│  │ "hv-pool-a" │ │ "hv-pool-b" │            │ "st-pool-a" │ │ "st-pool-b" │ │
│  │             │ │             │            │             │ │             │ │
│  │ 50 Nodes    │ │ 100 Nodes   │            │ Ceph        │ │ Ceph        │ │
│  │   libvirt   │ │   libvirt   │            │ 500TB       │ │ 1PB         │ │
│  └─────────────┘ └─────────────┘            └─────────────┘ └─────────────┘ │
│        │               │                          │               │         │
│        └───────┬───────┘                          └───────┬───────┘         │
│                │                                          │                 │
│  Assignment: 1 OpenStack cluster can                                        │
│  - use 1..N Hypervisor clusters                                             │
│  - use 1..M Storage clusters                                                │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

For details on the CRDs consumed by this model, see CRDs. For the overall architecture, see Architecture Overview.

Architecture Overview (Pool Model)

The pool model enables the independent provisioning of Hypervisor and Storage clusters as resource pools that can be consumed by multiple OpenStack clusters:

text
┌──────────────────────────────────────────────────────────────────────────────────┐
│                              MANAGEMENT CLUSTER                                  │
│                                                                                  │
│  ┌────────────────────────────────────────────────────────────────────────────┐  │
│  │                            Crossplane                                      │  │
│  │                                                                            │  │
│  │  ┌──────────────────────────────────────────────────────────────────────┐  │  │
│  │  │                       Crossplane Core                                │  │  │
│  │  │   - Composition Engine    - Package Manager    - RBAC Manager        │  │  │
│  │  └──────────────────────────────────────────────────────────────────────┘  │  │
│  │                                                                            │  │
│  │  ┌───────────────────────────────────────────────────────────┐             │  │
│  │  │              provider-kubernetes                          │             │  │
│  │  │                                                           │             │  │
│  │  │  - Manages Gardener Shoot resources (K8s clusters)        │             │  │
│  │  │    in Gardener API (garden-c5c3 namespace)                │             │  │
│  │  │  - Manages ControlPlane CRs in Control Plane Cluster      │             │  │
│  │  │                                                           │             │  │
│  │  └───────────────────────────────────────────────────────────┘             │  │
│  │                                                                            │  │
│  │  ┌──────────────────────────────────────────────────────────────────────┐  │  │
│  │  │              Custom XRDs + Compositions (Pool Model)                 │  │  │
│  │  │                                                                      │  │  │
│  │  │  ┌──────────────────────┐ ┌──────────────────────┐ ┌──────────────┐  │  │  │
│  │  │  │ XControlPlaneCluster │ │ XHypervisorCluster   │ │ XStorage-    │  │  │  │
│  │  │  │ ──────────────────── │ │ ──────────────────── │ │ Cluster      │  │  │  │
│  │  │  │ spec:                │ │ spec:                │ │ ──────────── │  │  │  │
│  │  │  │   region: eu-de-1    │ │   region: eu-de-1    │ │ spec:        │  │  │  │
│  │  │  │   workers: 5         │ │   name: hv-pool-a    │ │   region:    │  │  │  │
│  │  │  │                      │ │   workers: 50        │ │   eu-de-1    │  │  │  │
│  │  │  │ Creates:             │ │   machinePool: kvm   │ │   name:      │  │  │  │
│  │  │  │ - Gardener Shoot     │ │                      │ │   st-pool-a  │  │  │  │
│  │  │  │   (Control Plane)    │ │ Creates:             │ │   capacity:  │  │  │  │
│  │  │  └──────────────────────┘ │ - Gardener Shoot     │ │   500TB      │  │  │  │
│  │  │                           │   (Hypervisor Pool)  │ │              │  │  │  │
│  │  │                           └──────────────────────┘ │ Creates:     │  │  │  │
│  │  │                                                    │ - Gardener   │  │  │  │
│  │  │                                                    │   Shoot      │  │  │  │
│  │  │                                                    │   (Storage)  │  │  │  │
│  │  │                                                    └──────────────┘  │  │  │
│  │  │                                                                      │  │  │
│  │  │  ┌───────────────────────────────────────────────────────────────┐   │  │  │
│  │  │  │ XOpenStackCluster                                             │   │  │  │
│  │  │  │ ─────────────────                                             │   │  │  │
│  │  │  │ spec:                                                         │   │  │  │
│  │  │  │   region: eu-de-1                                             │   │  │  │
│  │  │  │   size: large                                                 │   │  │  │
│  │  │  │   hypervisorClusters:           # Pool references             │   │  │  │
│  │  │  │     - hv-pool-a                                               │   │  │  │
│  │  │  │     - hv-pool-b                                               │   │  │  │
│  │  │  │   storageClusters:              # Pool references             │   │  │  │
│  │  │  │     - st-pool-a                                               │   │  │  │
│  │  │  │                                                               │   │  │  │
│  │  │  │ Creates: ControlPlane CR (references pools)                   │   │  │  │
│  │  │  └───────────────────────────────────────────────────────────────┘   │  │  │
│  │  └──────────────────────────────────────────────────────────────────────┘  │  │
│  └────────────────────────────────────────────────────────────────────────────┘  │
│                                                                                  │
│    │ provider-kubernetes                                                         │
│    │ - Creates Shoot CRs in Gardener (garden-c5c3)                               │
│    │ - Creates Object CRs in Control Plane Cluster                               │
│    ▼                                                                             │
└────┼──────────────────────────────────────────────────────────────────────────── ┘


┌─────────────────────────┐
│        GARDENER         │
│  (garden-c5c3)          │
│                         │
│  Provisions             │
│  independently:         │
│                         │
│  ┌─────────────────┐    │
│  │ Control Plane   │    │
│  │ Cluster (1x)    │◀───┼──┐
│  └─────────────────┘    │  │
│                         │  │  After cluster ready:
│  ┌─────────────────┐    │  │  provider-kubernetes
│  │ Hypervisor Pool │    │  │  creates ControlPlane CRs
│  │ (1..N Clusters) │    │  │
│  └─────────────────┘    │  │  Hypervisor/Storage pools
│                         │  │  are provisioned independently
│  ┌─────────────────┐    │  │  and referenced by OpenStack
│  │ Storage Pool    │    │  │  clusters
│  │ (1..M Clusters) │    │  │
│  └─────────────────┘    │  │
└───────────┬─────────────┘  │
            │                │
            │ Creates K8s    │
            │ Clusters       │
            ▼                │

            │ Creates Kubernetes Clusters


┌────────────────────────────────────────────────────────────────────────────────────┐
│                                                                                    │
│  CONTROL PLANE CLUSTER (1x per region)                                             │
│  ┌──────────────────────────────────────────────────────────────────────────────┐  │
│  │  c5c3-operator                                                               │  │
│  │                                                                              │  │
│  │  ┌─────────────────────┐  ┌─────────────────────┐  ┌─────────────────────┐   │  │
│  │  │ ControlPlane CR     │  │ ControlPlane CR     │  │ ControlPlane CR     │   │  │
│  │  │ "customer-a"        │  │ "customer-b"        │  │ "internal"          │   │  │
│  │  │                     │  │                     │  │                     │   │  │
│  │  │ hypervisorClusters: │  │ hypervisorClusters: │  │ hypervisorClusters: │   │  │
│  │  │ - hv-pool-a         │  │ - hv-pool-a         │  │ - hv-pool-b         │   │  │
│  │  │ - hv-pool-b         │  │                     │  │                     │   │  │
│  │  │ storageClusters:    │  │ storageClusters:    │  │ storageClusters:    │   │  │
│  │  │ - st-pool-a         │  │ - st-pool-a         │  │ - st-pool-a         │   │  │
│  │  └─────────┬───────────┘  └─────────┬───────────┘  └─────────┬───────────┘   │  │
│  │            │                        │                        │               │  │
│  └────────────┼────────────────────────┼────────────────────────┼───────────────┘  │
│               │                        │                        │                  │
│               │ consumes               │ consumes               │ consumes         │
│               ▼                        ▼                        ▼                  │
│                                                                                    │
│  HYPERVISOR CLUSTER POOLS                    STORAGE CLUSTER POOLS                 │
│  ┌──────────────────────┐ ┌──────────────────────┐  ┌──────────────────────┐       │
│  │ Hypervisor Cluster   │ │ Hypervisor Cluster   │  │ Storage Cluster      │       │
│  │ "hv-pool-a"          │ │ "hv-pool-b"          │  │ "st-pool-a"          │       │
│  │ (Gardener Shoot)     │ │ (Gardener Shoot)     │  │ (Gardener Shoot)     │       │
│  │                      │ │                      │  │                      │       │
│  │ 50 Nodes             │ │ 100 Nodes            │  │ Rook Operator        │       │
│  │ libvirt              │ │ libvirt              │  │ Ceph 500TB           │       │
│  │ Nova/OVN Agents      │ │ Nova/OVN Agents      │  │ Prysm                │       │
│  └──────────────────────┘ └──────────────────────┘  └──────────────────────┘       │
│                                                                                    │
│  Pool Sharing:                                                                     │
│  - customer-a uses: hv-pool-a, hv-pool-b, st-pool-a                                │
│  - customer-b uses: hv-pool-a, st-pool-a (shared)                                  │
│  - internal uses: hv-pool-b, st-pool-a (shared)                                    │
│                                                                                    │
└────────────────────────────────────────────────────────────────────────────────────┘

Crossplane Components

ComponentDescription
Crossplane CoreComposition Engine, Package Manager, RBAC
provider-kubernetesManages K8s objects in remote clusters (Gardener Shoots + ControlPlane CRs) via kubeconfig
XRD (CompositeResourceDefinition)Defines custom APIs (e.g., XControlPlaneCluster, XOpenStackCluster)
CompositionTemplate that maps XRD to concrete resources
Claim (XRC)Namespace-scoped request for a Composite Resource

provider-kubernetes Setup

The provider-kubernetes (crossplane-contrib/provider-kubernetes) enables Crossplane to manage Kubernetes resources in remote clusters, including:

  1. Gardener Shoot resources in the Gardener cluster (garden-c5c3 namespace)
  2. ControlPlane CRs in the Control Plane Cluster (via c5c3-operator)

ProviderConfig for Gardener

yaml
# ProviderConfig to access Gardener API
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: gardener
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: gardener-kubeconfig
      key: kubeconfig

ProviderConfig for Control Plane Cluster

yaml
# ProviderConfig to access Control Plane Cluster
apiVersion: kubernetes.crossplane.io/v1alpha1
kind: ProviderConfig
metadata:
  name: control-plane
spec:
  credentials:
    source: Secret
    secretRef:
      namespace: crossplane-system
      name: control-plane-kubeconfig
      key: kubeconfig

See also: GitOps / FluxCD for how Crossplane is deployed via FluxCD in the Management Cluster.