Add-Ons
Upbound's Add-Ons feature lets you build and deploy control plane software from the Kubernetes ecosystem. With the Add-Ons feature, you're not limited to just managing resource types defined by Crossplane. Now you can create resources from CustomResourceDefinitions defined by other Kubernetes ecosystem tooling.
Add-Ons are a package type that's only available for Upbound Crossplane v2 (UXP v2)
Benefits
The Add-Ons feature provides the following benefits:
- Deploy Model Context Protocol (MCP) servers to deliver more powerful intelligent control in compositions and operations.
- Deploy control plane software from the Kubernetes ecosystem.
- Use your control plane's package manager to handle the lifecycle of the control plane software and define dependencies between package.
- Build powerful compositions that combine both Crossplane and Kubernetes CustomResources.
How it works
An AddOn is a package type that bundles control plane software from the Kubernetes ecosystem. Examples of such software includes:
- Kubernetes policy engines
- CI/CD tooling
- Your own private custom controllers defined by your organization
You can discover Add-Ons in the Upbound Marketplace or build your own package.
You build an AddOn package by wrapping a helm chart along with its requisite CustomResourceDefinitions. Your AddOn package gets pushed to an OCI registry. From there you can apply it to a control plane like you would any other Crossplane package. Your control plane's package manager is responsible for managing the lifecycle of the software once applied.
Build your own AddOn
Prerequisites
Packaging an AddOn requires up CLI v0.40.0 or later.
Build an AddOn package
AddOns are a package type that get administered by your control plane's package manager.
Prepare the package
To define an AddOn, you need a Helm chart. This guide assumes the control plane software you want to build into an AddOn already has a Helm chart available.
Start by making a working directory to assemble the necessary parts:
mkdir addon-package
cd addon-package
Inside the working directory, pull the Helm chart
export CHART_REPOSITORY=<helm-chart-repo>
export CHART_NAME=<helm-chart-name>
export CHART_VERSION=<helm-chart-version>
helm pull $CHART_NAME --repo $CHART_REPOSITORY --version $CHART_VERSION
Move the Helm chart into it's own folder:
mkdir helm
mv $CHART_NAME-$CHART_VERSION.tgz helm/chart.tgz
Unpack the CRDs from the Helm chart into their own directory:
export RELEASE_NAME=<helm-release-name>
export RELEASE_NAMESPACE=<helm-release-namespace>
mkdir crds
helm template $RELEASE_NAME helm/chart.tgz -n $RELEASE_NAMESPACE --include-crds | \
yq e 'select(.kind == "CustomResourceDefinition")' - | \
yq -s '("crds/" + .metadata.name + ".yaml")' -
The preceding instructions assume your CRDs get deployed as part of your Helm chart. If they're deployed another way, you need to manually copy your CRDs instead.
Create a crossplane.yaml with your AddOn metadata:
cat <<EOF > crossplane.yaml
apiVersion: meta.pkg.upbound.io/v1beta1
kind: AddOn
metadata:
annotations:
friendly-name.meta.crossplane.io: Add-On <your-add-on>
meta.crossplane.io/description: |
A brief description of what the Add-On does.
meta.crossplane.io/license: Apache-2.0
meta.crossplane.io/maintainer: <your-email>
meta.crossplane.io/readme: |
An explanation of your Add-On.
meta.crossplane.io/source: <url-for-your-add-on-source>
name: <add-on-name>
spec:
packagingType: Helm
helm:
releaseName: <release-name>
releaseNamespace: <release-namespace>
# Value overrides for the helm release can be provided below.
# values:
# foo: bar
EOF
Your Add-On's file structure should look like this:
.
├── crds
│ ├── your-crd.yaml
│ ├── second-crd.yaml
│ └── another-crd.yaml
├── crossplane.yaml
└── helm
└── chart.tgz