Skip to main content

Ingestor Plugin Configuration Reference

This document provides a comprehensive reference for all configuration options available in the Backstage Ingestor Plugin.

Table of Contents​

Overview​

The ingestor plugin is configured through your app-config.yaml file under the kubernetesIngestor key. All configuration options are optional with sensible defaults.

kubernetesIngestor:
mappings: { ... } # Entity mapping configuration
components: { ... } # Kubernetes component discovery
crossplane: { ... } # Crossplane XRD discovery

Configuration Structure​

Complete Configuration Example​

kubernetesIngestor:
# Annotation prefix for custom annotations
annotationPrefix: 'terasky.backstage.io' # default: 'terasky.backstage.io'

# Filter which clusters to ingest from
allowedClusterNames: # optional, defaults to all clusters
- production
- staging

# Entity mapping configuration
mappings:
namespaceModel: 'namespace' # Options: cluster, namespace, default
nameModel: 'name-cluster' # Options: name-cluster, name-namespace, name
titleModel: 'name' # Options: name, name-cluster, name-namespace
systemModel: 'cluster' # Options: cluster, namespace, cluster-namespace, default
referencesNamespaceModel: 'default' # Options: same, default

# Kubernetes component discovery
components:
enabled: true # Enable component discovery
taskRunner:
frequency: 600 # Scan frequency in seconds (default: 600)
timeout: 600 # Maximum processing time in seconds (default: 600)
excludedNamespaces: # Namespaces to exclude from discovery
- kube-public
- kube-system
- kube-node-lease
onlyIngestAnnotatedResources: false # Only ingest resources with backstage annotations

# Crossplane configuration
crossplane:
enabled: true # Enable Crossplane support
claims:
ingestAllClaims: true # Ingest all claims and XRs from cluster
xrds:
enabled: true # Enable XRD discovery
ingestAllXRDs: true # Ingest all XRDs with the label
labelSelector: 'openportal.dev/tags' # Label selector for XRDs
tagsLabel: 'openportal.dev/tags' # Label containing tags for templates
defaultNamespace: 'demo' # Default namespace for XR templates
taskRunner:
frequency: 600 # XRD scan frequency in seconds
timeout: 600 # Maximum XRD processing time in seconds

# Generic CRD templates configuration (advanced)
genericCRDTemplates:
publishPhase:
target: 'github' # Target git provider: github, gitlab, bitbucket
allowedTargets: # Allowed targets for template selection
- github
- gitlab
allowRepoSelection: true # Allow repository selection in templates
git:
repoUrl: 'github.com?repo=catalog-orders&owner=open-service-portal'
targetBranch: 'main'

Mappings Configuration​

The mappings section controls how Kubernetes resources are mapped to Backstage entities.

namespaceModel​

Controls how the namespace is represented in entity metadata.

  • Type: string
  • Default: 'default'
  • Options:
    • 'cluster' - Use the cluster name as namespace
    • 'namespace' - Use the Kubernetes namespace
    • 'default' - Always use 'default'

nameModel​

Note: This configuration option is defined but not currently implemented in the code.

  • Type: string
  • Default: 'name-cluster'
  • Options:
    • 'name-cluster' - Format: {name}-{cluster}
    • 'name-namespace' - Format: {name}-{namespace}
    • 'name' - Use resource name only

titleModel​

Note: This configuration option is defined but not currently implemented in the code.

  • Type: string
  • Default: 'name'
  • Options:
    • 'name' - Use resource name
    • 'name-cluster' - Format: {name} ({cluster})
    • 'name-namespace' - Format: {name} ({namespace})

systemModel​

Determines which system entities are associated with.

  • Type: string
  • Default: 'namespace'
  • Options:
    • 'cluster' - Group by cluster
    • 'namespace' - Group by namespace
    • 'cluster-namespace' - Format: {cluster}-{namespace}
    • 'default' - Use 'default' system

referencesNamespaceModel​

Controls namespace references in entity relationships.

  • Type: string
  • Default: 'default'
  • Options:
    • 'same' - Use the same namespace as the resource
    • 'default' - Always use 'default'

Components Configuration​

Controls the discovery and ingestion of Kubernetes components (Deployments, Services, etc.).

enabled​

Enable or disable component discovery.

  • Type: boolean
  • Default: true

taskRunner​

Configures the scheduled task that scans for components.

taskRunner.frequency​

How often to scan clusters for components.

  • Type: number (seconds)
  • Default: 600 (10 minutes)
  • Range: 10 - 86400 (10 seconds to 24 hours)

taskRunner.timeout​

Maximum time allowed for component processing.

  • Type: number (seconds)
  • Default: 600 (10 minutes)
  • Range: 60 - 3600 (1 minute to 1 hour)

excludedNamespaces​

List of namespaces to exclude from component discovery.

  • Type: string[]
  • Default: []
  • Recommended:
    excludedNamespaces:
    - kube-public
    - kube-system
    - kube-node-lease
    - flux-system
    - crossplane-system
    - cert-manager
    - ingress-nginx

onlyIngestAnnotatedResources​

Only ingest resources that have Backstage annotations.

  • Type: boolean
  • Default: false
  • Use Case: Set to true in large clusters to only discover explicitly annotated resources

Crossplane Configuration​

Controls the discovery and ingestion of Crossplane resources.

enabled​

Enable or disable Crossplane support globally.

  • Type: boolean
  • Default: true

Claims Configuration​

claims.ingestAllClaims​

Automatically discover and ingest all Crossplane claims and XRs.

  • Type: boolean
  • Default: true
  • Note: When false, only explicitly annotated claims are ingested

XRDs Configuration​

xrds.enabled​

Enable XRD discovery and template generation.

  • Type: boolean
  • Default: true

xrds.ingestAllXRDs​

Ingest all XRDs that match the label selector.

  • Type: boolean
  • Default: true
  • Note: When false, only XRDs with specific annotations are processed

xrds.labelSelector​

Kubernetes label selector for filtering XRDs.

  • Type: string
  • Default: 'openportal.dev/tags'
  • Example: Only process XRDs with this label present

xrds.tagsLabel​

Label key containing comma-separated tags for templates.

  • Type: string
  • Default: 'openportal.dev/tags'
  • Usage: Tags from this label are added to generated templates

xrds.defaultNamespace​

Default namespace for XR instances created from templates.

  • Type: string
  • Default: 'demo'

xrds.taskRunner​

Separate task runner configuration for XRD discovery.

  • frequency: Scan interval in seconds (default: 600)
  • timeout: Maximum processing time in seconds (default: 600)

Advanced Options​

annotationPrefix​

Customize the annotation prefix used for Backstage-specific annotations.

  • Type: string
  • Default: 'terasky.backstage.io'
  • Example: With prefix 'mycompany.io', annotations would be:
    • mycompany.io/kubernetes-id
    • mycompany.io/source-location

allowedClusterNames​

Filter which clusters to ingest resources from.

  • Type: string[]
  • Default: undefined (all clusters)
  • Example:
    allowedClusterNames:
    - production
    - staging

Generic CRD Templates​

Advanced configuration for template generation and GitOps integration.

genericCRDTemplates.publishPhase.target​

Default git provider for template publishing.

  • Type: string
  • Options: 'github', 'gitlab', 'bitbucket'
  • Default: 'github'

genericCRDTemplates.publishPhase.allowedTargets​

Which git providers users can select in templates.

  • Type: string[]
  • Default: ['github']

genericCRDTemplates.publishPhase.allowRepoSelection​

Allow users to select different repositories in template forms.

  • Type: boolean
  • Default: true

genericCRDTemplates.publishPhase.git​

Default git configuration for template publishing.

  • repoUrl: Repository URL with placeholders
  • targetBranch: Default branch for PRs/commits

Examples​

Minimal Configuration​

kubernetesIngestor:
components:
enabled: true
crossplane:
enabled: true

Production Configuration​

kubernetesIngestor:
allowedClusterNames:
- production
- staging

mappings:
namespaceModel: 'namespace'
systemModel: 'cluster-namespace'

components:
enabled: true
taskRunner:
frequency: 300 # 5 minutes
timeout: 900 # 15 minutes
excludedNamespaces:
- kube-public
- kube-system
- kube-node-lease
- flux-system
- crossplane-system
- backstage-system
- cert-manager
- ingress-nginx
- external-dns
onlyIngestAnnotatedResources: true

crossplane:
enabled: true
claims:
ingestAllClaims: true
xrds:
enabled: true
ingestAllXRDs: true
labelSelector: 'platform.company.com/backstage'
tagsLabel: 'platform.company.com/tags'
defaultNamespace: 'platform-services'
taskRunner:
frequency: 600
timeout: 1200

Multi-Cluster Configuration​

kubernetesIngestor:
allowedClusterNames:
- us-east-1
- us-west-2
- eu-central-1

mappings:
namespaceModel: 'cluster'
systemModel: 'cluster'

components:
enabled: true
excludedNamespaces:
- kube-system
- kube-public

Development Configuration​

kubernetesIngestor:
annotationPrefix: 'dev.backstage.io'

mappings:
namespaceModel: 'namespace'
systemModel: 'namespace'

components:
enabled: true
taskRunner:
frequency: 60 # 1 minute for faster feedback
timeout: 300 # 5 minutes
excludedNamespaces:
- kube-system

crossplane:
enabled: true
xrds:
enabled: true
defaultNamespace: 'dev-test'

Environment Variables​

Some configuration values can be overridden using environment variables:

  • INGESTOR_ANNOTATION_PREFIX - Override annotationPrefix
  • INGESTOR_SCAN_FREQUENCY - Override taskRunner.frequency (in seconds)
  • INGESTOR_EXCLUDED_NAMESPACES - Comma-separated list of namespaces to exclude

Troubleshooting​

Components Not Being Discovered​

  1. Check that components.enabled is true
  2. Verify the namespace is not in excludedNamespaces
  3. If onlyIngestAnnotatedResources is true, ensure resources have annotations
  4. Check logs for errors: kubectl logs -n backstage deployment/backstage -c backstage

XRDs Not Generating Templates​

  1. Ensure crossplane.xrds.enabled is true
  2. Verify XRDs have the required label (default: openportal.dev/tags)
  3. Check that the label contains valid tags
  4. Review logs for XRD processing errors

High Memory Usage​

Reduce scan frequency or increase timeout:

components:
taskRunner:
frequency: 1800 # 30 minutes
timeout: 1800 # 30 minutes

Slow Ingestion​

  1. Increase taskRunner.timeout
  2. Use allowedClusterNames to limit clusters
  3. Add more namespaces to excludedNamespaces
  4. Enable onlyIngestAnnotatedResources for large clusters