Composite Resource Definitions
Composite resource definitions (XRDs) define the schema for a custom API.
Users create composite resources (XRs) using the API schema defined by an
XRD.
Read the composite resources page for more information about composite resources.
What are XRs, XRDs and Compositions?
A composite resource or XR is a custom API.
You use two Crossplane types to create a new custom API:
- A Composite Resource Definition (XRD) - This page. Defines the XR's schema.
- A Composition - Configures how the XR creates other resources.
Crossplane XRDs are like Kubernetes custom resource definitions. XRDs require fewer fields and add options related to Crossplane, like connection secrets.
Creating a CompositeResourceDefinition
Creating a CompositeResourceDefinition consists of:
Optionally, CompositeResourceDefinitions also support:
Composite resource definitions (XRDs) create new API endpoints inside a
Kubernetes cluster.
Creating a new API requires defining an API group, name and version.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: mydatabases.example.org
spec:
group: example.org
names:
kind: XMyDatabase
plural: mydatabases
versions:
- name: v1alpha1
# Removed for brevity
After applying an XRD, Crossplane creates a new Kubernetes custom resource definition matching the defined API.
For example, the XRD
mydatabases.example.org
creates a custom resource definition
mydatabases.example.org.
kubectl api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
mydatabases.example.org v1alpha1 true mydatabases
# Removed for brevity
You can't change the XRD
group or
names.
You must delete and
recreate the XRD to change the
group or
names.
XRD groups
Groups define a collection of related API endpoints. The group can be any
value, but common convention is to map to a fully qualified domain name.
Multiple XRDs may use the same group to create a logical collection of APIs.
For example a database group may have a relational and nosql kinds.
XRD names
The names field defines how to refer to this specific XRD.
The required name fields are:
kind- thekindvalue to use when calling this API. The kind is UpperCamelCased. Crossplane recommends starting XRDkindswith anXto show it's a custom Crossplane API definition.plural- the plural name used for the API URL. The plural name must be lowercase.
The XRD
metadata.name must be
plural name, . (dot character),
group.
For example, mydatabases.example.org matches the plural name
mydatabases, .
group name,
example.org.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: mydatabases.example.org
spec:
group: example.org
names:
kind: XMyDatabase
plural: mydatabases
# Removed for brevity
XRD versions
The XRD version is like the
API versioning used by Kubernetes.
The version shows how mature or stable the API is and increments when changing,
adding or removing fields in the API.
Crossplane doesn't require specific versions or a specific version naming convention, but following Kubernetes API versioning guidelines is strongly recommended.
v1alpha1- A new API that may change at any time.v1beta1- An existing API that's considered stable. Breaking changes are strongly discouraged.v1- A stable API that doesn't have breaking changes.
Define a schema
The schema defines the names
of the parameters, the data types of the parameters and which parameters are
required or optional.
All schemas follow the Kubernetes custom resource definition
OpenAPIv3 structural schema.
Each
version of the API has a unique
schema.
All XRD schemas validate against
the openAPIV3Schema. The schema
is an OpenAPI
object with the
properties of a
spec
object.
Inside the spec.properties is the custom
API definition.
In this example, the key region
is a string.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.custom-api.example.org
spec:
group: custom-api.example.org
names:
kind: xDatabase
plural: xdatabases
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
region:
type: string
# Removed for brevity
A composite resource using this API references the
group/version and
kind. The
spec has the
region key with a string value.
apiVersion: custom-api.example.org/v1alpha1
kind: xDatabase
metadata:
name: my-composite-resource
spec:
region: "US"
The custom API defined inside the
spec.properties is an OpenAPIv3
specification. The
data models page of
the Swagger documentation provides a list of examples using data types and input
restrictions.
The Kubernetes documentation lists the set of special restrictions on what your OpenAPIv3 custom API can use.
Changing or expanding the XRD schema requires restarting the Crossplane pod to take effect.
Required fields
By default all fields in a schema are optional. Define a parameter as required
with the
required attribute.
In this example the XRD requires
region and
size but
name is optional.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.custom-api.example.org
spec:
group: custom-api.example.org
names:
kind: xDatabase
plural: xdatabases
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
region:
type: string
size:
type: string
name:
type: string
required:
- region
- size
# Removed for brevity
According to the OpenAPIv3 specification, the required field is per-object. If
a schema contains multiple objects the schema may need multiple required
fields.
This XRD defines two objects:
- the top-level
specobject - a second
locationobject
The spec object
requires the
size and
location but
name is optional.
Inside the required location
object,
country is
required and
zone is optional.
# Removed for brevity
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
size:
type: string
name:
type: string
location:
type: object
properties:
country:
type: string
zone:
type: string
required:
- country
required:
- size
- location
The Swagger "Describing Parameters" documentation has more examples.
Crossplane reserved fields
Crossplane doesn't allow the following fields in a schema:
- Any field under the object
spec.crossplane - Any field under the object
status.crossplane status.conditions
Crossplane ignores any fields matching the reserved fields.
Serve and reference a schema
To use a schema it must be
served: true
and
referenceable: true.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.custom-api.example.org
spec:
group: custom-api.example.org
names:
kind: xDatabase
plural: xdatabases
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
region:
type: string
Composite resources can use any schema version set as
served: true.
Kubernetes rejects any composite resource using a schema version set as served: false.
Setting a schema version as served:false causes errors for users using an older
schema. This can be an effective way to identify and upgrade users before
deleting the older schema version.
The referenceable: true
field indicates which version of the schema Compositions use. Only one
version can be referenceable.
Changing which version is referenceable:true requires updating the compositeTypeRef.apiVersion
of any Compositions referencing that XRD.
Multiple schema versions
Crossplane supports defining multiple versions, but the schema of each version
can't change any existing fields, also called "making a breaking change."
Breaking schema changes between versions requires the use of conversion webhooks.
New versions may define new optional parameters, but new required fields are a "breaking change."
Crossplane XRDs use Kubernetes custom resource definitions for versioning. Read the Kubernetes documentation on versions in CustomResourceDefinitions for more background on versions and breaking changes.
Crossplane recommends implementing breaking schema changes as brand new XRDs.
For XRDs, to create a new version of an API add a new
name in the
versions
list.
For example, this XRD version
v1alpha1 only has the field
region.
A second version,
v1 expands the API to have both
region and
size.
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xdatabases.custom-api.example.org
spec:
group: custom-api.example.org
names:
kind: xDatabase
plural: xdatabases
versions:
- name: v1alpha1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
region:
type: string
- name: v1
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
region:
type: string
size:
type: string
Changing or expanding the XRD schema requires restarting the Crossplane pod to take effect.
Set composite resource defaults
XRDs can set default parameters for composite resources.