<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Platform-Engineering on vishctl</title><link>https://vishctl.dev/tags/platform-engineering/</link><description>Recent content in Platform-Engineering on vishctl</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 01 Nov 2026 09:00:00 +0800</lastBuildDate><atom:link href="https://vishctl.dev/tags/platform-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>vCluster: Virtualise Clusters, Not Machines</title><link>https://vishctl.dev/posts/what-is-vcluster-virtual-kubernetes-clusters/</link><pubDate>Sun, 01 Nov 2026 09:00:00 +0800</pubDate><guid>https://vishctl.dev/posts/what-is-vcluster-virtual-kubernetes-clusters/</guid><category>kubernetes</category><category>vcluster</category><category>multi-tenancy</category><category>platform-engineering</category><description>vCluster gives every team or customer its own Kubernetes API, running as a pod in a shared cluster. Here is how the control plane, the syncer and the three node models fit together.</description><content:encoded><![CDATA[<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Namespace per tenant = cheap, but one shared API, one set of CRDs
</span></span><span class="line"><span class="cl">vCluster per tenant  = its own Kubernetes API, running as a pod
</span></span></code></pre></div><p>Every platform team hits the same question sooner or later: when a new team or customer arrives, do they get a namespace or a whole cluster?</p>
<p><strong>vCluster</strong> sits between those two options. This post explains what it is and how the pieces work. A <a href="https://vishctl.dev/posts/vcluster-private-nodes-auto-nodes-bare-metal/">second post</a> covers private nodes and bare-metal servers, and a <a href="https://vishctl.dev/posts/vcluster-bare-metal-gpu-tenant-metal3/">third one</a> walks through a lab I built where a tenant gets real (simulated) servers by itself.</p>
<h2 id="the-problem-namespaces-are-not-clusters">The problem: namespaces are not clusters</h2>
<p>Namespaces are great for grouping. They are a weak boundary for tenants.</p>
<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col">Need of a tenant</th>
            <th scope="col">With a namespace</th>
            <th scope="col">Why it hurts</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Install an operator with its own CRDs</td>
            <td>CRDs are cluster-scoped</td>
            <td>Two tenants want different versions of the same CRD</td>
        </tr>
        <tr>
            <td>Be admin of &ldquo;their&rdquo; cluster</td>
            <td>Only namespace-level RBAC</td>
            <td>They cannot create ClusterRoles, webhooks or namespaces</td>
        </tr>
        <tr>
            <td>Pick a Kubernetes version</td>
            <td>Everyone shares one</td>
            <td>One team blocks everyone&rsquo;s upgrade</td>
        </tr>
        <tr>
            <td>Not be slowed down by others</td>
            <td>One API server and etcd</td>
            <td>A noisy controller in one namespace slows every tenant</td>
        </tr>
    </tbody>
  </table>
</div>
<p>The usual answer is a separate cluster per tenant. That isolates well, but each cluster has its own servers, its own upgrades and its own monitoring. Ten tenants become ten clusters to run.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart TD
    subgraph NS["Namespace per tenant"]
        direction LR
        N1["Team A ns"] n1@--> NAPI["One shared<br/>API server and etcd"]
        N2["Team B ns"] n2@--> NAPI
        N3["Team C ns"] n3@--> NAPI
    end
    subgraph CL["Cluster per tenant"]
        direction LR
        C1["Cluster A<br/>own servers"]
        C2["Cluster B<br/>own servers"]
        C3["Cluster C<br/>own servers"]
        C1 ~~~ C2
        C2 ~~~ C3
    end
    subgraph VC["vCluster per tenant"]
        direction LR
        V1["API A"] v1@--> VH["One host cluster<br/>one fleet"]
        V2["API B"] v2@--> VH
        V3["API C"] v3@--> VH
    end
    NS ~~~ CL
    CL ~~~ VC
    n1@{ animate: true }
    n2@{ animate: true }
    n3@{ animate: true }
    v1@{ animate: true }
    v2@{ animate: true }
    v3@{ animate: true }
    classDef input fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef warn fill:#302410,stroke:#fbbf24,color:#fff3cf,stroke-width:2px;
    classDef cp fill:#281d48,stroke:#a78bfa,color:#f1edff,stroke-width:2px;
    classDef gpu fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    class N1,N2,N3 input;
    class NAPI,C1,C2,C3 warn;
    class V1,V2,V3 cp;
    class VH gpu;</div>
  <figcaption>Three ways to host three tenants. vCluster keeps one fleet but gives each tenant its own API.</figcaption>
</figure>

<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col"></th>
            <th scope="col">Namespace</th>
            <th scope="col">Cluster</th>
            <th scope="col">vCluster</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Own API server and CRDs</td>
            <td>No</td>
            <td>Yes</td>
            <td>Yes</td>
        </tr>
        <tr>
            <td>Tenant can be cluster-admin</td>
            <td>No</td>
            <td>Yes</td>
            <td>Yes</td>
        </tr>
        <tr>
            <td>Time to create</td>
            <td>Seconds</td>
            <td>Many minutes</td>
            <td>Seconds</td>
        </tr>
        <tr>
            <td>Servers to run</td>
            <td>Shared</td>
            <td>Per tenant</td>
            <td>Shared, or per tenant if you want</td>
        </tr>
        <tr>
            <td>Upgrades to run</td>
            <td>One</td>
            <td>One per tenant</td>
            <td>Host once, tenants on their own schedule</td>
        </tr>
    </tbody>
  </table>
</div>
<h2 id="what-vcluster-is">What vCluster is</h2>
<p>A <strong>virtual cluster</strong> (the docs now also say <strong>tenant cluster</strong>) is a full Kubernetes control plane: an API server, a controller manager and a datastore. The trick is where it runs. It runs as a pod (a StatefulSet) inside a namespace of an ordinary Kubernetes cluster.</p>
<p>That ordinary cluster is the <strong>host cluster</strong>. The vCluster docs call it the <strong>Control Plane Cluster</strong> when you design for production.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart TD
    subgraph HOST["Host cluster"]
        direction LR
        subgraph NSA["Namespace team-a"]
            CPA["vCluster pod<br/>API server, controllers<br/>datastore, syncer"]
        end
        subgraph NSB["Namespace team-b"]
            CPB["vCluster pod<br/>API server, controllers<br/>datastore, syncer"]
        end
    end
    UA["Team A<br/>kubectl"] e1@--> CPA
    UB["Team B<br/>kubectl"] e2@--> CPB
    e1@{ animate: true }
    e2@{ animate: true }
    classDef input fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef cp fill:#281d48,stroke:#a78bfa,color:#f1edff,stroke-width:2px;
    class UA,UB input;
    class CPA,CPB cp;</div>
  <figcaption>Each tenant gets its own API server and datastore, packed into one pod in its own host namespace.</figcaption>
</figure>

<p>To the tenant, it looks like any cluster. They get a kubeconfig, they are cluster-admin, they can create namespaces, install CRDs and run Helm charts. To the platform team, it is one more pod to look after.</p>
<h2 id="what-is-inside-the-vcluster-pod">What is inside the vCluster pod</h2>
<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col">Piece</th>
            <th scope="col">Job</th>
            <th scope="col">Example</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>API server</td>
            <td>The tenant&rsquo;s own Kubernetes API</td>
            <td><code>kubectl get ns</code> shows the tenant&rsquo;s namespaces only</td>
        </tr>
        <tr>
            <td>Controller manager</td>
            <td>Runs the normal controllers for tenant objects</td>
            <td>A Deployment creates a ReplicaSet and Pods</td>
        </tr>
        <tr>
            <td>Backing store</td>
            <td>Where the tenant&rsquo;s objects are saved</td>
            <td>Embedded SQLite (default), embedded etcd, external etcd, or an external database</td>
        </tr>
        <tr>
            <td>Syncer</td>
            <td>Copies the objects that need real compute to the host</td>
            <td>A tenant Pod becomes a real Pod in the host namespace</td>
        </tr>
    </tbody>
  </table>
</div>
<p>There is usually no separate scheduler. With the default setup, the host cluster&rsquo;s scheduler places the pods.</p>
<p>The backing store choice matters for production. Embedded SQLite is fine for a dev cluster. For a tenant you care about, embedded etcd or an external database gives you something you can back up and restore with confidence.</p>
<h2 id="the-syncer-how-a-pod-in-a-virtual-cluster-actually-runs">The syncer: how a pod in a virtual cluster actually runs</h2>
<p>A virtual cluster has no nodes of its own in the default setup. So where do its pods run?</p>
<p>The <strong>syncer</strong> watches the tenant API. When the tenant creates a Pod, the syncer creates a matching Pod in the host namespace, with a rewritten name. The host scheduler places it on a host node. The syncer then copies the status back, so the tenant sees <code>Running</code>.</p>
<figure class="mermaid-figure">
  <div class="mermaid">sequenceDiagram
    participant T as Tenant kubectl
    participant V as Tenant API server
    participant S as Syncer
    participant H as Host API server
    participant N as Host node
    T->>V: create Deployment web
    V->>V: controllers create ReplicaSet and Pod
    S->>V: watch Pods
    S->>H: create Pod web-x-default-x-team-a
    H->>N: host scheduler places the Pod
    N-->>H: Pod Running
    S-->>V: copy status back
    V-->>T: web is Running</div>
  <figcaption>Only low-level objects cross to the host. Deployments, CRDs and RBAC stay inside the tenant API.</figcaption>
</figure>

<p>Here is the same flow as a walkthrough:</p>
<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col">Step</th>
            <th scope="col">Tenant sees</th>
            <th scope="col">Host sees</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1</td>
            <td><code>kubectl create deployment web</code></td>
            <td>Nothing yet</td>
        </tr>
        <tr>
            <td>2</td>
            <td>Deployment, ReplicaSet and Pod in namespace <code>default</code></td>
            <td>Nothing yet: those live in the tenant datastore</td>
        </tr>
        <tr>
            <td>3</td>
            <td>Pod <code>Pending</code></td>
            <td>A Pod with a name like <code>web-...-x-default-x-team-a</code> in namespace <code>team-a</code></td>
        </tr>
        <tr>
            <td>4</td>
            <td>Pod <code>Running</code> on a node</td>
            <td>The same Pod <code>Running</code> on a real host node</td>
        </tr>
    </tbody>
  </table>
</div>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart TD
    subgraph STAY["Tenant only"]
        direction LR
        A1["Deployments<br/>StatefulSets"]
        A2["CRDs and<br/>custom resources"]
        A3["RBAC<br/>ClusterRoles"]
        A4["Namespaces"]
        A1 ~~~ A2
        A2 ~~~ A3
        A3 ~~~ A4
    end
    subgraph SYNC["Synced to host"]
        direction LR
        B1["Pods"]
        B2["Services<br/>Endpoints"]
        B3["ConfigMaps<br/>Secrets in use"]
        B4["PVCs"]
        B1 ~~~ B2
        B2 ~~~ B3
        B3 ~~~ B4
    end
    STAY ~~~ SYNC
    classDef cp fill:#281d48,stroke:#a78bfa,color:#f1edff,stroke-width:2px;
    classDef gpu fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    class A1,A2,A3,A4 cp;
    class B1,B2,B3,B4 gpu;</div>
  <figcaption>What stays inside the tenant API, and what the syncer copies down to the host namespace.</figcaption>
</figure>

<p>The tenant&rsquo;s Deployment never exists on the host. Only the Pod (plus the Services, ConfigMaps and Secrets it needs) is copied down. That is why tenants can run their own CRDs and controllers without the host knowing about them.</p>
<h2 id="three-ways-to-give-a-tenant-compute">Three ways to give a tenant compute</h2>
<p>The control plane is always the tenant&rsquo;s own. What changes is where the tenant&rsquo;s pods run. vCluster has three node models.</p>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart TD
    subgraph SH["Shared nodes"]
        direction LR
        S1["Tenant pods"] s1@--> S2["Synced to host"]
        S2 s2@--> S3["Any host node"]
    end
    subgraph DE["Dedicated nodes"]
        direction LR
        D1["Tenant pods"] d1@--> D2["Synced to host"]
        D2 d2@--> D3["Host nodes reserved<br/>for this tenant"]
    end
    subgraph PR["Private nodes"]
        direction LR
        P1["Tenant pods"] p1@--> P3["Machines joined to<br/>the tenant API"]
    end
    SH ~~~ DE
    DE ~~~ PR
    s1@{ animate: true }
    s2@{ animate: true }
    d1@{ animate: true }
    d2@{ animate: true }
    p1@{ animate: true }
    classDef input fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef warn fill:#302410,stroke:#fbbf24,color:#fff3cf,stroke-width:2px;
    classDef gpu fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    class S1,D1,P1 input;
    class S2,D2 warn;
    class S3,D3,P3 gpu;</div>
  <figcaption>Top to bottom: more isolation, less sharing. The control plane is dedicated in all three.</figcaption>
</figure>

<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col">Model</th>
            <th scope="col">Where pods run</th>
            <th scope="col">What is shared</th>
            <th scope="col">Good for</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><strong>Shared nodes</strong></td>
            <td>Any host node, next to other tenants&rsquo; pods</td>
            <td>Nodes, kernel, CNI, storage</td>
            <td>Dev environments, CI, internal teams you trust</td>
        </tr>
        <tr>
            <td><strong>Dedicated nodes</strong></td>
            <td>Host nodes picked by a node selector for this tenant</td>
            <td>Host CNI and storage, host control plane</td>
            <td>Internal teams that want their own machines</td>
        </tr>
        <tr>
            <td><strong>Private nodes</strong></td>
            <td>Machines that join the tenant API directly, with their own kubelet, CNI and CSI</td>
            <td>Nothing at the node level</td>
            <td>External customers, GPU servers, anything untrusted</td>
        </tr>
    </tbody>
  </table>
</div>
<p>With <strong>private nodes</strong> there is no syncing at all. The machine joins the tenant&rsquo;s control plane with a join token, the same way a worker joins a kubeadm cluster. The tenant&rsquo;s own scheduler places pods on it. The host cluster only runs the control plane pod.</p>
<p>The vCluster docs are direct about the first model: shared nodes are not a security boundary for untrusted tenants. If a container escapes, it lands on a node that other tenants also use. For that case there is <strong>vNode</strong>, a runtime sandbox for pods on shared nodes. For whole-machine tenants, private nodes are the cleaner answer.</p>
<h2 id="where-the-control-plane-itself-can-live">Where the control plane itself can live</h2>
<p>There is one more option: <strong>vCluster Standalone</strong>. It runs the control plane straight on machines as a binary under systemd, with no host cluster underneath. It is how you bootstrap the very first cluster on bare metal, and with three control plane machines it can run in HA.</p>
<p>I saw this first-hand in my lab. The host cluster there was <strong>vind</strong> (vCluster in Docker), and <code>kubectl get pods -n kube-system</code> showed no API server pod at all. Inside the container, <code>ps</code> showed the reason:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/var/lib/vcluster/bin/vcluster start --config /etc/vcluster/vcluster.yaml
</span></span><span class="line"><span class="cl">/var/lib/vcluster/bin/kine --endpoint=sqlite:///var/lib/vcluster/state.db?...
</span></span><span class="line"><span class="cl">/var/lib/vcluster/bin/kube-apiserver --service-cluster-ip-range=10.96.0.0/12 ...
</span></span><span class="line"><span class="cl">/var/lib/vcluster/bin/kube-scheduler ...
</span></span><span class="line"><span class="cl">/var/lib/vcluster/bin/kube-controller-manager ...
</span></span></code></pre></div><p>The control plane was plain processes supervised by systemd, with <code>kine</code> and SQLite as the datastore. A control plane that is just &ldquo;a binary and a datastore&rdquo; can run in a pod, a container, a VM or on a server.</p>
<h2 id="vcluster-vs-vcluster-platform">vCluster vs vCluster Platform</h2>
<p>Two names come up a lot, and they are different things.</p>
<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col"></th>
            <th scope="col">vCluster (open source)</th>
            <th scope="col">vCluster Platform</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>What</td>
            <td>The virtual cluster itself and the <code>vcluster</code> CLI</td>
            <td>A management layer with UI and API for many virtual clusters</td>
        </tr>
        <tr>
            <td>You get</td>
            <td><code>vcluster create</code>, <code>vcluster connect</code>, shared and dedicated nodes</td>
            <td>Projects, templates, quotas, SSO, sleep mode, private nodes with Auto Nodes</td>
        </tr>
        <tr>
            <td>Tenant object</td>
            <td>A Helm release</td>
            <td>A <code>VirtualClusterInstance</code> (<code>management.loft.sh</code>)</td>
        </tr>
    </tbody>
  </table>
</div>
<p>If you want a few virtual clusters for your own teams, the CLI is enough. If you are building a product where customers order clusters, the Platform is the piece that turns &ldquo;create a cluster&rdquo; into an API call with quotas and node provisioning behind it.</p>
<h2 id="try-it">Try it</h2>
<p>You need a Kubernetes cluster to act as the host (kind, minikube or Docker Desktop work) and the <a href="https://www.vcluster.com/docs/vcluster/">vcluster CLI</a>. Then:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># create a virtual cluster in namespace team-a and switch kubectl to it</span>
</span></span><span class="line"><span class="cl">vcluster create team-a --namespace team-a
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># inside the virtual cluster: you are cluster-admin</span>
</span></span><span class="line"><span class="cl">kubectl create namespace web
</span></span><span class="line"><span class="cl">kubectl create deployment nginx --image<span class="o">=</span>nginx -n web
</span></span><span class="line"><span class="cl">kubectl get pods -n web
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># back to the host context</span>
</span></span><span class="line"><span class="cl">vcluster disconnect
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># on the host: no &#34;web&#34; namespace, just the vCluster pod and the synced nginx pod</span>
</span></span><span class="line"><span class="cl">kubectl get pods -n team-a
</span></span></code></pre></div><p>Two things to notice in the last command. The tenant&rsquo;s <code>web</code> namespace does not exist on the host. The nginx pod does, with the tenant namespace and the vCluster name folded into its name.</p>
<p>Clean up with:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">vcluster delete team-a --namespace team-a
</span></span></code></pre></div><h2 id="when-i-would-use-it">When I would use it</h2>
<div class="table-scroll">
  <table>
    <thead>
        <tr>
            <th scope="col">Situation</th>
            <th scope="col">My pick</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Ten internal teams, trusted, want CRDs and admin rights</td>
            <td>vCluster on shared nodes</td>
        </tr>
        <tr>
            <td>Ephemeral cluster per pull request or CI run</td>
            <td>vCluster on shared nodes, deleted after the run</td>
        </tr>
        <tr>
            <td>Teams that need their own machines but share a network</td>
            <td>Dedicated nodes</td>
        </tr>
        <tr>
            <td>External customers, GPU servers, compliance</td>
            <td>Private nodes, ideally with Auto Nodes</td>
        </tr>
        <tr>
            <td>One cluster, one team</td>
            <td>Nothing: plain namespaces are fine</td>
        </tr>
    </tbody>
  </table>
</div>
<figure class="mermaid-figure">
  <div class="mermaid">flowchart TD
    Q1["Does the tenant need<br/>its own API, CRDs, admin?"] -->|No| R1["Namespace"]
    Q1 -->|Yes| Q2["Is the tenant trusted?<br/>internal team, CI"]
    Q2 -->|Yes| R2["vCluster<br/>shared nodes"]
    Q2 -->|Mostly| Q3["Needs its own<br/>machines?"]
    Q3 -->|No| R3["Shared nodes<br/>plus vNode"]
    Q3 -->|Yes| R4["Dedicated nodes"]
    Q2 -->|No, external| R5["Private nodes<br/>with Auto Nodes"]
    classDef input fill:#13264a,stroke:#38bdf8,color:#e6f6ff,stroke-width:2px;
    classDef gpu fill:#173f59,stroke:#22d3ee,color:#ecfeff,stroke-width:2px;
    classDef idle fill:#101e27,stroke:#324950,color:#8aa0a8;
    class Q1,Q2,Q3 input;
    class R2,R3,R4,R5 gpu;
    class R1 idle;</div>
  <figcaption>The decision I walk through for a new tenant.</figcaption>
</figure>

<p>The question I ask is: <strong>does the tenant need to own the Kubernetes API, or just a corner of it?</strong> If they need to own it, vCluster gives them that without giving each of them a separate fleet of servers to run.</p>
<h2 id="cheat-sheet">Cheat sheet</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Virtual / tenant cluster = a full Kubernetes control plane that runs as a pod in a host namespace
</span></span><span class="line"><span class="cl">Host cluster             = the ordinary cluster that runs the tenant control plane pods
</span></span><span class="line"><span class="cl">Control Plane Cluster    = the production name for the host cluster
</span></span><span class="line"><span class="cl">Backing store            = where tenant objects live: SQLite, etcd, or an external database
</span></span><span class="line"><span class="cl">Syncer                   = copies tenant pods (and what they need) to the host so they can run
</span></span><span class="line"><span class="cl">Shared nodes             = tenant pods run on host nodes next to other tenants
</span></span><span class="line"><span class="cl">Dedicated nodes          = tenant pods still synced, but pinned to host nodes reserved for them
</span></span><span class="line"><span class="cl">Private nodes            = machines join the tenant API directly; nothing is synced to the host
</span></span><span class="line"><span class="cl">vNode                    = a runtime sandbox for tenant pods on shared nodes
</span></span><span class="line"><span class="cl">vCluster Standalone      = the control plane as a binary on machines, with no host cluster
</span></span><span class="line"><span class="cl">vind                     = vCluster in Docker: a whole cluster in one container
</span></span><span class="line"><span class="cl">vCluster Platform        = UI and API to manage many tenants, with Auto Nodes and quotas
</span></span></code></pre></div><p>Next: <a href="https://vishctl.dev/posts/vcluster-private-nodes-auto-nodes-bare-metal/">private nodes, Auto Nodes and bare metal</a>. Related: <a href="https://vishctl.dev/posts/karmada-kubernetes-multi-cluster/">Karmada, for placing workloads across clusters</a>.</p>
]]></content:encoded></item></channel></rss>