Yeah, vCluster is a way to virtualize Kubernetes. It's a central piece of our product stack. We're really working to virtualize the entire cloud native stack. vCluster is really the central piece when you map out the stack, you know, like when you look at the CNCF landscape or any AWS architecture diagram, right? You have at the bottom, infra and provisioning. You have in the middle orchestration, which is things like Kubernetes, but also things like service mesh to orchestrate your network. And then you have things on the top that are, you know, application definition, application development, your CIA, your registry, your developer tooling, those kinds of things… your packagers like Helm, right?
We started in the middle because we saw a lot of inefficiency in Kubernetes. When you think of the early days of Kubernetes, it was always how big can the cluster get, right? Like the scheduler was the important piece. Go back to a Kubernetes blog and you’ll see blog posts about Kubernetes scheduler can now handle 500 nodes, now it can handle a thousand. It was like, how big can the cluster get?
Kubernetes really originated from this idea of we're getting rid of these pet VMs and instead we're going to have containers dynamically allocated on this network of machines. Kubernetes is the orchestrator.
Most enterprises today are not set up that way. Instead, they have 500 little three-node, five-node Kubernetes cluster. And we looked at this and we're kind of like, “Why?” You’re really not getting the benefits of Kubernetes because instead of having these pet VMs, you now have these pet clusters and they consist of three VMs. So you three-x’d the problem, right? Rather than actually building the solution that Kubernetes was supposed to be.
So we set out to solve that problem and dug into why people are not sharing clusters. Why is multi-tenancy not a thing? And it turns out it's really hard to make multi-tenancy really work in Kubernetes. And vCluster, you know, is a virtualization layer that really helps you achieve this. Sometimes when I tell people, you need virtualization for Kubernetes, folks are like, “But doesn't Kubernetes already have users and permissions, RBAC, namespaces, right? Isn't it possible to share a cluster? I don't think anybody who asked that question has ever tried, to be honest.
When you look at a Linux host, it also has users and permissions and folders, right? But sharing Linux host without virtualization is equally hard. So why would sharing a Kubernetes cluster be any easier only because you have r-vik, right? It's actually really, really tough if you're trying to make it work.
Yeah, it does. Every vCluster is completely independent of the other vClusters running on the host. So we have what's called a vCluster YAML. That's the config file that really makes up the configuration of that vCluster and how it behaves. So you could spin up, you know, a hundred vClusters, which all use the central, you know, CRD syncing with your central cert manager. And then you can spin up a vCluster that has that sync disabled. And on that one, you can just deploy your own cert manager.
Actually, the scenario that you just outlined of a platform team wanting to test certain things is something we've seen very commonly. People are like, “Okay, we want to test against different versions of Kubernetes because… you know, let's say you have a hundred vClusters, there’s a good chance, and that's actually one of the benefits that these vClusters run with different Kubernetes versions. And it's independent of the host cluster. The only thing they have to agree on obviously is what is a pod. So the pod resource needs to be pretty standardized, but it pretty much is in Kubernetes, to be honest.
I mean, we may be adding some fields in Kubernetes from time to time. I remember ephemeral containers was added at some point, right? I think it was like two years back or so. And when that happens and you have a vCluster with a newer version and you're using that particular field… ephemeral containers are part of the pod spec… then it's going to tell you, “Hey, your host cluster doesn't support that. You can't do that.” But other than that, it's pretty flexible. Unless you actually use… you could even have a newer version that supports that field… but as long as you're not using it, you're good. But once you start using that feature, obviously your underlying cluster needs to support that feature if it comes to these container-level specifications. But that's a very, very minimal constraint. Other than that, all your CODs, your namespaces… you can even have, you know, RBAC in the host cluster and, you know, things like OPA running in the host cluster, restricting privilege containers. But you have another OPA running inside the vCluster, adding an additional layer. Like the admission control loop is going to happen twice. First on the virtual level and then on the real level for these pods. It's really fascinating what's possible with Vcluster.
Most of the time this is championed by the platform teams because they're in charge of handing out infrastructure and enabling the engineering teams across the org. They have a lot of control over the AWS account, etcetera. So it's the right spot for us to be in.
They are usually in this unfortunate situation. Either they have to hand out a bunch of different little clusters… which is going to hit everybody's budgets and in some organizations, you still have to get budget approvals for this, et cetera, because a Kubernetes cluster isn't necessarily something really cheap.
They really can't be too free in handing out Kubernetes to everyone. Maybe a team says, we need four clusters because we want to work on different things in parallel or we want to split things up. It's really, tough because they have to essentially say no a lot of the times.
The alternative is to create namespace-based offerings. And that one, they can be much more freely in terms of like, “Hey, everybody can get 20 namespaces.” Namespace doesn't cost anything. But then you have all these constraints that limit folks. And then they come to you again as a platform team and they say like, “Hey, we would actually need this Kubernetes version.” or “We would love to have this operator running. Can you deploy this for us?” And the platform team is kind of like, “Ehh, we're responsible for it.” Or in the worst case, they're like, “Oh, we already have something running.” That's the wrong version, right? And, as we all know, there's only one version of a controller and one COD version that can run in the same cluster. So you really have to say no a lot in these cases as well.
We help platforms teams say yes a lot more. They say, “Okay, yes, you can have a cluster, but it's a virtual one.” And ideally, you know, the teams don't even realize that that didn't get an EKS or GKE cluster, instead they just got a virtual cluster.
Honestly, this may be a controversial take in the CNCF open-source community, right? Like I'm a big proponent of open source, but I think sometimes teams have this, “100%. We’ve got to build everything and everything needs to be open source” kind of rule almost baked in. Whether it's like in an individual's head or whether it's even like a company type policy, right? Sometimes it's better to go with, “Hey, this commercial offering actually would get us there faster and would get us to a full-blown solution quicker.” So you may want to consider that, right?
I think platform engineering, obviously… I'm always saying like the platform builders, they want to build things. It's kind of their job to build these platforms, to run these platforms, right? But that doesn't mean they need to do everything from the ground up. You don't need to reinvent the wheel on everything.
So I think that's one of the things I would strongly consider – like a non-open-source route is not necessarily per se a bad route, right?
For example, like one of the reasons we,make vClusters so… like we always think about what is the path backwards for folks as well. We want to take that burden away from them to think about, “Oh, this is going to lock us in.” I think products need to be designed that way because if the product is great, people will stay. There should not be an artificial way to lock somebody in.
We're trying to ease some of that concern by things like, “Okay, you can migrate these data stores” and things like that, right? And you can always say we're not going to run embedded etcd anymore, run by separate etcd. If you're deciding against it at some point.
That's some of the things that I've seen where, sometimes, a doctrine almost is a little bit in the way of getting to the actual target faster.