---
title: What's Crossplane?
weight: 3
description: Learn what Crossplane is and why you'd use it.
---
Crossplane is a control plane framework for platform engineering.
**Crossplane lets you build control planes to manage your cloud native software.**
It lets you design the APIs and abstractions that your users use to interact
with your control planes.
{{< hint "tip" >}}
**A control plane is software that controls other software.**
Control planes are a core cloud native pattern. The major cloud providers are
all built using control planes.
Control planes expose an API. You use the API to tell the control plane what
software it should configure and how - this is your _desired state_.
A control plane can configure any cloud native software. It could deploy an app,
create a load balancer, or create a GitHub repository.
The control plane configures your software, then monitors it throughout its
lifecycle. If your software ever _drifts_ from your desired state, the control
plane automatically corrects the drift.
{{< /hint >}}
Crossplane has a rich ecosystem of extensions that make building a control plane
faster and easier. It's built on Kubernetes, so it works with all the Kubernetes
tools you already use.
**Crossplane's key value is that it unlocks the benefits of building your own
Kubernetes custom resources without having to write controllers for them.**
Not familiar with Kubernetes custom resources and controllers?
[This DevOps Toolkit video](https://www.youtube.com/watch?v=aM2Y9m2Kazk) has a
great explanation.
{{}}
Kubebuilder is a popular project for building Kubernetes controllers. Look at
the [Kubebuilder documentation](https://book.kubebuilder.io) to see what's
involved in writing a controller.
{{}}
## Crossplane components
Crossplane has four major components:
* [Composition](#composition)
* [Managed resources](#managed-resources)
* [Operations](#operations)
* [Package manager](#package-manager)
You can use all four components to build your control plane, or pick only the
ones you need.
### Composition
Composition lets you build custom APIs to control your cloud native software.
Crossplane extends Kubernetes. You build your custom APIs by using Crossplane to
extend Kubernetes with new custom resources.
**To extend Kubernetes without using Crossplane you need a Kubernetes
controller.** The controller is the software that reacts when a user calls the
custom resource API.
Say you want your control plane to serve an `App` custom resource API. When
someone creates an `App`, the control plane should create a Kubernetes
`Deployment` and a `Service`.
**If there's not already a controller that does what you want - and exposes the
API you want - you have to write the controller yourself.**
```mermaid
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
controller[Your App Controller]
deployment(Deployment API)
service(Service API)
end
user -- create --> api
controller watch@<-- watch --> api
controller -- create --> deployment
controller -- create --> service
watch@{animate: true}
```
**With Crossplane you don't have to write a controller**. Instead you configure
a pipeline of functions. The functions return declarative configuration that
Crossplane should apply.
```mermaid
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
subgraph crossplane [Composition Engine]
fn(Python Function)
end
deployment(Deployment API)
service(Service API)
end
user -- create --> api
crossplane watch@<-- watch --> api
crossplane -- create --> deployment
crossplane -- create --> service
watch@{animate: true}
```
With Composition you avoid writing and maintaining complex controller code
that's hard to get right. Instead you focus on expressing your business
logic, and work in your preferred language.
{{}}
Composition functions are like configuration language plugins.
Functions allow you to write your configuration in multiple languages, including
[YAML](https://yaml.org), [KCL](https://www.kcl-lang.io),
[Python](https://python.org), and [Go](https://go.dev).
{{}}
You can use composition together with [managed resources](#managed-resources) to
build new custom resource APIs powered by managed resources.
Follow [Get Started with Composition]({{[}})
to see how composition works.
### Managed resources
Managed resources (MRs) are ready-made Kubernetes custom resources.
Each MR extends Kubernetes with the ability to manage a new system. For example
there's an RDS instance MR that extends Kubernetes with the ability to manage
[AWS RDS](https://aws.amazon.com/rds/) instances.
Crossplane has an extensive library of managed resources you can use to manage
almost any cloud provider, or cloud native software.
**With Crossplane you don't have to write a controller if you want to manage
something outside of your Kubernetes cluster using a custom resource.** There's
already a Crossplane managed resource for that.
```mermaid
flowchart TD
user(User)
subgraph control [Control Plane]
instance(RDS Instance API)
controller(Managed Resource Controller)
end
subgraph aws [Amazon Web Services]
rds(RDS Instance)
end
user -- create --> instance
controller watch-rds@<-- watch --> instance
controller -- create --> rds
watch-rds@{animate: true}
```
You can use managed resources together with [composition](#composition) to build
new custom resource APIs powered by MRs.
```mermaid
flowchart TD
user(User)
subgraph control [Control Plane]
api(App API)
subgraph crossplane [Composition Engine]
fn(Python Function)
end
deployment(Deployment API)
service(Service API)
instance(RDS Instance API)
controller(Managed Resource Controller)
end
subgraph aws [Amazon Web Services]
rds(RDS Instance)
end
user -- create --> api
crossplane watch-apps@<-- watch --> api
crossplane -- create --> deployment
crossplane -- create --> service
crossplane -- create --> instance
controller watch-rds@<-- watch --> instance
controller -- create --> rds
watch-apps@{animate: true}
watch-rds@{animate: true}
```
Follow [Get Started with Managed Resources]({{][}})
to see how managed resources work.
### Operations
Operations let you run operational tasks using function pipelines.
While composition and managed resources focus on creating and managing
infrastructure, operations handle tasks that don't fit the typical resource
creation pattern - like certificate monitoring, rolling upgrades, or scheduled
maintenance.
**Operations run function pipelines to completion like a Kubernetes Job.**
Instead of continuously managing resources, they perform specific tasks and
report the results.
Say you want your control plane to watch SSL certificates on Kubernetes
`Ingress` resources. When someone creates an Operation, the control plane
should check the certificate and annotate the `Ingress` with expiry information.
```mermaid
flowchart TD
user(User)
subgraph control [Control Plane]
operation(SSL Monitor Operation)
subgraph crossplane [Operation Engine]
fn(Python Function)
end
ingress(Ingress API)
end
subgraph ext [External System]
cert(SSL Certificate)
end
user -- create --> operation
crossplane watch@<-- watch --> operation
crossplane -- read --> ingress
crossplane -- check --> cert
crossplane -- annotate --> ingress
watch@{animate: true}
```
Operations support three modes:
* **Operation** - Run once to completion
* **CronOperation** - Run on a scheduled basis
* **WatchOperation** - Run when resources change
You can use operations alongside composition and managed resources to build
complete operational workflows for your control plane.
Follow [Get Started with Operations]({{][}})
to see how operations work.
{{}}
Operations are an alpha feature available in Crossplane v2.
{{}}
### Package manager
The Crossplane package manager lets you install new managed resources and
composition functions.
You can also package any part of a control plane's configuration and install it
using the package manager. This allows you to deploy multiple control planes with
identical capabilities - for example one control plane per region or per
service.
Read about Crossplane [packages]({{][}})
to learn about the package manager.]