Skip to main content

Addon System

This document covers addon lifecycle management, installation flows, and custom addon creation. For an introduction to addon types and the three addon CRDs, see Concepts: Addons.

AddonDefinition

AddonDefinitions are cluster-scoped resources that define available addons.

apiVersion: butler.butlerlabs.dev/v1alpha1
kind: AddonDefinition
metadata:
name: cilium
spec:
displayName: "Cilium"
description: "eBPF-based networking, observability, and security"
category: cni
platform: true
tier: infrastructure
icon: "🔌"
iconData: "PHN2ZyB4bWxucz0i..." # base64-encoded SVG

chart:
repository: https://helm.cilium.io
name: cilium
defaultVersion: "1.17.0"

defaults:
namespace: kube-system
values:
operator:
replicas: 1
hubble:
enabled: true
relay:
enabled: true

dependsOn: []

links:
documentation: https://docs.cilium.io
source: https://github.com/cilium/cilium
homepage: https://cilium.io

AddonDefinition Fields

FieldTypeDescription
displayNamestringHuman-readable name shown in the Console
descriptionstringWhat the addon does (max 512 characters)
categoryenumGrouping for catalog display (see categories)
platformbooleanIf true, installed during cluster creation and cannot be removed via UI
tierenuminfrastructure or apps -- controls GitOps export placement (see Tier Classification)
iconstringEmoji fallback icon (max 8 characters)
iconDatastringBase64-encoded SVG logo (see Icon Resolution)
chartobjectHelm chart repository, name, and default version
defaultsobjectInstallation defaults: namespace, release name, timeout, Helm values
dependsOnarrayAddon names that must be installed first
linksobjectURLs for documentation, homepage, and source code
maintainerobjectMaintainer name and email

Categories

CategoryDescription
cniContainer networking interface
loadbalancerLoadBalancer service implementations
storagePersistent volume provisioners
certmanagerCertificate management
ingressIngress controllers
observabilityMonitoring, logging, and tracing
backupCluster backup and disaster recovery
gitopsGitOps continuous delivery
securitySecrets management and policy
dnsExternal DNS management
databaseDatabase operators
messagingMessage brokers and event streaming
service-meshService mesh and traffic management
otherUncategorized addons

Tier Classification

Every addon belongs to one of two tiers:

infrastructure -- Foundational cluster services that other workloads depend on. Networking, storage, certificate management, secrets operators, and service meshes fall here. When Butler exports a cluster configuration to a GitOps repository, infrastructure addons are placed in a separate directory so they can be applied before application workloads.

apps -- Application-level tools that run on top of infrastructure. Monitoring dashboards, log aggregators, backup tools, and message brokers fall here. These are deployed after infrastructure addons in GitOps exports.

If tier is not set explicitly, Butler infers it:

  • Platform addons (platform: true) default to infrastructure
  • All other addons default to apps

You can override the inferred tier. For example, Prometheus Operator and Flux are not platform addons but are classified as infrastructure because other workloads depend on their CRDs.

Icon Resolution

Butler Console renders addon icons using a three-step fallback chain:

  1. iconData -- If present, decoded as an SVG image and rendered inline. This is the preferred approach for product logos.
  2. icon -- If iconData is empty, the icon field is rendered as text (typically an emoji like 🔒).
  3. Fallback -- If neither field is set, Butler displays a generic package icon (📦).

The iconData field accepts a base64-encoded SVG. To encode an SVG file:

# Linux
base64 -w 0 logo.svg

# macOS
base64 -i logo.svg | tr -d '\n'

The encoded string goes directly into spec.iconData -- do not include a data: URI prefix. Maximum length is 131,072 characters.

TenantAddon

TenantAddons represent addon installations on tenant clusters.

apiVersion: butler.butlerlabs.dev/v1alpha1
kind: TenantAddon
metadata:
name: my-cluster-prometheus
namespace: team-a
spec:
clusterRef:
name: my-cluster
addon: prometheus-operator
version: "72.6.2"
values:
server:
retention: 30d
alertmanager:
enabled: true

Lifecycle

Installation Flow

ManagementAddon

ManagementAddons install addons on the management cluster itself.

apiVersion: butler.butlerlabs.dev/v1alpha1
kind: ManagementAddon
metadata:
name: victoria-metrics
spec:
addon: victoria-metrics
version: "0.25.0"
values:
server:
retentionPeriod: 90d

ManagementAddons are cluster-scoped and managed by platform administrators.

Built-in Addons

Butler ships with 27 AddonDefinitions across two tiers.

Platform Addons

Platform addons are installed automatically during cluster creation and cannot be removed through the Console.

AddonDisplay NameCategoryDescription
ciliumCiliumcnieBPF-based networking with Hubble observability
metallbMetalLBloadbalancerLoadBalancer services for bare-metal clusters
cert-managercert-managercertmanagerX.509 certificate management
longhornLonghornstorageDistributed block storage
traefikTraefikingressIngress controller and reverse proxy
metrics-serverMetrics ServerobservabilityCluster resource metrics for HPA and kubectl top

Infrastructure-Tier Optional Addons

These are not installed automatically but are classified as infrastructure because other workloads may depend on their CRDs or services.

AddonDisplay NameCategoryDescription
cnpgCloudNativePGdatabasePostgreSQL operator with automated failover
external-dnsExternalDNSdnsSynchronize Kubernetes Services/Ingresses with DNS providers
external-secretsExternal Secrets OperatorsecuritySync secrets from external stores (Vault, AWS SSM, etc.)
fluxFlux CDgitopsGitOps continuous delivery for Kubernetes
istioIstioservice-meshService mesh with traffic management and mTLS
linkerdLinkerdservice-meshLightweight service mesh focused on simplicity
prometheus-operatorPrometheus OperatorobservabilityMonitoring stack operator with ServiceMonitor CRDs
sealed-secretsSealed SecretssecurityEncrypt secrets for safe storage in Git

Application-Tier Optional Addons

Application-level tools that run on top of infrastructure.

AddonDisplay NameCategoryDescription
argocdArgo CDgitopsDeclarative GitOps continuous delivery
jaegerJaegerobservabilityDistributed tracing backend
lokiGrafana LokiobservabilityLog aggregation with label-based indexing
natsNATSmessagingCloud-native messaging system
otel-collectorOpenTelemetry CollectorobservabilityVendor-agnostic telemetry data pipeline
rabbitmqRabbitMQmessagingMessage broker with AMQP support
redisRedisdatabaseIn-memory data store and cache
tempoGrafana TempoobservabilityDistributed tracing with object storage backend
vector-agentVector AgentobservabilityNode-level log and metrics collector
vector-aggregatorVector AggregatorobservabilityCentralized log processing and routing
veleroVelerobackupCluster backup, restore, and migration
victoria-logsVictoria LogsobservabilityLog management with VictoriaMetrics
victoria-metricsVictoria MetricsobservabilityLong-term metrics storage compatible with Prometheus

Custom Addons

Organizations can add custom AddonDefinitions for internal applications.

Creating a Custom Addon

apiVersion: butler.butlerlabs.dev/v1alpha1
kind: AddonDefinition
metadata:
name: internal-app
spec:
displayName: "Internal Application"
description: "Company-specific deployment platform"
category: other
tier: apps
iconData: "PHN2ZyB4bWxucz0i..." # base64-encoded company logo

chart:
repository: https://charts.internal.company.com
name: internal-app
defaultVersion: "2.1.0"

defaults:
namespace: internal
createNamespace: true
timeout: "15m"
values:
replicaCount: 2

links:
documentation: https://wiki.internal.company.com/internal-app

To create a custom addon with an icon, encode your SVG logo:

# Encode the SVG
ICON=$(base64 -i logo.svg | tr -d '\n')

# Create the AddonDefinition (via Console or kubectl)
kubectl apply -f - <<EOF
apiVersion: butler.butlerlabs.dev/v1alpha1
kind: AddonDefinition
metadata:
name: my-tool
spec:
displayName: "My Tool"
description: "Internal monitoring dashboard"
category: observability
tier: apps
iconData: "$ICON"
chart:
repository: https://charts.company.com
name: my-tool
defaultVersion: "1.0.0"
EOF

Private Helm Repositories

For private repositories, create a Secret:

apiVersion: v1
kind: Secret
metadata:
name: internal-helm-repo
namespace: butler-system
type: Opaque
stringData:
username: helm-user
password: secret-password

Reference in AddonDefinition:

spec:
chart:
repository: https://charts.internal.company.com
credentialsRef:
name: internal-helm-repo
namespace: butler-system

See Also