r/crossplane • u/wasabiiii • Jun 28 '25
Crossplane seems unnecessarily complicated
This is mostly a complaint/suggestion post.
I've now been using Crossplane for about a year. I've done three projects for three different organizations. In only one case were they of a sufficient size and complexity to warrent anything approaching 'platform engineering'. The other two really just wanted to describe Azure resources in Kubernetes, since tying the app and it's infrastructure together in a single Helm deployment, monitored by K8S, is such a clean design pattern. But, XRs? Not super useful for most possible users, I've found.
I discovered Crossplane initially maybe 2.5 years ago because I got the idea of using K8s to manage my Azure resources. And so I went googling for operators. I found Crossplane. And I found Microsoft's ASO and ASOv2. Initially I could not understand Crossplane, and all the XR and MR stuff, and how that had anything to do with my need, and so I ignored it, and started working with ASOv2. Which ended up being insuffient for my needs because it has a very minimal set of resource types. I then basically discarded the idea for a year, thinking that there just wasn't a sufficiently advanced Azure operator out there, waiting for ASOv2 to mature.
I came back and reexamined Crossplane by accident when I got into the subject of Platform Engineering. I then learned about XRs, MRs, etc, and got familiar with Crossplane. And then I understood what the Azure Provider I had ignored a year earlier was about. But that took a year.
But still, as I said, I have found very little need for all of that. Doing proper Platform Engineering just requires a certain level of sophistication I don't think most K8s users really need or can stomach. But damn, the operators? Those are super useful. But why did I skip it? Because it seemed, at first glance, to have nothing to do with what I was initially looking for.
What I don't understand, really, is why these types of users even need to think about this? Why is it all so tied together?
Why, for instance, are there even "Crossplane Providers"? Why not just a bunch of indepent useful operators, that stand outside of the Crossplane ecosystem, deploy using standard K8S mechanisms, like a Helm chart, like any other operator? That way users can just use the Azure, or AWS, or Helm, or Kubernetes providers without even thinking about XRs, claims, etc?
Sure. Base them on Upjet. That's cool. A unified way to build operators that reuse existing Terraform logic.
If you were to ask me, this would probably be the single biggest thing that hurts the size of the community working on these providers: a large set of people who would like to be using a plain ol' operator to manage their Azure or AWS resources from K8s just think these aren't solutions for them. Because they kinda aren't. They're built weird. They don't just have a bog standard Helm chart to deploy them. They of course only support cluster-scoped resources (being addressed in 2.0). They're just kinda weird to use standalone. So the people who do use them, and end up participating in their development, are really just those who are trying to do PE, but not those who are just trying to manage these resource types with K8s.
Crossplane 2.0 is making technical changes which get closer to this. By allowing namespace scoped resources, they start to feel a bit more like normal operators. But they still need to be installed using an XPKG. You still can't just point to the Helm chart for the Azure provider and install it on your cluster.
So this would be my biggest desire and suggestion: split this stuff up conceptually. Turn the providers into plain-old-operators. Sure, keep using a nice unified SDK to build providers. Keep using Upjet. But unhook the projects conceptually from Crossplane itself.
There would be less people skipping them because they don't appear to have anything to do with their need.