Example Cluster Inventory API
Overview
KEP-4322 (Cluster Inventory / ClusterProfile API) from SIG Multi-Cluster proposes a ClusterProfile API to represent a standard inventory of clusters. See the proposal: KEP-4322: Cluster Inventory.
- Cluster Inventory: API-driven list of clusters that tools can discover and act on.
- ClusterProfile: A CRD that represents a single cluster (namespaced, identity, properties, status).
Problem
Sveltos does not natively support SIG Multi-Cluster ClusterProfile.
Solution
Use Sveltos’ Event Framework to:
- Watch
ClusterProfileobjects (multicluster.x-k8s.io/v1alpha1) viaEventSource detect-cluster-inventory-api-cluster-profiles. - For each, trigger
EventTrigger register-clusterto create a matchingSveltosCluster. - Watch kubeconfig Secrets labeled with
x-k8s.io/cluster-profileviaEventSource detect-config-secret. - For each, trigger
EventTrigger update-sveltosclusterto create the Secret layout expected bySveltosCluster.
Prerequisites
- Sveltos (including the Event Framework) installed on the management cluster.
- The management cluster labeled so Sveltos can target it (examples use
env: management). - ClusterProfile CRDs present (
apiVersion: multicluster.x-k8s.io/v1alpha1).
Architecture
In the management cluster, Sveltos and its Event Framework run the following components:
- EventSource:
detect-cluster-inventory-api-cluster-profilesWatches allClusterProfileobjects. - EventTrigger:
register-clusterInstantiates aSveltosClusterresource from eachClusterProfile(same name/namespace, labels copied). - EventSource:
detect-config-secretWatches kubeconfigSecretobjects that carry the labelx-k8s.io/cluster-profile. - EventTrigger:
update-sveltosclusterCreates the Secret in the format expected by the correspondingSveltosCluster.
Step 1: Detect ClusterProfiles and create SveltosClusters
Define EventSource detect-cluster-inventory-api-cluster-profiles to select every ClusterProfile. Then define EventTrigger register-cluster that instantiates a SveltosCluster with matching metadata.
EventSource (detect ClusterProfiles)
EventTrigger (create SveltosClusters)
cat > eventtrigger-create-sveltosclusters.yaml <<EOF
---
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventTrigger
metadata:
name: register-cluster
spec:
sourceClusterSelector:
matchLabels:
env: management
eventSourceName: detect-cluster-inventory-api-cluster-profiles
oneForEvent: true
policyRefs:
- name: sveltoscluster-metadata
namespace: default
kind: ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
name: sveltoscluster-metadata
namespace: default
annotations:
projectsveltos.io/instantiate: ok
data:
sveltos-cluster.yaml: |
apiVersion: lib.projectsveltos.io/v1beta1
kind: SveltosCluster
metadata:
name: {{ .Resource.metadata.name }}
namespace: {{ .Resource.metadata.namespace }}
{{- with .Resource.metadata.labels }}
labels:
{{- range $key, $value := . }}
{{ $key }}: {{ $value }}
{{- end }}
{{- end }}
spec:
kubeconfigKeyName: config
EOF
Step 2: Detect kubeconfig Secrets and create expected Secret
Define EventSource detect-config-secret to detect Secret objects labeled with x-k8s.io/cluster-profile. Then define EventTrigger update-sveltoscluster to generate the Secret consumed by the corresponding SveltosCluster.
EventSource (detect kubeconfig Secrets)
cat > eventsource-kubeconfig-secrets.yaml <<EOF
---
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventSource
metadata:
name: detect-config-secret
spec:
collectResources: true
resourceSelectors:
- group: ""
version: "v1"
kind: "Secret"
labelFilters:
- key: "x-k8s.io/cluster-profile"
operation: Has
EOF
EventTrigger (create kubeconfig Secret)
cat > eventtrigger-create-kubeconfig-secret.yaml <<EOF
---
apiVersion: lib.projectsveltos.io/v1beta1
kind: EventTrigger
metadata:
name: update-sveltoscluster
spec:
sourceClusterSelector:
matchLabels:
env: management
eventSourceName: detect-config-secret
oneForEvent: true
policyRefs:
- name: sveltoscluster-spec
namespace: default
kind: ConfigMap
---
apiVersion: v1
kind: ConfigMap
metadata:
name: sveltoscluster-spec
namespace: default
annotations:
projectsveltos.io/instantiate: ok
data:
sveltos-cluster.yaml: |
{{ $value := (index .Resource.metadata.labels `x-k8s.io/cluster-profile`) }}
apiVersion: v1
kind: Secret
metadata:
name: {{ $value }}-sveltos-kubeconfig
namespace: {{ .Resource.metadata.namespace }}
data:
{{ range $key, $value := .Resource.data }}
{{ $key }}: {{ $value }}
{{end}}
EOF
Result
ClusterProfileresources become discoverable inventory items, materialized asSveltosClusterresources with copied labels.- Kubeconfig Secrets labeled for a
ClusterProfileare mirrored into the format expected bySveltosCluster.
This bridges KEP-4322’s ClusterProfile API with Sveltos’ native model using the event-driven framework—no changes required in Sveltos core.