Crossplane allows engineers to write Kubernetes controllers without writing controllers (eg: via YAML). Most of the time it works well, but sometimes custom Golang is required so teams can implement a custom provider, which is what controls resources (eg: an instance of a bucket).
It is very similar to Kubernetes controllers development using kubebuilder, but different in many ways. I wrote all my learnings into this blog post which hopefully clarifies how they work, how to implement one and good practices around it.